proc medianfilter {image} { set w [image width $image] set h [image height $image] #-- read graylevels of image into list of lists matrix set data {} for {set i 0} {$i<$h} {incr i} { set row {} for {set j 0} {$j<$w} {incr j} { lappend row [lindex [$image get $j $i] 0] } lappend data $row } set res [image create photo -height $h -width $w] $res copy $image for {set i 1} {$i<$h-3} {incr i} { for {set j 1} {$j<$w-3} {incr j} { set pixels {} foreach k {-1 0 1} { set ik [expr {$i+$k}] foreach l {-1 0 1} { lappend pixels [lindex $data $ik [expr {$j+$l}]] } } set pix [lindex [lsort -integer $pixels] 4] if {$pix != [lindex $data $i $j]} { $res put [format \#%02x%02x%02x $pix $pix $pix] -to $j $i } } } set res }
Note also Median Filtering in Constant Time based on tracking partial histograms, and similar code on RosettaCode.
See Arts and crafts of Tcl-Tk programming