134 lines
3.3 KiB
Python
134 lines
3.3 KiB
Python
# vim: set fileencoding=utf-8 :
|
|
import pytest
|
|
|
|
import pyvips
|
|
from helpers import JPEG_FILE
|
|
|
|
|
|
class TestHistogram:
|
|
def test_hist_cum(self):
|
|
im = pyvips.Image.identity()
|
|
|
|
sum = im.avg() * 256
|
|
|
|
cum = im.hist_cum()
|
|
|
|
p = cum(255, 0)
|
|
assert p[0] == sum
|
|
|
|
def test_hist_equal(self):
|
|
im = pyvips.Image.new_from_file(JPEG_FILE)
|
|
|
|
im2 = im.hist_equal()
|
|
|
|
assert im.width == im2.width
|
|
assert im.height == im2.height
|
|
|
|
assert im.avg() < im2.avg()
|
|
assert im.deviate() < im2.deviate()
|
|
|
|
def test_hist_ismonotonic(self):
|
|
im = pyvips.Image.identity()
|
|
assert im.hist_ismonotonic()
|
|
|
|
def test_hist_local(self):
|
|
im = pyvips.Image.new_from_file(JPEG_FILE)
|
|
|
|
im2 = im.hist_local(10, 10)
|
|
|
|
assert im.width == im2.width
|
|
assert im.height == im2.height
|
|
|
|
assert im.avg() < im2.avg()
|
|
assert im.deviate() < im2.deviate()
|
|
|
|
if pyvips.at_least_libvips(8, 5):
|
|
im3 = im.hist_local(10, 10, max_slope=3)
|
|
|
|
assert im.width == im3.width
|
|
assert im.height == im3.height
|
|
|
|
assert im3.deviate() < im2.deviate()
|
|
|
|
def test_hist_match(self):
|
|
im = pyvips.Image.identity()
|
|
im2 = pyvips.Image.identity()
|
|
|
|
matched = im.hist_match(im2)
|
|
|
|
assert (im - matched).abs().max() == 0.0
|
|
|
|
def test_hist_norm(self):
|
|
im = pyvips.Image.identity()
|
|
im2 = im.hist_norm()
|
|
|
|
assert (im - im2).abs().max() == 0.0
|
|
|
|
def test_hist_plot(self):
|
|
im = pyvips.Image.identity()
|
|
im2 = im.hist_plot()
|
|
|
|
assert im2.width == 256
|
|
assert im2.height == 256
|
|
assert im2.format == pyvips.BandFormat.UCHAR
|
|
assert im2.bands == 1
|
|
|
|
def test_hist_map(self):
|
|
im = pyvips.Image.identity()
|
|
|
|
im2 = im.maplut(im)
|
|
|
|
assert (im - im2).abs().max() == 0.0
|
|
|
|
def test_percent(self):
|
|
im = pyvips.Image.new_from_file(JPEG_FILE).extract_band(1)
|
|
|
|
pc = im.percent(90)
|
|
|
|
msk = im <= pc
|
|
n_set = (msk.avg() * msk.width * msk.height) / 255.0
|
|
pc_set = 100 * n_set / (msk.width * msk.height)
|
|
|
|
assert pytest.approx(pc_set, 0.5) == 90
|
|
|
|
def test_hist_entropy(self):
|
|
im = pyvips.Image.new_from_file(JPEG_FILE).extract_band(1)
|
|
|
|
ent = im.hist_find().hist_entropy()
|
|
|
|
assert pytest.approx(ent, 0.01) == 4.37
|
|
|
|
def test_stdif(self):
|
|
im = pyvips.Image.new_from_file(JPEG_FILE)
|
|
|
|
im2 = im.stdif(10, 10)
|
|
|
|
assert im.width == im2.width
|
|
assert im.height == im2.height
|
|
|
|
# new mean should be closer to target mean
|
|
assert abs(im.avg() - 128) > abs(im2.avg() - 128)
|
|
|
|
def test_case(self):
|
|
# slice into two at 128, we should get 50% of pixels in each half
|
|
x = pyvips.Image.grey(256, 256, uchar=True)
|
|
index = pyvips.Image.switch([x < 128, x >= 128])
|
|
|
|
y = index.case([10, 20])
|
|
assert y.avg() == 15
|
|
|
|
# slice into four
|
|
index = pyvips.Image.switch([
|
|
x < 64,
|
|
x >= 64 and x < 128,
|
|
x >= 128 and x < 192,
|
|
x >= 192
|
|
])
|
|
assert index.case([10, 20, 30, 40]).avg() == 25
|
|
|
|
# values over N should use the last value
|
|
assert index.case([10, 20, 30]).avg() == 22.5
|
|
|
|
if __name__ == '__main__':
|
|
pytest.main()
|