bilinear interp. supports complex types

in line with cubic etc.
This commit is contained in:
John Cupitt 2016-03-14 10:06:45 +00:00
parent fba2ac2f85
commit 82cecf3d9f
3 changed files with 30 additions and 17 deletions

14
TODO
View File

@ -1,17 +1,3 @@
- try:
$ ./test_resample.py TestResample.test_reduce
File "./test_resample.py", line 129, in test_reduce
self.assertLess(d, 5)
AssertionError: 147.0 not less than 5
affine bicubic != reduce cubic
displacement error, I guess?
yes, reduceh output should move one to the right
- need more tests for reduce, test every kernel plus every numeric type
- try orc version of reducev? and shrinkv? maybe shrinkh? - try orc version of reducev? and shrinkv? maybe shrinkh?

View File

@ -508,6 +508,8 @@ G_DEFINE_TYPE( VipsInterpolateBilinear, vips_interpolate_bilinear,
case VIPS_FORMAT_INT: FLOAT( int ); break; \ case VIPS_FORMAT_INT: FLOAT( int ); break; \
case VIPS_FORMAT_FLOAT: FLOAT( float ); break; \ case VIPS_FORMAT_FLOAT: FLOAT( float ); break; \
case VIPS_FORMAT_DOUBLE:FLOAT( double ); break; \ case VIPS_FORMAT_DOUBLE:FLOAT( double ); break; \
case VIPS_FORMAT_COMPLEX: FLOAT( float ); break; \
case VIPS_FORMAT_DPCOMPLEX:FLOAT( double ); break; \
default: \ default: \
g_assert( FALSE ); \ g_assert( FALSE ); \
} \ } \
@ -521,7 +523,8 @@ vips_interpolate_bilinear_interpolate( VipsInterpolate *interpolate,
*/ */
const int ps = VIPS_IMAGE_SIZEOF_PEL( in->im ); const int ps = VIPS_IMAGE_SIZEOF_PEL( in->im );
const int ls = VIPS_REGION_LSKIP( in ); const int ls = VIPS_REGION_LSKIP( in );
const int b = in->im->Bands; const int b = in->im->Bands *
(vips_band_format_iscomplex( in->im->BandFmt ) ? 2 : 1);
const int ix = (int) x; const int ix = (int) x;
const int iy = (int) y; const int iy = (int) y;

View File

@ -116,8 +116,13 @@ class TestResample(unittest.TestCase):
def test_reduce(self): def test_reduce(self):
im = Vips.Image.new_from_file("images/IMG_4618.jpg") im = Vips.Image.new_from_file("images/IMG_4618.jpg")
# cast down to 0-127, the smallest range, so we aren't messed up by
# clipping
im = im.cast(Vips.BandFormat.CHAR)
bicubic = Vips.Interpolate.new("bicubic") bicubic = Vips.Interpolate.new("bicubic")
bilinear = Vips.Interpolate.new("bilinear")
nearest = Vips.Interpolate.new("nearest")
for fac in [1, 1.1, 1.5, 1.999]: for fac in [1, 1.1, 1.5, 1.999]:
for fmt in all_formats: for fmt in all_formats:
x = im.cast(fmt) x = im.cast(fmt)
@ -126,7 +131,26 @@ class TestResample(unittest.TestCase):
interpolate = bicubic, interpolate = bicubic,
oarea = [0, 0, x.width / fac, x.height / fac]) oarea = [0, 0, x.width / fac, x.height / fac])
d = (r - a).abs().max() d = (r - a).abs().max()
self.assertLess(d, 5) self.assertLess(d, 10)
for fac in [1, 1.1, 1.5, 1.999]:
for fmt in all_formats:
x = im.cast(fmt)
r = x.reduce(fac, fac, kernel = "linear")
a = x.affine([1.0 / fac, 0, 0, 1.0 / fac],
interpolate = bilinear,
oarea = [0, 0, x.width / fac, x.height / fac])
d = (r - a).abs().max()
self.assertLess(d, 10)
# for other kernels, just see if avg looks about right
for fac in [1, 1.1, 1.5, 1.999]:
for fmt in all_formats:
for kernel in ["nearest", "lanczos2", "lanczos3"]:
x = im.cast(fmt)
r = x.reduce(fac, fac, kernel = kernel)
d = abs(r.avg() - im.avg())
self.assertLess(d, 2)
def test_resize(self): def test_resize(self):
im = Vips.Image.new_from_file("images/IMG_4618.jpg") im = Vips.Image.new_from_file("images/IMG_4618.jpg")