Why? edit
I was interested to compare the histogram of a reduced image with the histogram of the original image.How it does? edit
The proc counts the occurrence of each color component (RGB) for all of the image colors.Proc edit
namespace eval ::histo { namespace export histo package require Tk proc histo {image {cmd -display}} { # get options switch -glob -- $cmd { -dis* { set cmd -display } -exp* { set cmd -export } default { error "use\n\t[histo image ?-display|-export?" } } # get the image size set width [image width $image] set height [image height $image] if {$width * $height == 0} { error "bad image" } # count colors components for {set i 0} {$i < 256} {incr i} { foreach c {r g b} { set counts($c:$i) 0 } } set max 0 for {set y 0} {$y < $height} {incr y} { for {set x 0} {$x < $width} {incr x} { foreach {r g b} [$image get $x $y] break foreach c {r g b} { set n [incr counts($c:[set $c])] if {$max < $n} { set max $n } } } } if {$cmd == "-display"} { # display # compute the coef set coef [expr {256.0 / $max}] # create toplevel set t _$image toplevel .$t wm title .$t $image # draw the histogram set c .$t.c canvas $c -width [expr {256 * 3 + 40}] -height [expr {256 + 40}] set x0 9 set y0 267 $c create rectangle $x0 9 [incr x0 258] $y0 \ -outline black -fill white incr x0 8 $c create rectangle $x0 9 [incr x0 258] $y0 \ -outline black -fill white incr x0 8 $c create rectangle $x0 9 [incr x0 258] $y0 \ -outline black -fill white set y1 272 set x0 10 for {set i 0} {$i < 17} {incr i} { $c create line $x0 $y0 $x0 $y1 incr x0 16 } set x0 276 for {set i 0} {$i < 17} {incr i} { $c create line $x0 $y0 $x0 $y1 incr x0 16 } set x0 542 for {set i 0} {$i < 17} {incr i} { $c create line $x0 $y0 $x0 $y1 incr x0 16 } incr y0 -1 set xr 10 set xg 276 set xb 542 for {set i 0} {$i < 256} {incr i} { set yr [expr {10 + 256 - round($counts(r:$i) * $coef)}] set yg [expr {10 + 256 - round($counts(g:$i) * $coef)}] set yb [expr {10 + 256 - round($counts(b:$i) * $coef)}] $c create line $xr $y0 $xr $yr -fill red $c create line $xg $y0 $xg $yg -fill green $c create line $xb $y0 $xb $yb -fill blue incr xr; incr xg; incr xb } $c create text 10 276 -anchor nw \ -text "image: $image, max count: $max" pack $c } else { # export for {set i 0} {$i < 256} {incr i} { foreach c {r g b} { lappend list$c $counts($c:$i) } } return [list $listr $listg $listb] } } }
Demo edit
# example # ----------- # to download the image: # http://perso.wanadoo.fr/maurice.ulis/tcl/image1.png package require Tk package require Img wm withdraw . namespace import ::histo::histo histo [image create photo -file image1.png]
See also