redo im_*merge1() as classes

This commit is contained in:
John Cupitt 2014-05-28 18:15:20 +01:00
parent adfda3cf14
commit 170efb1452
6 changed files with 158 additions and 197 deletions

View File

@ -34,7 +34,7 @@
- added hough_circle() to vips7 C++ API
- added Travis CI config, thanks Lovell
- im_*merge(), im_*mosaic(), im_match*(), im_global_balance*(), im_remosaic(),
im_*mosaic1() redone as classes
im_*mosaic1(), im_*merge1() redone as classes
6/3/14 started 7.38.6
- grey ramp minimum was wrong

16
TODO
View File

@ -1,7 +1,21 @@
- when adding a history line like
if( im_histlin( out, "#LRJOIN <%s> <%s> <%s> <%d> <%d> <%d>",
look for a meta field called "mosaicing-name" and use that for the filename
if it's not set, use "original-fileanme" instead
make up a new name and attach that to the output as "mosaicing-name"
means we don't need to track copies in globalbalance
test on two-point mosaicing example
- more mosaicing?
im_lrmosaic1(), im_tbmosaic1() done
im_lrmerge1(), im_tbmerge1()
im_lrmerge1(), im_tbmerge1() done
im_correl
im_align_bands()
im_maxpos_subpel()

View File

@ -838,7 +838,7 @@ im__bandup( const char *domain, IMAGE *in, IMAGE *out, int n )
int i;
if( in->Bands == n )
return( im_copy( in, out ) );
return( vips_image_write( in, out ) );
if( in->Bands != 1 ) {
im_error( domain, _( "not one band or %d bands" ), n );
return( -1 );
@ -1032,7 +1032,7 @@ im_add( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "add", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -1048,7 +1048,7 @@ im_subtract( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "subtract", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -1064,7 +1064,7 @@ im_multiply( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "multiply", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -1080,7 +1080,7 @@ im_divide( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "divide", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -1253,7 +1253,7 @@ im_copy_swap( IMAGE *in, IMAGE *out )
int
im_copy_set_meta( IMAGE *in, IMAGE *out, const char *field, GValue *value )
{
if( im_copy( in, out ) )
if( vips_image_write( in, out ) )
return( -1 );
im_meta_set( out, field, value );
@ -1266,7 +1266,7 @@ im_copy_native( IMAGE *in, IMAGE *out, gboolean is_msb_first )
if( is_msb_first != im_amiMSBfirst() )
return( im_copy_swap( in, out ) );
else
return( im_copy( in, out ) );
return( vips_image_write( in, out ) );
}
int
@ -2510,7 +2510,7 @@ im_spcor( IMAGE *in, IMAGE *ref, IMAGE *out )
if( vips_call( "spcor", in, ref, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -2533,7 +2533,7 @@ im_fastcor( IMAGE *in, IMAGE *ref, IMAGE *out )
if( vips_call( "fastcor", in, ref, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3066,7 +3066,7 @@ im_ri2c( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "complexform", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3088,7 +3088,7 @@ im_argb2rgba( VipsImage *in, VipsImage *out )
{
/* No longer exists, just a null op.
*/
return( im_copy( in, out ) );
return( vips_image_write( in, out ) );
}
int
@ -3098,7 +3098,7 @@ im_shrink( VipsImage *in, VipsImage *out, double xshrink, double yshrink )
if( vips_shrink( in, &x, xshrink, yshrink, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3117,7 +3117,7 @@ im_eye( IMAGE *out, const int xsize, const int ysize, const double factor )
"uchar", TRUE,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3135,7 +3135,7 @@ im_feye( IMAGE *out, const int xsize, const int ysize, const double factor )
"factor", factor,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3153,7 +3153,7 @@ im_grey( IMAGE *out, const int xsize, const int ysize )
"uchar", TRUE,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3170,7 +3170,7 @@ im_fgrey( IMAGE *out, const int xsize, const int ysize )
if( vips_grey( &x, xsize, ysize,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3194,7 +3194,7 @@ im_buildlut( DOUBLEMASK *input, VipsImage *out )
return( -1 );
}
g_object_unref( mat );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3219,7 +3219,7 @@ im_invertlut( DOUBLEMASK *input, VipsImage *out, int size )
return( -1 );
}
g_object_unref( mat );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3304,7 +3304,7 @@ im_Lab2XYZ_temp( IMAGE *in, IMAGE *out, double X0, double Y0, double Z0 )
}
vips_area_unref( temp );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3320,7 +3320,7 @@ im_Lab2XYZ( IMAGE *in, IMAGE *out )
if( vips_Lab2XYZ( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3346,7 +3346,7 @@ im_XYZ2Lab_temp( IMAGE *in, IMAGE *out, double X0, double Y0, double Z0 )
}
vips_area_unref( temp );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3362,7 +3362,7 @@ im_XYZ2Lab( IMAGE *in, IMAGE *out )
if( vips_XYZ2Lab( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3378,7 +3378,7 @@ im_Lab2LCh( IMAGE *in, IMAGE *out )
if( vips_Lab2LCh( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3394,7 +3394,7 @@ im_LCh2Lab( IMAGE *in, IMAGE *out )
if( vips_LCh2Lab( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3410,7 +3410,7 @@ im_LCh2UCS( IMAGE *in, IMAGE *out )
if( vips_LCh2CMC( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3426,7 +3426,7 @@ im_UCS2LCh( IMAGE *in, IMAGE *out )
if( vips_CMC2LCh( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3442,7 +3442,7 @@ im_XYZ2Yxy( IMAGE *in, IMAGE *out )
if( vips_XYZ2Yxy( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3458,7 +3458,7 @@ im_Yxy2XYZ( IMAGE *in, IMAGE *out )
if( vips_Yxy2XYZ( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3474,7 +3474,7 @@ im_float2rad( IMAGE *in, IMAGE *out )
if( vips_float2rad( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3490,7 +3490,7 @@ im_rad2float( IMAGE *in, IMAGE *out )
if( vips_rad2float( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3506,7 +3506,7 @@ im_Lab2LabQ( IMAGE *in, IMAGE *out )
if( vips_Lab2LabQ( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3522,7 +3522,7 @@ im_LabQ2Lab( IMAGE *in, IMAGE *out )
if( vips_LabQ2Lab( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3538,7 +3538,7 @@ im_Lab2LabS( IMAGE *in, IMAGE *out )
if( vips_Lab2LabS( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3554,7 +3554,7 @@ im_LabS2Lab( IMAGE *in, IMAGE *out )
if( vips_LabS2Lab( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3570,7 +3570,7 @@ im_LabQ2LabS( IMAGE *in, IMAGE *out )
if( vips_LabQ2LabS( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3586,7 +3586,7 @@ im_LabS2LabQ( IMAGE *in, IMAGE *out )
if( vips_LabS2LabQ( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3660,7 +3660,7 @@ im_sRGB2XYZ( IMAGE *in, IMAGE *out )
if( vips_sRGB2scRGB( in, &t[0], NULL ) ||
vips_scRGB2XYZ( t[0], &t[1], NULL ) ||
im_copy( t[1], out ) )
vips_image_write( t[1], out ) )
return( -1 );
return( 0 );
@ -3674,7 +3674,7 @@ im_XYZ2sRGB( IMAGE *in, IMAGE *out )
if( vips_XYZ2scRGB( in, &t[0], NULL ) ||
vips_scRGB2sRGB( t[0], &t[1], NULL ) ||
im_copy( t[1], out ) )
vips_image_write( t[1], out ) )
return( -1 );
return( 0 );
@ -3687,7 +3687,7 @@ im_LabQ2sRGB( IMAGE *in, IMAGE *out )
if( vips_LabQ2sRGB( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3709,7 +3709,7 @@ im_icc_transform( VipsImage *in, VipsImage *out,
"intent", intent,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3729,7 +3729,7 @@ im_icc_import( VipsImage *in, VipsImage *out,
"intent", intent,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3748,7 +3748,7 @@ im_icc_import_embedded( VipsImage *in, VipsImage *out, VipsIntent intent )
"intent", intent,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3769,7 +3769,7 @@ im_icc_export_depth( VipsImage *in, VipsImage *out, int depth,
"intent", intent,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3874,7 +3874,7 @@ im_dE_fromLab( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_dE76( in1, in2, &x,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3891,7 +3891,7 @@ im_dECMC_fromLab( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_dECMC( in1, in2, &x,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3908,7 +3908,7 @@ im_dE00_fromLab( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_dE00( in1, in2, &x,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3924,7 +3924,7 @@ im_icc_ac2rc( VipsImage *in, VipsImage *out, const char *profile_filename )
if( vips_icc_ac2rc( in, &x, profile_filename ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -3941,7 +3941,7 @@ im_quadratic( IMAGE *in, IMAGE *out, IMAGE *coeff )
if( vips_quadratic( in, &x, coeff,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4024,7 +4024,7 @@ im_cross_phase( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_call( "cross_phase", in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4041,7 +4041,7 @@ im_maplut( IMAGE *in, IMAGE *out, IMAGE *lut )
if( vips_maplut( in, &x, lut, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4071,7 +4071,7 @@ im_histcum( IMAGE *in, IMAGE *out )
if( vips_hist_cum( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4088,7 +4088,7 @@ im_histnorm( IMAGE *in, IMAGE *out )
if( vips_hist_norm( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4118,7 +4118,7 @@ im_heq( VipsImage *in, VipsImage *out, int bandno )
if( vips_hist_equal( in, &x, "band", bandno, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4150,7 +4150,7 @@ im_histgr( IMAGE *in, IMAGE *out, int bandno )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4174,7 +4174,7 @@ im_stdif( IMAGE *in, IMAGE *out,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4191,7 +4191,7 @@ im_lhisteq( VipsImage *in, VipsImage *out, int width, int height )
if( vips_hist_local( in, &x, width, height, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4210,7 +4210,7 @@ im_histnD( VipsImage *in, VipsImage *out, int bins )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4227,7 +4227,7 @@ im_hist_indexed( VipsImage *index, VipsImage *value, VipsImage *out )
if( vips_hist_find_indexed( value, index, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4244,14 +4244,14 @@ im_project( IMAGE *in, IMAGE *hout, IMAGE *vout )
if( vips_project( in, &x, &y, NULL ) )
return( -1 );
if( im_copy( x, hout ) ) {
if( vips_image_write( x, hout ) ) {
g_object_unref( x );
g_object_unref( y );
return( -1 );
}
g_object_unref( x );
if( im_copy( y, vout ) ) {
if( vips_image_write( y, vout ) ) {
g_object_unref( y );
return( -1 );
}
@ -4283,7 +4283,7 @@ im_profile( IMAGE *in, IMAGE *out, int dir )
}
g_object_unref( t1 );
if( im_copy( t2, out ) ) {
if( vips_image_write( t2, out ) ) {
g_object_unref( t2 );
return( -1 );
}
@ -4334,7 +4334,7 @@ match( VipsImage *in, VipsImage *ref, VipsImage *out )
if( vips_hist_match( in, ref, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4382,7 +4382,7 @@ im_falsecolour( IMAGE *in, IMAGE *out )
if( vips_falsecolour( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4401,7 +4401,7 @@ im_gammacorrect( IMAGE *in, IMAGE *out, double exponent )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4441,7 +4441,7 @@ im_tile_cache( IMAGE *in, IMAGE *out,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4469,7 +4469,7 @@ im_tile_cache_random( IMAGE *in, IMAGE *out,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4592,7 +4592,7 @@ im_copy_file( IMAGE *in, IMAGE *out )
if( vips_copy_file( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4619,7 +4619,7 @@ im_fwfft( IMAGE *in, IMAGE *out )
if( vips_fwfft( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4636,7 +4636,7 @@ im_invfft( IMAGE *in, IMAGE *out )
if( vips_invfft( in, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4655,7 +4655,7 @@ im_invfftr( IMAGE *in, IMAGE *out )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4672,7 +4672,7 @@ im_freqflt( IMAGE *in, IMAGE *mask, IMAGE *out )
if( vips_freqmult( in, mask, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4721,7 +4721,7 @@ im_phasecor_fft( IMAGE *in1, IMAGE *in2, IMAGE *out )
if( vips_phasecor( in1, in2, &x, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -4747,7 +4747,7 @@ im_label_regions( IMAGE *test, IMAGE *mask, int *segments )
if( vips_labelregions( test, &x, "segments", segments, NULL ) )
return( -1 );
if( im_copy( x, mask ) ) {
if( vips_image_write( x, mask ) ) {
g_object_unref( x );
return( -1 );
}
@ -4764,7 +4764,7 @@ im_rank( IMAGE *in, IMAGE *out, int width, int height, int index )
if( vips_rank( in, &x, width, height, index, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5029,7 +5029,7 @@ im_lineset( IMAGE *in, IMAGE *out, IMAGE *mask, IMAGE *ink,
/* Copy the image then fastline to it ... this will render to a "t"
* usually.
*/
if( im_copy( in, out ) )
if( vips_image_write( in, out ) )
return( -1 );
mask_rect.left = mask->Xsize / 2;
@ -5066,7 +5066,7 @@ im_match_linear_search( IMAGE *ref, IMAGE *sec, IMAGE *out,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5087,7 +5087,7 @@ im_match_linear( IMAGE *ref, IMAGE *sec, IMAGE *out,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5107,7 +5107,7 @@ im_global_balance( IMAGE *in, IMAGE *out, double gamma )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5126,7 +5126,7 @@ im_global_balancef( IMAGE *in, IMAGE *out, double gamma )
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5143,7 +5143,7 @@ im_remosaic( IMAGE *in, IMAGE *out, const char *old_str, const char *new_str )
if( vips_remosaic( in, &x, old_str, new_str, NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5165,13 +5165,14 @@ im_lrmosaic1( IMAGE *ref, IMAGE *sec, IMAGE *out,
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_HORIZONTAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"search", TRUE,
"bandno", bandno,
"hwindow", hwindowsize,
"harea", hsearchsize,
"mblend", mwidth,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
@ -5193,13 +5194,58 @@ im_tbmosaic1( IMAGE *ref, IMAGE *sec, IMAGE *out,
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_VERTICAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"search", TRUE,
"bandno", bandno,
"hwindow", hwindowsize,
"harea", hsearchsize,
"mblend", mwidth,
NULL ) )
return( -1 );
if( im_copy( x, out ) ) {
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}
int
im_lrmerge1( IMAGE *ref, IMAGE *sec, IMAGE *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth )
{
VipsImage *x;
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_HORIZONTAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"mblend", mwidth,
NULL ) )
return( -1 );
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}
g_object_unref( x );
return( 0 );
}
int
im_tbmerge1( IMAGE *ref, IMAGE *sec, IMAGE *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth )
{
VipsImage *x;
if( vips_mosaic1( ref, sec, &x, VIPS_DIRECTION_VERTICAL,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2,
"mblend", mwidth,
NULL ) )
return( -1 );
if( vips_image_write( x, out ) ) {
g_object_unref( x );
return( -1 );
}

View File

@ -44,6 +44,7 @@ int vips_merge( VipsImage *ref, VipsImage *sec, VipsImage **out,
int vips_mosaic( VipsImage *ref, VipsImage *sec, VipsImage **out,
VipsDirection direction, int xref, int yref, int xsec, int ysec, ... )
__attribute__((sentinel));
int vips_mosaic1( VipsImage *ref, VipsImage *sec, VipsImage **out,
VipsDirection direction,
int xr1, int yr1, int xs1, int ys1,
@ -64,15 +65,6 @@ int vips_remosaic( VipsImage *in, VipsImage **out,
#include <vips/vips.h>
int im_lrmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth );
int im_tbmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth );
int im_correl( VipsImage *ref, VipsImage *sec,
int xref, int yref, int xsec, int ysec,
int hwindowsize, int hsearchsize,

View File

@ -1067,6 +1067,15 @@ int im_global_balancef( VipsImage *in, VipsImage *out, double gamma );
int im_remosaic( VipsImage *in, VipsImage *out,
const char *old_str, const char *new_str );
int im_lrmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth );
int im_tbmerge1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth );
int im_lrmosaic1( VipsImage *ref, VipsImage *sec, VipsImage *out,
int bandno,
int xr1, int yr1, int xs1, int ys1,

View File

@ -207,106 +207,6 @@ rotjoin( IMAGE *ref, IMAGE *sec, IMAGE *out, joinfn jfn,
return( 0 );
}
/**
* im_lrmerge1:
* @ref: reference image
* @sec: secondary image
* @out: output image
* @xr1: first reference tie-point
* @yr1: first reference tie-point
* @xs1: first secondary tie-point
* @ys1: first secondary tie-point
* @xr2: second reference tie-point
* @yr2: second reference tie-point
* @xs2: second secondary tie-point
* @ys2: second secondary tie-point
* @mwidth: maximum blend width
*
* This operation joins two images left-right (with @ref on the left)
* given a pair of tie-points. @sec is scaled and rotated as
* necessary before the join.
*
* @mwidth limits the maximum width of the
* blend area. A value of "-1" means "unlimited". The two images are blended
* with a raised cosine.
*
* Pixels with all bands equal to zero are "transparent", that
* is, zero pixels in the overlap area do not contribute to the merge.
* This makes it possible to join non-rectangular images.
*
* If the number of bands differs, one of the images
* must have one band. In this case, an n-band image is formed from the
* one-band image by joining n copies of the one-band image together, and then
* the two n-band images are operated upon.
*
* The two input images are cast up to the smallest common type (see table
* Smallest common format in
* <link linkend="VIPS-arithmetic">arithmetic</link>).
*
* See also: im_tbmerge1(), im_lrmerge(), im_insert(), im_global_balance().
*
* Returns: 0 on success, -1 on error
*/
int
im_lrmerge1( IMAGE *ref, IMAGE *sec, IMAGE *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth )
{
return( rotjoin( ref, sec, out, im__lrmerge1,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2, mwidth ) );
}
/**
* im_tbmerge1:
* @ref: reference image
* @sec: secondary image
* @out: output image
* @xr1: first reference tie-point
* @yr1: first reference tie-point
* @xs1: first secondary tie-point
* @ys1: first secondary tie-point
* @xr2: second reference tie-point
* @yr2: second reference tie-point
* @xs2: second secondary tie-point
* @ys2: second secondary tie-point
* @mwidth: maximum blend width
*
* This operation joins two images top-bottom (with @ref on the top)
* given a pair of tie-points. @sec is scaled and rotated as
* necessary before the join.
*
* @mwidth limits the maximum height of the
* blend area. A value of "-1" means "unlimited". The two images are blended
* with a raised cosine.
*
* Pixels with all bands equal to zero are "transparent", that
* is, zero pixels in the overlap area do not contribute to the merge.
* This makes it possible to join non-rectangular images.
*
* If the number of bands differs, one of the images
* must have one band. In this case, an n-band image is formed from the
* one-band image by joining n copies of the one-band image together, and then
* the two n-band images are operated upon.
*
* The two input images are cast up to the smallest common type (see table
* Smallest common format in
* <link linkend="VIPS-arithmetic">arithmetic</link>).
*
* See also: im_lrmerge1(), im_tbmerge(), im_insert(), im_global_balance().
*
* Returns: 0 on success, -1 on error
*/
int
im_tbmerge1( IMAGE *ref, IMAGE *sec, IMAGE *out,
int xr1, int yr1, int xs1, int ys1,
int xr2, int yr2, int xs2, int ys2,
int mwidth )
{
return( rotjoin( ref, sec, out, im__tbmerge1,
xr1, yr1, xs1, ys1, xr2, yr2, xs2, ys2, mwidth ) );
}
/* Like rotjoin, but do a search to refine the tie-points.
*/
static int
@ -674,27 +574,27 @@ vips_mosaic1_class_init( VipsMosaic1Class *class )
G_STRUCT_OFFSET( VipsMosaic1, harea ),
0, 1000000000, 1 );
VIPS_ARG_BOOL( class, "search", 13,
VIPS_ARG_BOOL( class, "search", 15,
_( "search" ),
_( "Search to improve tie-points" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsMosaic1, search ),
FALSE );
VIPS_ARG_INTERPOLATE( class, "interpolate", 14,
VIPS_ARG_INTERPOLATE( class, "interpolate", 16,
_( "Interpolate" ),
_( "Interpolate pixels with this" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsMosaic1, interpolate ) );
VIPS_ARG_INT( class, "mblend", 15,
VIPS_ARG_INT( class, "mblend", 17,
_( "Max blend" ),
_( "Maximum blend size" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,
G_STRUCT_OFFSET( VipsMosaic1, mblend ),
0, 10000, 10 );
VIPS_ARG_INT( class, "bandno", 16,
VIPS_ARG_INT( class, "bandno", 18,
_( "Search band" ),
_( "Band to search for features on" ),
VIPS_ARGUMENT_OPTIONAL_INPUT,