fix fastcor for non-uchar images

oops, forgot to scale lsk
This commit is contained in:
John Cupitt 2014-12-17 17:54:44 +00:00
parent 59b47f3900
commit dba587916e
3 changed files with 38 additions and 12 deletions

View File

@ -94,11 +94,13 @@ vips_correlation_build( VipsObject *object )
correlation->in->Xsize + correlation->ref->Xsize - 1,
correlation->in->Ysize + correlation->ref->Ysize - 1,
"extend", VIPS_EXTEND_COPY,
NULL ) ||
vips__formatalike( t[0], correlation->ref, &t[1], &t[2] ) ||
NULL ) )
return( -1 );
if( vips__formatalike( t[0], correlation->ref, &t[1], &t[2] ) ||
vips__bandalike( class->nickname, t[1], t[2], &t[3], &t[4] ) ||
vips_image_wio_input( t[4] ) )
return( -1 );
correlation->in_ready = t[3];
correlation->ref_ready = t[4];

View File

@ -108,8 +108,8 @@ G_DEFINE_TYPE( VipsFastcor, vips_fastcor, VIPS_TYPE_CORRELATION );
\
for( x = 0; x < r->width; x++ ) \
for( b = 0; b < bands; b++ ) { \
TYPE *p1 = (TYPE *) ref->data; \
TYPE *p2 = (TYPE *) VIPS_REGION_ADDR( in, \
TYPE *p_ref = (TYPE *) ref->data; \
TYPE *p_in = (TYPE *) VIPS_REGION_ADDR( in, \
r->left + x, r->top + y ); \
\
TYPE sum; \
@ -117,13 +117,13 @@ G_DEFINE_TYPE( VipsFastcor, vips_fastcor, VIPS_TYPE_CORRELATION );
sum = 0; \
for( j = 0; j < ref->Ysize; j++ ) { \
for( i = b; i < sz; i += bands ) { \
TYPE t = p1[i] - p2[i]; \
TYPE dif = p_ref[i] - p_in[i]; \
\
sum += t * t; \
sum += dif * dif; \
} \
\
p1 += sz; \
p2 += lsk; \
p_ref += sz; \
p_in += lsk; \
} \
\
*q++ = sum; \
@ -140,7 +140,7 @@ vips_fastcor_correlation( VipsCorrelation *correlation,
int bands = vips_band_format_iscomplex( ref->BandFmt ) ?
ref->Bands * 2 : ref->Bands;
int sz = ref->Xsize * bands;
int lsk = VIPS_REGION_LSKIP( in );
int lsk = VIPS_REGION_LSKIP( in ) / VIPS_IMAGE_SIZEOF_ELEMENT( in->im );
int x, y, i, j, b;

View File

@ -15,6 +15,20 @@ import math
from gi.repository import Vips
unsigned_formats = [Vips.BandFormat.UCHAR,
Vips.BandFormat.USHORT,
Vips.BandFormat.UINT]
signed_formats = [Vips.BandFormat.CHAR,
Vips.BandFormat.SHORT,
Vips.BandFormat.INT]
float_formats = [Vips.BandFormat.FLOAT,
Vips.BandFormat.DOUBLE]
complex_formats = [Vips.BandFormat.COMPLEX,
Vips.BandFormat.DPCOMPLEX]
int_formats = unsigned_formats + signed_formats
noncomplex_formats = int_formats + float_formats
all_formats = int_formats + float_formats + complex_formats
# 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):
@ -145,12 +159,11 @@ class TestConvolution(unittest.TestCase):
def test_convsep(self):
for im in self.all_images:
for prec in [Vips.Precision.INTEGER, Vips.Precision.FLOAT]:
integer = prec == Vips.Precision.INTEGER
gmask = Vips.Image.gaussmat(2, 0.1,
integer = integer)
precision = prec)
gmask_sep = Vips.Image.gaussmat(2, 0.1,
separable = True,
integer = integer)
precision = prec)
self.assertEqual(gmask.width, gmask.height)
self.assertEqual(gmask_sep.width, gmask.width)
@ -164,5 +177,16 @@ class TestConvolution(unittest.TestCase):
self.assertAlmostEqualObjects(a_point, b_point, places = 1)
def test_fastcor(self):
for im in self.all_images:
for fmt in noncomplex_formats:
small = im.crop(20, 45, 10, 10).cast(fmt)
cor = im.fastcor(small)
v, x, y = cor.minpos()
self.assertEqual(v, 0)
self.assertEqual(x, 25)
self.assertEqual(y, 50)
if __name__ == '__main__':
unittest.main()