more of colour unittest done
This commit is contained in:
parent
1e6cd1b1a5
commit
5ebe12273a
16
TODO
16
TODO
@ -1,6 +1,22 @@
|
|||||||
|
|
||||||
- python:
|
- python:
|
||||||
|
|
||||||
|
- try:
|
||||||
|
|
||||||
|
$ python test_colour.py -v TestColour.test_bug
|
||||||
|
|
||||||
|
about 1 time in 5 we see:
|
||||||
|
|
||||||
|
(test_colour.py:30997): GLib-GObject-WARNING **: instance of invalid non-instantiatable type '(null)'
|
||||||
|
|
||||||
|
stops if we remove the extra alpha channel
|
||||||
|
|
||||||
|
seems to be caused by band handling in vips_colour_space_build()
|
||||||
|
|
||||||
|
- dECMC result differs from Lindbloom's result:
|
||||||
|
|
||||||
|
http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html
|
||||||
|
|
||||||
- could import like this:
|
- could import like this:
|
||||||
|
|
||||||
from gi.repository import Vips
|
from gi.repository import Vips
|
||||||
|
@ -25,7 +25,6 @@ all_formats = int_formats + float_formats + complex_formats
|
|||||||
|
|
||||||
colour_colourspaces = [Vips.Interpretation.XYZ,
|
colour_colourspaces = [Vips.Interpretation.XYZ,
|
||||||
Vips.Interpretation.LAB,
|
Vips.Interpretation.LAB,
|
||||||
Vips.Interpretation.LABQ,
|
|
||||||
Vips.Interpretation.LCH,
|
Vips.Interpretation.LCH,
|
||||||
Vips.Interpretation.CMC,
|
Vips.Interpretation.CMC,
|
||||||
Vips.Interpretation.LABS,
|
Vips.Interpretation.LABS,
|
||||||
@ -33,9 +32,10 @@ colour_colourspaces = [Vips.Interpretation.XYZ,
|
|||||||
Vips.Interpretation.SRGB,
|
Vips.Interpretation.SRGB,
|
||||||
Vips.Interpretation.RGB16,
|
Vips.Interpretation.RGB16,
|
||||||
Vips.Interpretation.YXY]
|
Vips.Interpretation.YXY]
|
||||||
|
coded_colourspaces = [Vips.Interpretation.LABQ]
|
||||||
mono_colourspaces = [Vips.Interpretation.GREY16,
|
mono_colourspaces = [Vips.Interpretation.GREY16,
|
||||||
Vips.Interpretation.B_W]
|
Vips.Interpretation.B_W]
|
||||||
all_colourspaces = colour_colourspaces + mono_colourspaces
|
all_colourspaces = colour_colourspaces + mono_colourspaces + coded_colourspaces
|
||||||
|
|
||||||
# an expanding zip ... if either of the args is not a list, duplicate it down
|
# an expanding zip ... if either of the args is not a list, duplicate it down
|
||||||
# the other
|
# the other
|
||||||
@ -107,28 +107,87 @@ class TestColour(unittest.TestCase):
|
|||||||
self.mono = self.colour.extract_band(1)
|
self.mono = self.colour.extract_band(1)
|
||||||
self.all_images = [self.mono, self.colour]
|
self.all_images = [self.mono, self.colour]
|
||||||
|
|
||||||
|
def test_bug(self):
|
||||||
|
test = Vips.Image.black(100, 100) + [50, 0, 0, 42]
|
||||||
|
test = test.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
im = test.colourspace(Vips.Interpretation.XYZ)
|
||||||
|
after = im.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqualObjects(after, [17.5064, 18.4187, 20.0547, 42])
|
||||||
|
|
||||||
def test_colourspace(self):
|
def test_colourspace(self):
|
||||||
# mid-grey in Lab
|
# mid-grey in Lab ... put 42 in the extra band, it should be copied
|
||||||
test = Vips.Image.black(100, 100) + [50, 0, 0]
|
# unmodified
|
||||||
|
test = Vips.Image.black(100, 100) + [50, 0, 0, 42]
|
||||||
test = test.copy(interpretation = Vips.Interpretation.LAB)
|
test = test.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
|
||||||
|
# a long series should come in a circle
|
||||||
im = test
|
im = test
|
||||||
for col in colour_colourspaces + [Vips.Interpretation.LAB]:
|
for col in colour_colourspaces + [Vips.Interpretation.LAB]:
|
||||||
im = im.colourspace(col)
|
im = im.colourspace(col)
|
||||||
self.assertEqual(im.interpretation, col)
|
self.assertEqual(im.interpretation, col)
|
||||||
|
pixel = im.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqual(pixel[3], 42, places = 2)
|
||||||
|
|
||||||
before = test.getpoint(10, 10)
|
before = test.getpoint(10, 10)
|
||||||
after = im.getpoint(10, 10)
|
after = im.getpoint(10, 10)
|
||||||
self.assertAlmostEqualObjects(before, after, places = 1)
|
self.assertAlmostEqualObjects(before, after, places = 1)
|
||||||
|
|
||||||
test = Vips.Image.black(100, 100) + [50, 0, 0]
|
# test Lab->XYZ on mid-grey
|
||||||
test = test.copy(interpretation = Vips.Interpretation.LAB)
|
# checked against http://www.brucelindbloom.com
|
||||||
im = im.colourspace(Vips.Interpretation.XYZ)
|
im = test.colourspace(Vips.Interpretation.XYZ)
|
||||||
after = im.getpoint(10, 10)
|
after = im.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqualObjects(after, [17.5064, 18.4187, 20.0547, 42])
|
||||||
|
|
||||||
|
# grey->colour->grey should be equal
|
||||||
|
for mono_fmt in mono_colourspaces:
|
||||||
|
test_grey = test.colourspace(mono_fmt)
|
||||||
|
im = test_grey
|
||||||
|
for col in colour_colourspaces + [mono_fmt]:
|
||||||
|
im = im.colourspace(col)
|
||||||
|
self.assertEqual(im.interpretation, col)
|
||||||
|
[before, alpha_before] = test_grey.getpoint(10, 10)
|
||||||
|
[after, alpha_after] = im.getpoint(10, 10)
|
||||||
|
self.assertLess(abs(alpha_after - alpha_before), 1)
|
||||||
|
if mono_fmt == Vips.Interpretation.GREY16:
|
||||||
|
# GREY16 can wind up rather different due to rounding
|
||||||
|
self.assertLess(abs(after - before), 30)
|
||||||
|
else:
|
||||||
|
# but 8-bit we should hit exactly
|
||||||
|
self.assertLess(abs(after - before), 1)
|
||||||
|
|
||||||
|
# checked against Bruce Lindbloom's calculator:
|
||||||
|
# http://www.brucelindbloom.com/index.html?Eqn_DeltaE_CIE2000.html
|
||||||
|
|
||||||
|
def test_dE00(self):
|
||||||
|
reference = Vips.Image.black(100, 100) + [50, 10, 20]
|
||||||
|
reference = reference.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
sample = Vips.Image.black(100, 100) + [40, -20, 10]
|
||||||
|
sample = sample.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
|
||||||
|
difference = reference.dE00(sample)
|
||||||
|
result = difference.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqualObjects(result, [30.238], places = 3)
|
||||||
|
|
||||||
|
def test_dE76(self):
|
||||||
|
reference = Vips.Image.black(100, 100) + [50, 10, 20]
|
||||||
|
reference = reference.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
sample = Vips.Image.black(100, 100) + [40, -20, 10]
|
||||||
|
sample = sample.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
|
||||||
|
difference = reference.dE76(sample)
|
||||||
|
result = difference.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqualObjects(result, [33.166], places = 3)
|
||||||
|
|
||||||
|
def test_dECMC(self):
|
||||||
|
reference = Vips.Image.black(100, 100) + [50, 10, 20]
|
||||||
|
reference = reference.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
sample = Vips.Image.black(100, 100) + [40, -20, 10]
|
||||||
|
sample = sample.copy(interpretation = Vips.Interpretation.LAB)
|
||||||
|
|
||||||
|
difference = reference.dECMC(sample)
|
||||||
|
result = difference.getpoint(10, 10)
|
||||||
|
self.assertAlmostEqualObjects(result, [44.1147], places = 3)
|
||||||
|
|
||||||
print 'after =', after
|
|
||||||
self.assertAlmostEqualObjects(after, [17.5064, 18.4187, 20.0547])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user