53 lines
1.5 KiB
Nim
53 lines
1.5 KiB
Nim
import bitmap
|
|
import grayscale_image
|
|
|
|
type Histogram = array[Luminance, Natural]
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
|
|
func histogram*(img: GrayImage): Histogram =
|
|
## Build and return gray scale image histogram.
|
|
for lum in img.pixels:
|
|
inc result[lum]
|
|
|
|
#---------------------------------------------------------------------------------------------------
|
|
|
|
func median*(hist: Histogram): Luminance =
|
|
# Return the median luminance of a histogram.
|
|
var
|
|
inf = byte(0)
|
|
sup = Luminance.high
|
|
infCount, supCount = 0
|
|
|
|
while inf != sup:
|
|
if infCount < supCount:
|
|
inc infCount, hist[inf]
|
|
inc inf
|
|
else:
|
|
inc supCount, hist[sup]
|
|
dec sup
|
|
|
|
result = inf
|
|
|
|
#———————————————————————————————————————————————————————————————————————————————————————————————————
|
|
|
|
when isMainModule:
|
|
|
|
import ppm_read, ppm_write
|
|
|
|
# Read an image.
|
|
let image = readPPM("house.ppm")
|
|
|
|
# Build its histogram and find the median luminance.
|
|
let grayImage = image.toGrayImage
|
|
let hist = grayImage.histogram()
|
|
let m = hist.median()
|
|
echo "Median luminance: ", m
|
|
|
|
# Convert to black and white.
|
|
for pt in image.indices:
|
|
image[pt.x, pt.y] = if grayImage[pt.x, pt.y] < m: Black else: White
|
|
|
|
# Save image as a PPM file.
|
|
image.writePPM("house_bw.ppm")
|