Compute color histograms of images
A histogram tells us the number of occurences of each value in our data. A histogram can be computed for each color channel of an image and can then be rendered into a graphical representation. A histogram allows us to see which values occur more often and which values are rare thus for example allowing us to determine whether an image has too much blue in it or is too dark, too bright and then correct this by adjusting the image to fit a better histogram.
proc hist(Image image, u32 channel) u32 begin u32 hist := new u32 ; There are 256 different values 0..255 for u32 y := 0 to image.height - 1 do for u32 x := 0 to image.width - 1 do hist[(x,y)][channel] += 1 ; hist[(x,y)] returns pixels at (x,y) which is (r,g,b) end end return hist end proc render(u32 hist) Image begin u32 m := maximum(hist) ; Compute the maximum value ; The most frequent value will have height 100 Graphics g = new Graphics(512, 100) ; 512x100 for u32 x := 0 to size(hist) do f64 p := f64(hist[x])/f64(m) u32 height := u32(p * 100) color clr := heatmap_color(p) ; Calculate the color for 0 < p < 1 ; If you don't know how to do this use any color you want. I'll cover ; interpolation of colors in another article later. g.rect((x*2, 100 - h), (x*2 + 2, 100), clr) ; Draw a 2px wide rectangle of height h end return g.image() end