86 lines
2.2 KiB
Plaintext
86 lines
2.2 KiB
Plaintext
import "dome" for Window
|
|
import "graphics" for Canvas, Color, ImageData
|
|
|
|
class ImageHistogram {
|
|
construct new(filename, filename2) {
|
|
_image = ImageData.load(filename)
|
|
Window.resize(_image.width, _image.height)
|
|
Canvas.resize(_image.width, _image.height)
|
|
Window.title = filename2
|
|
_image2 = ImageData.create("Grayscale", _image.width, _image.height)
|
|
_image3 = ImageData.create("B & W", _image.width, _image.height)
|
|
}
|
|
|
|
init() {
|
|
toGrayScale()
|
|
var h = histogram
|
|
var m = median(h)
|
|
toBlackAndWhite(m)
|
|
_image3.draw(0, 0)
|
|
_image3.saveToFile(Window.title)
|
|
}
|
|
|
|
luminance(c) { (0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b).floor }
|
|
|
|
toGrayScale() {
|
|
for (x in 0..._image.width) {
|
|
for (y in 0..._image.height) {
|
|
var c1 = _image.pget(x, y)
|
|
var lumin = luminance(c1)
|
|
var c2 = Color.rgb(lumin, lumin, lumin, c1.a)
|
|
_image2.pset(x, y, c2)
|
|
}
|
|
}
|
|
}
|
|
|
|
toBlackAndWhite(median) {
|
|
for (x in 0..._image2.width) {
|
|
for (y in 0..._image2.height) {
|
|
var c = _image2.pget(x, y)
|
|
var lum = luminance(c)
|
|
if (lum < median) {
|
|
_image3.pset(x, y, Color.black)
|
|
} else {
|
|
_image3.pset(x, y, Color.white)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
histogram {
|
|
var h = List.filled(256, 0)
|
|
for (x in 0..._image2.width) {
|
|
for (y in 0..._image2.height) {
|
|
var c = _image2.pget(x, y)
|
|
var lum = luminance(c)
|
|
h[lum] = h[lum] + 1
|
|
}
|
|
}
|
|
return h
|
|
}
|
|
|
|
median(h) {
|
|
var lSum = 0
|
|
var rSum = 0
|
|
var left = 0
|
|
var right = 255
|
|
while (true) {
|
|
if (lSum < rSum) {
|
|
lSum = lSum + h[left]
|
|
left = left + 1
|
|
} else {
|
|
rSum = rSum + h[right]
|
|
right = right - 1
|
|
}
|
|
if (left == right) break
|
|
}
|
|
return left
|
|
}
|
|
|
|
update() {}
|
|
|
|
draw(alpha) {}
|
|
}
|
|
|
|
var Game = ImageHistogram.new("Lenna100.jpg", "Lenna100_B&W.png")
|