145 lines
3.9 KiB
Python
Executable File
145 lines
3.9 KiB
Python
Executable File
#!/usr/bin/python
|
|
# vim: set fileencoding=utf-8 :
|
|
|
|
import unittest
|
|
import math
|
|
|
|
#import logging
|
|
#logging.basicConfig(level = logging.DEBUG)
|
|
|
|
import gi
|
|
gi.require_version('Vips', '8.0')
|
|
from gi.repository import Vips
|
|
|
|
Vips.leak_set(True)
|
|
|
|
# an expanding zip ... if either of the args is a scalar or a one-element list,
|
|
# duplicate it down the other side
|
|
def zip_expand(x, y):
|
|
# handle singleton list case
|
|
if isinstance(x, list) and len(x) == 1:
|
|
x = x[0]
|
|
if isinstance(y, list) and len(y) == 1:
|
|
y = y[0]
|
|
|
|
if isinstance(x, list) and isinstance(y, list):
|
|
return list(zip(x, y))
|
|
elif isinstance(x, list):
|
|
return [[i, y] for i in x]
|
|
elif isinstance(y, list):
|
|
return [[x, j] for j in y]
|
|
else:
|
|
return [[x, y]]
|
|
|
|
class TestHistogram(unittest.TestCase):
|
|
# test a pair of things which can be lists for approx. equality
|
|
def assertAlmostEqualObjects(self, a, b, places = 4, msg = ''):
|
|
# print 'assertAlmostEqualObjects %s = %s' % (a, b)
|
|
for x, y in zip_expand(a, b):
|
|
self.assertAlmostEqual(x, y, places = places, msg = msg)
|
|
|
|
def test_hist_cum(self):
|
|
im = Vips.Image.identity()
|
|
|
|
sum = im.avg() * 256
|
|
|
|
cum = im.hist_cum()
|
|
|
|
p = cum(255, 0)
|
|
self.assertEqual(p[0], sum)
|
|
|
|
def test_hist_equal(self):
|
|
im = Vips.Image.new_from_file("images/йцук.jpg")
|
|
|
|
im2 = im.hist_equal()
|
|
|
|
self.assertEqual(im.width, im2.width)
|
|
self.assertEqual(im.height, im2.height)
|
|
|
|
self.assertTrue(im.avg() < im2.avg())
|
|
self.assertTrue(im.deviate() < im2.deviate())
|
|
|
|
def test_hist_ismonotonic(self):
|
|
im = Vips.Image.identity()
|
|
self.assertTrue(im.hist_ismonotonic())
|
|
|
|
def test_hist_local(self):
|
|
im = Vips.Image.new_from_file("images/йцук.jpg")
|
|
|
|
im2 = im.hist_local(10, 10)
|
|
|
|
self.assertEqual(im.width, im2.width)
|
|
self.assertEqual(im.height, im2.height)
|
|
|
|
self.assertTrue(im.avg() < im2.avg())
|
|
self.assertTrue(im.deviate() < im2.deviate())
|
|
|
|
im3 = im.hist_local(10, 10, max_slope = 3)
|
|
|
|
self.assertEqual(im.width, im2.width)
|
|
self.assertEqual(im.height, im2.height)
|
|
|
|
self.assertTrue(im3.deviate() < im2.deviate())
|
|
|
|
def test_hist_match(self):
|
|
im = Vips.Image.identity()
|
|
im2 = Vips.Image.identity()
|
|
|
|
matched = im.hist_match(im2)
|
|
|
|
self.assertEqual((im - matched).abs().max(), 0.0)
|
|
|
|
def test_hist_norm(self):
|
|
im = Vips.Image.identity()
|
|
im2 = im.hist_norm()
|
|
|
|
self.assertEqual((im - im2).abs().max(), 0.0)
|
|
|
|
def test_hist_plot(self):
|
|
im = Vips.Image.identity()
|
|
im2 = im.hist_plot()
|
|
|
|
self.assertEqual(im2.width, 256)
|
|
self.assertEqual(im2.height, 256)
|
|
self.assertEqual(im2.format, Vips.BandFormat.UCHAR)
|
|
self.assertEqual(im2.bands, 1)
|
|
|
|
def test_hist_map(self):
|
|
im = Vips.Image.identity()
|
|
|
|
im2 = im.maplut(im)
|
|
|
|
self.assertEqual((im - im2).abs().max(), 0.0)
|
|
|
|
def test_percent(self):
|
|
im = Vips.Image.new_from_file("images/йцук.jpg").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)
|
|
|
|
self.assertAlmostEqual(pc_set, 90, places = 0)
|
|
|
|
def test_hist_entropy(self):
|
|
im = Vips.Image.new_from_file("images/йцук.jpg").extract_band(1)
|
|
|
|
ent = im.hist_find().hist_entropy()
|
|
|
|
self.assertAlmostEqual(ent, 4.367, places = 3)
|
|
|
|
def test_stdif(self):
|
|
im = Vips.Image.new_from_file("images/йцук.jpg")
|
|
|
|
im2 = im.stdif(10, 10)
|
|
|
|
self.assertEqual(im.width, im2.width)
|
|
self.assertEqual(im.height, im2.height)
|
|
|
|
# new mean should be closer to target mean
|
|
self.assertTrue(abs(im.avg() - 128) > abs(im2.avg() - 128))
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|