// this file automatically generated from // VIPS library 7.12.2-Tue Jul 17 23:36:09 BST 2007 // im_abs: absolute value VImage VImage::abs() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_abs" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_acostra: acos of image (result in degrees) VImage VImage::acos() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_acostra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_add: add two images VImage VImage::add( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_add" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_asintra: asin of image (result in degrees) VImage VImage::asin() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_asintra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_atantra: atan of image (result in degrees) VImage VImage::atan() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_atantra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_avg: average value of image double VImage::avg() throw( VError ) { VImage in = *this; double value; Vargv _vec( "im_avg" ); _vec.data(0) = in.image(); _vec.call(); value = *((double*)_vec.data(1)); return( value ); } // im_point_bilinear: interpolate value at single point, linearly double VImage::point_bilinear( double x, double y, int band ) throw( VError ) { VImage in = *this; double val; Vargv _vec( "im_point_bilinear" ); _vec.data(0) = in.image(); *((double*) _vec.data(1)) = x; *((double*) _vec.data(2)) = y; *((int*) _vec.data(3)) = band; _vec.call(); val = *((double*)_vec.data(4)); return( val ); } // im_bandmean: average image bands VImage VImage::bandmean() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_bandmean" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_ceil: round to smallest integal value not less than VImage VImage::ceil() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_ceil" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_cmulnorm: multiply two complex images, normalising output VImage VImage::cmulnorm( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_cmulnorm" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_costra: cos of image (angles in degrees) VImage VImage::cos() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_costra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_deviate: standard deviation of image double VImage::deviate() throw( VError ) { VImage in = *this; double value; Vargv _vec( "im_deviate" ); _vec.data(0) = in.image(); _vec.call(); value = *((double*)_vec.data(1)); return( value ); } // im_divide: divide two images VImage VImage::divide( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_divide" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_exp10tra: 10^pel of image VImage VImage::exp10() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_exp10tra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_expntra: x^pel of image VImage VImage::expn( double x ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_expntra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = x; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_expntra_vec: [x,y,z]^pel of image VImage VImage::expn( std::vector v ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_expntra_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = v.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[v.size()]; for( unsigned int i = 0; i < v.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = v[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_exptra: e^pel of image VImage VImage::exp() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_exptra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_fav4: average of 4 images VImage VImage::fav4( VImage in2, VImage in3, VImage in4 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_fav4" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = in3.image(); _vec.data(3) = in4.image(); _vec.data(4) = out.image(); _vec.call(); return( out ); } // im_floor: round to largest integal value not greater than VImage VImage::floor() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_floor" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_gadd: calculate a*in1 + b*in2 + c = outfile VImage VImage::gadd( double a, double b, VImage in2, double c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_gadd" ); *((double*) _vec.data(0)) = a; _vec.data(1) = in1.image(); *((double*) _vec.data(2)) = b; _vec.data(3) = in2.image(); *((double*) _vec.data(4)) = c; _vec.data(5) = out.image(); _vec.call(); return( out ); } // im_invert: photographic negative VImage VImage::invert() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_invert" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lintra: calculate a*in + b = outfile VImage VImage::lin( double a, double b ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lintra" ); *((double*) _vec.data(0)) = a; _vec.data(1) = in.image(); *((double*) _vec.data(2)) = b; _vec.data(3) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_linreg: pixelwise linear regression VImage VImage::linreg( std::vector ins, std::vector xs ) throw( VError ) { VImage out; Vargv _vec( "im_linreg" ); ((im_imagevec_object*) _vec.data(0))->n = ins.size(); ((im_imagevec_object*) _vec.data(0))->vec = new IMAGE *[ins.size()]; for( unsigned int i = 0; i < ins.size(); i++ ) ((im_imagevec_object*) _vec.data(0))->vec[i] = ins[i].image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = xs.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[xs.size()]; for( unsigned int i = 0; i < xs.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = xs[i]; _vec.call(); for( unsigned int i = 0; i < ins.size(); i++ ) out._ref->addref( ins[i]._ref ); return( out ); } // im_lintra_vec: calculate a*in + b -> out, a and b vectors VImage VImage::lin( std::vector a, std::vector b ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lintra_vec" ); ((im_doublevec_object*) _vec.data(0))->n = a.size(); ((im_doublevec_object*) _vec.data(0))->vec = new double[a.size()]; for( unsigned int i = 0; i < a.size(); i++ ) ((im_doublevec_object*) _vec.data(0))->vec[i] = a[i]; _vec.data(1) = in.image(); ((im_doublevec_object*) _vec.data(2))->n = b.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[b.size()]; for( unsigned int i = 0; i < b.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = b[i]; _vec.data(3) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_litecor: calculate max(white)*factor*(in/white), if clip == 1 VImage VImage::litecor( VImage white, int clip, double factor ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_litecor" ); _vec.data(0) = in.image(); _vec.data(1) = white.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = clip; *((double*) _vec.data(4)) = factor; _vec.call(); return( out ); } // im_log10tra: log10 of image VImage VImage::log10() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_log10tra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_logtra: ln of image VImage VImage::log() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_logtra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_max: maximum value of image double VImage::max() throw( VError ) { VImage in = *this; double value; Vargv _vec( "im_max" ); _vec.data(0) = in.image(); _vec.call(); value = *((double*)_vec.data(1)); return( value ); } // im_maxpos: position of maximum value of image std::complex VImage::maxpos() throw( VError ) { VImage in = *this; std::complex position; Vargv _vec( "im_maxpos" ); _vec.data(0) = in.image(); _vec.call(); position = *((std::complex*)_vec.data(1)); return( position ); } // im_maxpos_avg: position of maximum value of image, averaging in case of draw double VImage::maxpos_avg( double& y, double& out ) throw( VError ) { VImage in = *this; double x; Vargv _vec( "im_maxpos_avg" ); _vec.data(0) = in.image(); _vec.call(); x = *((double*)_vec.data(1)); y = *((double*)_vec.data(2)); out = *((double*)_vec.data(3)); return( x ); } // im_measure: measure averages of a grid of patches VDMask VImage::measure( int x, int y, int w, int h, int h_patches, int v_patches ) throw( VError ) { VImage in = *this; VDMask mask; Vargv _vec( "im_measure" ); _vec.data(0) = in.image(); ((im_mask_object*) _vec.data(1))->name = (char*)"noname"; *((int*) _vec.data(2)) = x; *((int*) _vec.data(3)) = y; *((int*) _vec.data(4)) = w; *((int*) _vec.data(5)) = h; *((int*) _vec.data(6)) = h_patches; *((int*) _vec.data(7)) = v_patches; _vec.call(); mask.embed( (DOUBLEMASK *)((im_mask_object*)_vec.data(1))->mask ); return( mask ); } // im_min: minimum value of image double VImage::min() throw( VError ) { VImage in = *this; double value; Vargv _vec( "im_min" ); _vec.data(0) = in.image(); _vec.call(); value = *((double*)_vec.data(1)); return( value ); } // im_minpos: position of minimum value of image std::complex VImage::minpos() throw( VError ) { VImage in = *this; std::complex position; Vargv _vec( "im_minpos" ); _vec.data(0) = in.image(); _vec.call(); position = *((std::complex*)_vec.data(1)); return( position ); } // im_multiply: multiply two images VImage VImage::multiply( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_multiply" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_powtra: pel^x ofbuildimage VImage VImage::pow( double x ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_powtra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = x; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_powtra_vec: pel^[x,y,z] of image VImage VImage::pow( std::vector v ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_powtra_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = v.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[v.size()]; for( unsigned int i = 0; i < v.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = v[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_remainder: remainder after integer division VImage VImage::remainder( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_remainder" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_remainderconst: remainder after integer division by a constant VImage VImage::remainder( double x ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_remainderconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = x; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_remainderconst_vec: remainder after integer division by a vector of constants VImage VImage::remainder( std::vector x ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_remainderconst_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = x.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[x.size()]; for( unsigned int i = 0; i < x.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = x[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_rint: round to nearest integal value VImage VImage::rint() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rint" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_sign: unit vector in direction of value VImage VImage::sign() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_sign" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_sintra: sin of image (angles in degrees) VImage VImage::sin() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_sintra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_stats: many image statistics in one pass VDMask VImage::stats() throw( VError ) { VImage in = *this; VDMask statistics; Vargv _vec( "im_stats" ); _vec.data(0) = in.image(); ((im_mask_object*) _vec.data(1))->name = (char*)"noname"; _vec.call(); statistics.embed( (DOUBLEMASK *)((im_mask_object*)_vec.data(1))->mask ); return( statistics ); } // im_subtract: subtract two images VImage VImage::subtract( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_subtract" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_tantra: tan of image (angles in degrees) VImage VImage::tan() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_tantra" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_andimage: bitwise and of two images VImage VImage::andimage( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_andimage" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_andimageconst: bitwise and of an image with a constant VImage VImage::andimage( int c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_andimageconst" ); _vec.data(0) = in1.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in1._ref ); return( out ); } // im_andimage_vec: bitwise and of an image with a vector constant VImage VImage::andimage( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_andimage_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_orimage: bitwise or of two images VImage VImage::orimage( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_orimage" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_orimageconst: bitwise or of an image with a constant VImage VImage::orimage( int c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_orimageconst" ); _vec.data(0) = in1.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in1._ref ); return( out ); } // im_orimage_vec: bitwise or of an image with a vector constant VImage VImage::orimage( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_orimage_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_eorimage: bitwise eor of two images VImage VImage::eorimage( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_eorimage" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_eorimageconst: bitwise eor of an image with a constant VImage VImage::eorimage( int c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_eorimageconst" ); _vec.data(0) = in1.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in1._ref ); return( out ); } // im_eorimage_vec: bitwise eor of an image with a vector constant VImage VImage::eorimage( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_eorimage_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_shiftleft: shift integer image n bits to left VImage VImage::shiftleft( int c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_shiftleft" ); _vec.data(0) = in1.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in1._ref ); return( out ); } // im_shiftright: shift integer image n bits to right VImage VImage::shiftright( int c ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_shiftright" ); _vec.data(0) = in1.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in1._ref ); return( out ); } // im_LCh2Lab: convert LCh to Lab VImage VImage::LCh2Lab() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LCh2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LCh2UCS: convert LCh to UCS VImage VImage::LCh2UCS() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LCh2UCS" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2LCh: convert Lab to LCh VImage VImage::Lab2LCh() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2LCh" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2LabQ: convert Lab to LabQ VImage VImage::Lab2LabQ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2LabQ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2LabS: convert Lab to LabS VImage VImage::Lab2LabS() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2LabS" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2UCS: convert Lab to UCS VImage VImage::Lab2UCS() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2UCS" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2XYZ: convert D65 Lab to XYZ VImage VImage::Lab2XYZ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2XYZ_temp: convert Lab to XYZ, with a specified colour temperature VImage VImage::Lab2XYZ_temp( double X0, double Y0, double Z0 ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2XYZ_temp" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = X0; *((double*) _vec.data(3)) = Y0; *((double*) _vec.data(4)) = Z0; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Lab2disp: convert Lab to displayable VImage VImage::Lab2disp( VDisplay disp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Lab2disp" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = disp.disp(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabQ2LabS: convert LabQ to LabS VImage VImage::LabQ2LabS() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabQ2LabS" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabQ2Lab: convert LabQ to Lab VImage VImage::LabQ2Lab() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabQ2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabQ2XYZ: convert LabQ to XYZ VImage VImage::LabQ2XYZ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabQ2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabQ2disp: convert LabQ to displayable VImage VImage::LabQ2disp( VDisplay disp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabQ2disp" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = disp.disp(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabS2LabQ: convert LabS to LabQ VImage VImage::LabS2LabQ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabS2LabQ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_LabS2Lab: convert LabS to Lab VImage VImage::LabS2Lab() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_LabS2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_UCS2LCh: convert UCS to LCh VImage VImage::UCS2LCh() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_UCS2LCh" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_UCS2Lab: convert UCS to Lab VImage VImage::UCS2Lab() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_UCS2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_UCS2XYZ: convert UCS to XYZ VImage VImage::UCS2XYZ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_UCS2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2Lab: convert D65 XYZ to Lab VImage VImage::XYZ2Lab() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2Lab_temp: convert XYZ to Lab, with a specified colour temperature VImage VImage::XYZ2Lab_temp( double X0, double Y0, double Z0 ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2Lab_temp" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = X0; *((double*) _vec.data(3)) = Y0; *((double*) _vec.data(4)) = Z0; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2UCS: convert XYZ to UCS VImage VImage::XYZ2UCS() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2UCS" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2Yxy: convert XYZ to Yxy VImage VImage::XYZ2Yxy() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2Yxy" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2disp: convert XYZ to displayble VImage VImage::XYZ2disp( VDisplay disp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2disp" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = disp.disp(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_XYZ2sRGB: convert XYZ to sRGB VImage VImage::XYZ2sRGB() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_XYZ2sRGB" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_Yxy2XYZ: convert Yxy to XYZ VImage VImage::Yxy2XYZ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_Yxy2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_dE00_fromLab: calculate delta-E CIE2000 for two Lab images VImage VImage::dE00_fromLab( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dE00_fromLab" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_dECMC_fromLab: calculate delta-E CMC(1:1) for two Lab images VImage VImage::dECMC_fromLab( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dECMC_fromLab" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_dECMC_fromdisp: calculate delta-E CMC(1:1) for two displayable images VImage VImage::dECMC_fromdisp( VImage in2, VDisplay disp ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dECMC_fromdisp" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.data(3) = disp.disp(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_dE_fromLab: calculate delta-E for two Lab images VImage VImage::dE_fromLab( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dE_fromLab" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_dE_fromXYZ: calculate delta-E for two XYZ images VImage VImage::dE_fromXYZ( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dE_fromXYZ" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_dE_fromdisp: calculate delta-E for two displayable images VImage VImage::dE_fromdisp( VImage in2, VDisplay disp ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_dE_fromdisp" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.data(3) = disp.disp(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_disp2Lab: convert displayable to Lab VImage VImage::disp2Lab( VDisplay disp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_disp2Lab" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = disp.disp(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_disp2XYZ: convert displayable to XYZ VImage VImage::disp2XYZ( VDisplay disp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_disp2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = disp.disp(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_ac2rc: convert LAB from AC to RC using an ICC profile VImage VImage::icc_ac2rc( char* profile ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_ac2rc" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = (im_object) profile; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_export: convert a float LAB to an 8-bit device image with an ICC profile VImage VImage::icc_export( char* output_profile, int intent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_export" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = (im_object) output_profile; *((int*) _vec.data(3)) = intent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_export_depth: convert a float LAB to device space with an ICC profile VImage VImage::icc_export_depth( int depth, char* output_profile, int intent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_export_depth" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = depth; _vec.data(3) = (im_object) output_profile; *((int*) _vec.data(4)) = intent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_import: convert a device image to float LAB with an ICC profile VImage VImage::icc_import( char* input_profile, int intent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_import" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = (im_object) input_profile; *((int*) _vec.data(3)) = intent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_import_embedded: convert a device image to float LAB using the embedded profile VImage VImage::icc_import_embedded( int intent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_import_embedded" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = intent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_icc_transform: convert between two device images with a pair of ICC profiles VImage VImage::icc_transform( char* input_profile, char* output_profile, int intent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_icc_transform" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = (im_object) input_profile; _vec.data(3) = (im_object) output_profile; *((int*) _vec.data(4)) = intent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lab_morph: morph colourspace of a LAB image VImage VImage::lab_morph( VDMask greyscale, double L_offset, double L_scale, double a_scale, double b_scale ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lab_morph" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = greyscale.mask().dptr; *((double*) _vec.data(3)) = L_offset; *((double*) _vec.data(4)) = L_scale; *((double*) _vec.data(5)) = a_scale; *((double*) _vec.data(6)) = b_scale; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_sRGB2XYZ: convert sRGB to XYZ VImage VImage::sRGB2XYZ() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_sRGB2XYZ" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_bandjoin: bandwise join of two images VImage VImage::bandjoin( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_bandjoin" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_black: generate black image VImage VImage::black( int x_size, int y_size, int bands ) throw( VError ) { VImage output; Vargv _vec( "im_black" ); _vec.data(0) = output.image(); *((int*) _vec.data(1)) = x_size; *((int*) _vec.data(2)) = y_size; *((int*) _vec.data(3)) = bands; _vec.call(); return( output ); } // im_c2amph: convert real and imaginary to phase and amplitude VImage VImage::c2amph() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_c2amph" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_c2imag: extract imaginary part of complex image VImage VImage::c2imag() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_c2imag" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_c2ps: find power spectrum of complex image VImage VImage::c2ps() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_c2ps" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_c2real: extract real part of complex image VImage VImage::c2real() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_c2real" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_c2rect: convert phase and amplitude to real and imaginary VImage VImage::c2rect() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_c2rect" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2c: convert to signed 8-bit integer VImage VImage::clip2c() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2c" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2cm: convert to complex VImage VImage::clip2cm() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2cm" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2d: convert to double-precision float VImage VImage::clip2d() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2d" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2dcm: convert to double complex VImage VImage::clip2dcm() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2dcm" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2f: convert to single-precision float VImage VImage::clip2f() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2f" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2fmt: convert image format to ofmt VImage VImage::clip2fmt( int ofmt ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2fmt" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = ofmt; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2i: convert to signed 32-bit integer VImage VImage::clip2i() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2i" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2s: convert to signed 16-bit integer VImage VImage::clip2s() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2s" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2ui: convert to unsigned 32-bit integer VImage VImage::clip2ui() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2ui" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip2us: convert to unsigned 16-bit integer VImage VImage::clip2us() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip2us" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_clip: convert to unsigned 8-bit integer VImage VImage::clip() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_clip" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_copy: copy image VImage VImage::copy() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_copy" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_copy_morph: copy image, setting pixel layout VImage VImage::copy_morph( int Bands, int BandFmt, int Coding ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_copy_morph" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = Bands; *((int*) _vec.data(3)) = BandFmt; *((int*) _vec.data(4)) = Coding; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_copy_swap: copy image, swapping byte order VImage VImage::copy_swap() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_copy_swap" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_copy_set: copy image, setting informational fields VImage VImage::copy_set( int Type, double Xres, double Yres, int Xoffset, int Yoffset ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_copy_set" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = Type; *((double*) _vec.data(3)) = Xres; *((double*) _vec.data(4)) = Yres; *((int*) _vec.data(5)) = Xoffset; *((int*) _vec.data(6)) = Yoffset; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_csv2vips: read a file in csv format VImage VImage::csv2vips( char* filename ) throw( VError ) { VImage im; Vargv _vec( "im_csv2vips" ); _vec.data(0) = (im_object) filename; _vec.data(1) = im.image(); _vec.call(); return( im ); } // im_extract_area: extract area VImage VImage::extract_area( int left, int top, int width, int height ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_extract_area" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = left; *((int*) _vec.data(3)) = top; *((int*) _vec.data(4)) = width; *((int*) _vec.data(5)) = height; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_extract_areabands: extract area and bands VImage VImage::extract_areabands( int left, int top, int width, int height, int band, int nbands ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_extract_areabands" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = left; *((int*) _vec.data(3)) = top; *((int*) _vec.data(4)) = width; *((int*) _vec.data(5)) = height; *((int*) _vec.data(6)) = band; *((int*) _vec.data(7)) = nbands; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_extract_band: extract band VImage VImage::extract_band( int band ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_extract_band" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = band; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_extract_bands: extract several bands VImage VImage::extract_bands( int band, int nbands ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_extract_bands" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = band; *((int*) _vec.data(3)) = nbands; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_extract: extract area/band VImage VImage::extract( int left, int top, int width, int height, int band ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_extract" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = left; *((int*) _vec.data(3)) = top; *((int*) _vec.data(4)) = width; *((int*) _vec.data(5)) = height; *((int*) _vec.data(6)) = band; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_falsecolour: turn luminance changes into chrominance changes VImage VImage::falsecolour() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_falsecolour" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_fliphor: flip image left-right VImage VImage::fliphor() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_fliphor" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_flipver: flip image top-bottom VImage VImage::flipver() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_flipver" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_gbandjoin: bandwise join of many images VImage VImage::gbandjoin( std::vector in ) throw( VError ) { VImage out; Vargv _vec( "im_gbandjoin" ); ((im_imagevec_object*) _vec.data(0))->n = in.size(); ((im_imagevec_object*) _vec.data(0))->vec = new IMAGE *[in.size()]; for( unsigned int i = 0; i < in.size(); i++ ) ((im_imagevec_object*) _vec.data(0))->vec[i] = in[i].image(); _vec.data(1) = out.image(); _vec.call(); for( unsigned int i = 0; i < in.size(); i++ ) out._ref->addref( in[i]._ref ); return( out ); } // im_grid: chop a tall thin image into a grid of images VImage VImage::grid( int tile_height, int across, int down ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_grid" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = tile_height; *((int*) _vec.data(3)) = across; *((int*) _vec.data(4)) = down; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_insert: insert sub-image into main image at position VImage VImage::insert( VImage sub, int x, int y ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_insert" ); _vec.data(0) = in.image(); _vec.data(1) = sub.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = x; *((int*) _vec.data(4)) = y; _vec.call(); out._ref->addref( in._ref ); out._ref->addref( sub._ref ); return( out ); } // im_insert_noexpand: insert sub-image into main image at position, no expansion VImage VImage::insert_noexpand( VImage sub, int x, int y ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_insert_noexpand" ); _vec.data(0) = in.image(); _vec.data(1) = sub.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = x; *((int*) _vec.data(4)) = y; _vec.call(); out._ref->addref( in._ref ); out._ref->addref( sub._ref ); return( out ); } // im_jpeg2vips: convert from jpeg VImage VImage::jpeg2vips( char* in ) throw( VError ) { VImage out; Vargv _vec( "im_jpeg2vips" ); _vec.data(0) = (im_object) in; _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_lrjoin: join two images left-right VImage VImage::lrjoin( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_lrjoin" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_magick2vips: load file with libMagick VImage VImage::magick2vips( char* in ) throw( VError ) { VImage out; Vargv _vec( "im_magick2vips" ); _vec.data(0) = (im_object) in; _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_mask2vips: convert DOUBLEMASK to VIPS image VImage VImage::mask2vips( VDMask input ) throw( VError ) { VImage output; Vargv _vec( "im_mask2vips" ); ((im_mask_object*) _vec.data(0))->mask = input.mask().dptr; _vec.data(1) = output.image(); _vec.call(); return( output ); } // im_msb: convert to uchar by discarding bits VImage VImage::msb() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_msb" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_msb_band: convert to single band uchar by discarding bits VImage VImage::msb_band( int band ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_msb_band" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = band; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_png2vips: convert PNG file to VIPS image VImage VImage::png2vips( char* in ) throw( VError ) { VImage out; Vargv _vec( "im_png2vips" ); _vec.data(0) = (im_object) in; _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_exr2vips: convert an OpenEXR file to VIPS VImage VImage::exr2vips( char* in ) throw( VError ) { VImage out; Vargv _vec( "im_exr2vips" ); _vec.data(0) = (im_object) in; _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_ppm2vips: read a file in pbm/pgm/ppm format VImage VImage::ppm2vips( char* filename ) throw( VError ) { VImage im; Vargv _vec( "im_ppm2vips" ); _vec.data(0) = (im_object) filename; _vec.data(1) = im.image(); _vec.call(); return( im ); } // im_analyze2vips: read a file in analyze format VImage VImage::analyze2vips( char* filename ) throw( VError ) { VImage im; Vargv _vec( "im_analyze2vips" ); _vec.data(0) = (im_object) filename; _vec.data(1) = im.image(); _vec.call(); return( im ); } // im_recomb: linear recombination with mask VImage VImage::recomb( VDMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_recomb" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().dptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_replicate: replicate an image horizontally and vertically VImage VImage::replicate( int across, int down ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_replicate" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = across; *((int*) _vec.data(3)) = down; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_ri2c: join two non-complex images to form complex VImage VImage::ri2c( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_ri2c" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_rot180: rotate image 180 degrees VImage VImage::rot180() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rot180" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_rot270: rotate image 270 degrees clockwise VImage VImage::rot270() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rot270" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_rot90: rotate image 90 degrees clockwise VImage VImage::rot90() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rot90" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_scale: scale image linearly to fit range 0-255 VImage VImage::scale() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_scale" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_scaleps: logarithmic scale of image to fit range 0-255 VImage VImage::scaleps() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_scaleps" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_rightshift_size: decrease size by a power-of-two factor VImage VImage::rightshift_size( int xshift, int yshift, int band_fmt ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rightshift_size" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = xshift; *((int*) _vec.data(3)) = yshift; *((int*) _vec.data(4)) = band_fmt; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_slice: slice an image using two thresholds VImage VImage::slice( double thresh1, double thresh2 ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_slice" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((double*) _vec.data(2)) = thresh1; *((double*) _vec.data(3)) = thresh2; _vec.call(); return( output ); } // im_subsample: subsample image by integer factors VImage VImage::subsample( int xshrink, int yshrink ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_subsample" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = xshrink; *((int*) _vec.data(3)) = yshrink; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_system: run command on image char* VImage::system( char* command ) throw( VError ) { VImage im = *this; char* output; Vargv _vec( "im_system" ); _vec.data(0) = im.image(); _vec.data(1) = (im_object) command; _vec.call(); output = (char*) _vec.data(2); return( output ); } // im_tbjoin: join two images top-bottom VImage VImage::tbjoin( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_tbjoin" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_text: generate text image VImage VImage::text( char* text, char* font, int width, int alignment, int dpi ) throw( VError ) { VImage out; Vargv _vec( "im_text" ); _vec.data(0) = out.image(); _vec.data(1) = (im_object) text; _vec.data(2) = (im_object) font; *((int*) _vec.data(3)) = width; *((int*) _vec.data(4)) = alignment; *((int*) _vec.data(5)) = dpi; _vec.call(); return( out ); } // im_thresh: slice an image at a threshold VImage VImage::thresh( double threshold ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_thresh" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((double*) _vec.data(2)) = threshold; _vec.call(); return( output ); } // im_tiff2vips: convert TIFF file to VIPS image VImage VImage::tiff2vips( char* in ) throw( VError ) { VImage out; Vargv _vec( "im_tiff2vips" ); _vec.data(0) = (im_object) in; _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_vips2csv: write an image in csv format void VImage::vips2csv( char* filename ) throw( VError ) { VImage in = *this; Vargv _vec( "im_vips2csv" ); _vec.data(0) = in.image(); _vec.data(1) = (im_object) filename; _vec.call(); } // im_vips2jpeg: convert to jpeg void VImage::vips2jpeg( char* out ) throw( VError ) { VImage in = *this; Vargv _vec( "im_vips2jpeg" ); _vec.data(0) = in.image(); _vec.data(1) = (im_object) out; _vec.call(); } // im_vips2mask: convert VIPS image to DOUBLEMASK VDMask VImage::vips2mask() throw( VError ) { VImage input = *this; VDMask output; Vargv _vec( "im_vips2mask" ); _vec.data(0) = input.image(); ((im_mask_object*) _vec.data(1))->name = (char*)"noname"; _vec.call(); output.embed( (DOUBLEMASK *)((im_mask_object*)_vec.data(1))->mask ); return( output ); } // im_vips2mimejpeg: convert to jpeg as mime type on stdout void VImage::vips2mimejpeg( int qfac ) throw( VError ) { VImage in = *this; Vargv _vec( "im_vips2mimejpeg" ); _vec.data(0) = in.image(); *((int*) _vec.data(1)) = qfac; _vec.call(); } // im_vips2png: convert VIPS image to PNG file void VImage::vips2png( char* out ) throw( VError ) { VImage in = *this; Vargv _vec( "im_vips2png" ); _vec.data(0) = in.image(); _vec.data(1) = (im_object) out; _vec.call(); } // im_vips2ppm: write a file in pbm/pgm/ppm format void VImage::vips2ppm( char* filename ) throw( VError ) { VImage im = *this; Vargv _vec( "im_vips2ppm" ); _vec.data(0) = im.image(); _vec.data(1) = (im_object) filename; _vec.call(); } // im_vips2tiff: convert VIPS image to TIFF file void VImage::vips2tiff( char* out ) throw( VError ) { VImage in = *this; Vargv _vec( "im_vips2tiff" ); _vec.data(0) = in.image(); _vec.data(1) = (im_object) out; _vec.call(); } // im_zoom: simple zoom of an image by integer factors VImage VImage::zoom( int xfac, int yfac ) throw( VError ) { VImage input = *this; VImage output; Vargv _vec( "im_zoom" ); _vec.data(0) = input.image(); _vec.data(1) = output.image(); *((int*) _vec.data(2)) = xfac; *((int*) _vec.data(3)) = yfac; _vec.call(); output._ref->addref( input._ref ); return( output ); } // im_addgnoise: add gaussian noise with mean 0 and std. dev. sigma VImage VImage::addgnoise( double sigma ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_addgnoise" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = sigma; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_compass: convolve with 8-way rotating integer mask VImage VImage::compass( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_compass" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_contrast_surface: find high-contrast points in an image VImage VImage::contrast_surface( int half_win_size, int spacing ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_contrast_surface" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = half_win_size; *((int*) _vec.data(3)) = spacing; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_contrast_surface_raw: find high-contrast points in an image VImage VImage::contrast_surface_raw( int half_win_size, int spacing ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_contrast_surface_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = half_win_size; *((int*) _vec.data(3)) = spacing; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_conv: convolve VImage VImage::conv( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_conv" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_conv_raw: convolve, no border VImage VImage::conv_raw( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_conv_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convf: convolve, with DOUBLEMASK VImage VImage::convf( VDMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convf" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().dptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convf_raw: convolve, with DOUBLEMASK, no border VImage VImage::convf_raw( VDMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convf_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().dptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convsep: seperable convolution VImage VImage::convsep( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convsep" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convsep_raw: seperable convolution, no border VImage VImage::convsep_raw( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convsep_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convsepf: seperable convolution, with DOUBLEMASK VImage VImage::convsepf( VDMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convsepf" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().dptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convsepf_raw: seperable convolution, with DOUBLEMASK, no border VImage VImage::convsepf_raw( VDMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convsepf_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().dptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_convsub: convolve uchar to uchar, sub-sampling by xskip, yskip VImage VImage::convsub( VIMask matrix, int xskip, int yskip ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_convsub" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; *((int*) _vec.data(3)) = xskip; *((int*) _vec.data(4)) = yskip; _vec.call(); return( out ); } // im_embed: embed in within a set of borders VImage VImage::embed( int type, int x, int y, int w, int h ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_embed" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = type; *((int*) _vec.data(3)) = x; *((int*) _vec.data(4)) = y; *((int*) _vec.data(5)) = w; *((int*) _vec.data(6)) = h; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_fastcor: fast correlate in2 within in1 VImage VImage::fastcor( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_fastcor" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_fastcor_raw: fast correlate in2 within in1, no border VImage VImage::fastcor_raw( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_fastcor_raw" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_gaussnoise: generate image of gaussian noise with specified statistics VImage VImage::gaussnoise( int xsize, int ysize, double mean, double sigma ) throw( VError ) { VImage out; Vargv _vec( "im_gaussnoise" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; *((double*) _vec.data(3)) = mean; *((double*) _vec.data(4)) = sigma; _vec.call(); return( out ); } // im_grad_x: x component of gradient of image VImage VImage::grad_x() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_grad_x" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_grad_y: y component of gradient of image VImage VImage::grad_y() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_grad_y" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_gradcor: non-normalised correlation of gradient of in2 within in1 VImage VImage::gradcor( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_gradcor" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_gradcor_raw: non-normalised correlation of gradient of in2 within in1, no padding VImage VImage::gradcor_raw( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_gradcor_raw" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_gradient: convolve with 2-way rotating mask VImage VImage::gradient( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_gradient" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_rank_image: point-wise pixel rank VImage VImage::rank_image( std::vector in, int index ) throw( VError ) { VImage out; Vargv _vec( "im_rank_image" ); ((im_imagevec_object*) _vec.data(0))->n = in.size(); ((im_imagevec_object*) _vec.data(0))->vec = new IMAGE *[in.size()]; for( unsigned int i = 0; i < in.size(); i++ ) ((im_imagevec_object*) _vec.data(0))->vec[i] = in[i].image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = index; _vec.call(); for( unsigned int i = 0; i < in.size(); i++ ) out._ref->addref( in[i]._ref ); return( out ); } // im_lindetect: convolve with 4-way rotating mask VImage VImage::lindetect( VIMask matrix ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lindetect" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = matrix.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_maxvalue: point-wise maximum value VImage VImage::maxvalue( std::vector in ) throw( VError ) { VImage out; Vargv _vec( "im_maxvalue" ); ((im_imagevec_object*) _vec.data(0))->n = in.size(); ((im_imagevec_object*) _vec.data(0))->vec = new IMAGE *[in.size()]; for( unsigned int i = 0; i < in.size(); i++ ) ((im_imagevec_object*) _vec.data(0))->vec[i] = in[i].image(); _vec.data(1) = out.image(); _vec.call(); for( unsigned int i = 0; i < in.size(); i++ ) out._ref->addref( in[i]._ref ); return( out ); } // im_mpercent: find threshold above which there are percent values int VImage::mpercent( double percent ) throw( VError ) { VImage in = *this; int thresh; Vargv _vec( "im_mpercent" ); _vec.data(0) = in.image(); *((double*) _vec.data(1)) = percent; _vec.call(); thresh = *((int*)_vec.data(2)); return( thresh ); } // im_rank: rank filter nth element of xsize/ysize window VImage VImage::rank( int xsize, int ysize, int n ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rank" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = xsize; *((int*) _vec.data(3)) = ysize; *((int*) _vec.data(4)) = n; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_rank_raw: rank filter nth element of xsize/ysize window, no border VImage VImage::rank_raw( int xsize, int ysize, int n ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rank_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = xsize; *((int*) _vec.data(3)) = ysize; *((int*) _vec.data(4)) = n; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_resize_linear: resize to X by Y pixels with linear interpolation VImage VImage::resize_linear( int X, int Y ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_resize_linear" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = X; *((int*) _vec.data(3)) = Y; _vec.call(); return( out ); } // im_sharpen: sharpen high frequencies of L channel of LabQ VImage VImage::sharpen( int mask_size, double x1, double y2, double y3, double m1, double m2 ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_sharpen" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = mask_size; *((double*) _vec.data(3)) = x1; *((double*) _vec.data(4)) = y2; *((double*) _vec.data(5)) = y3; *((double*) _vec.data(6)) = m1; *((double*) _vec.data(7)) = m2; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_shrink: shrink image by xfac, yfac times VImage VImage::shrink( double xfac, double yfac ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_shrink" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = xfac; *((double*) _vec.data(3)) = yfac; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_spcor: normalised correlation of in2 within in1 VImage VImage::spcor( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_spcor" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_spcor_raw: normalised correlation of in2 within in1, no black padding VImage VImage::spcor_raw( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_spcor_raw" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_spcor2: normalised correlation of in2 within in1 VImage VImage::spcor2( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_spcor2" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_spcor2_raw: normalised correlation of in2 within in1, no black padding VImage VImage::spcor2_raw( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_spcor2_raw" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_stretch3: stretch 3%, sub-pixel displace by xdisp/ydisp VImage VImage::stretch3( double xdisp, double ydisp ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_stretch3" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = xdisp; *((double*) _vec.data(3)) = ydisp; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_zerox: find +ve or -ve zero crossings in image VImage VImage::zerox( int flag ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_zerox" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = flag; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_create_fmask: create frequency domain filter mask VImage VImage::create_fmask( int width, int height, int type, double p1, double p2, double p3, double p4, double p5 ) throw( VError ) { VImage out; Vargv _vec( "im_create_fmask" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = width; *((int*) _vec.data(2)) = height; *((int*) _vec.data(3)) = type; *((double*) _vec.data(4)) = p1; *((double*) _vec.data(5)) = p2; *((double*) _vec.data(6)) = p3; *((double*) _vec.data(7)) = p4; *((double*) _vec.data(8)) = p5; _vec.call(); return( out ); } // im_disp_ps: make displayable power spectrum VImage VImage::disp_ps() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_disp_ps" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_flt_image_freq: frequency domain filter image VImage VImage::flt_image_freq( int type, double p1, double p2, double p3, double p4, double p5 ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_flt_image_freq" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = type; *((double*) _vec.data(3)) = p1; *((double*) _vec.data(4)) = p2; *((double*) _vec.data(5)) = p3; *((double*) _vec.data(6)) = p4; *((double*) _vec.data(7)) = p5; _vec.call(); return( out ); } // im_fractsurf: generate a fractal surface of given dimension VImage VImage::fractsurf( int size, double dimension ) throw( VError ) { VImage out; Vargv _vec( "im_fractsurf" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = size; *((double*) _vec.data(2)) = dimension; _vec.call(); return( out ); } // im_freqflt: frequency-domain filter of in with mask VImage VImage::freqflt( VImage mask ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_freqflt" ); _vec.data(0) = in.image(); _vec.data(1) = mask.image(); _vec.data(2) = out.image(); _vec.call(); return( out ); } // im_fwfft: forward fast-fourier transform VImage VImage::fwfft() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_fwfft" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_rotquad: rotate image quadrants to move origin to centre VImage VImage::rotquad() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_rotquad" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_invfft: inverse fast-fourier transform VImage VImage::invfft() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_invfft" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_invfftr: real part of inverse fast-fourier transform VImage VImage::invfftr() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_invfftr" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); return( out ); } // im_gammacorrect: gamma-correct image VImage VImage::gammacorrect( double exponent ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_gammacorrect" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = exponent; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_heq: histogram-equalise image VImage VImage::heq( int band_number ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_heq" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = band_number; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_hist: find and graph histogram of image VImage VImage::hist( int band_number ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_hist" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = band_number; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_histcum: turn histogram to cumulative histogram VImage VImage::histcum() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histcum" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_histeq: form histogram equalistion LUT VImage VImage::histeq() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histeq" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_histgr: find histogram of image VImage VImage::histgr( int band_number ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histgr" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = band_number; _vec.call(); return( out ); } // im_histnD: find 1D, 2D or 3D histogram of image VImage VImage::histnD( int bins ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histnD" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = bins; _vec.call(); return( out ); } // im_histnorm: form normalised histogram VImage VImage::histnorm() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histnorm" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_histplot: plot graph of histogram VImage VImage::histplot() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histplot" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_histspec: find histogram which will make pdf of in match ref VImage VImage::histspec( VImage ref ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_histspec" ); _vec.data(0) = in.image(); _vec.data(1) = ref.image(); _vec.data(2) = out.image(); _vec.call(); return( out ); } // im_hsp: match stats of in to stats of ref VImage VImage::hsp( VImage ref ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_hsp" ); _vec.data(0) = in.image(); _vec.data(1) = ref.image(); _vec.data(2) = out.image(); _vec.call(); return( out ); } // im_identity: generate identity histogram VImage VImage::identity( int nbands ) throw( VError ) { VImage out; Vargv _vec( "im_identity" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = nbands; _vec.call(); return( out ); } // im_identity_ushort: generate ushort identity histogram VImage VImage::identity_ushort( int nbands, int size ) throw( VError ) { VImage out; Vargv _vec( "im_identity_ushort" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = nbands; *((int*) _vec.data(2)) = size; _vec.call(); return( out ); } // im_ismonotonic: test LUT for monotonicity int VImage::ismonotonic() throw( VError ) { VImage lut = *this; int mono; Vargv _vec( "im_ismonotonic" ); _vec.data(0) = lut.image(); _vec.call(); mono = *((int*)_vec.data(1)); return( mono ); } // im_lhisteq: local histogram equalisation VImage VImage::lhisteq( int width, int height ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lhisteq" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = width; *((int*) _vec.data(3)) = height; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lhisteq_raw: local histogram equalisation, no border VImage VImage::lhisteq_raw( int width, int height ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lhisteq_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = width; *((int*) _vec.data(3)) = height; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_invertlut: generate correction table from set of measures VImage VImage::invertlut( VDMask measures, int lut_size ) throw( VError ) { VImage lut; Vargv _vec( "im_invertlut" ); ((im_mask_object*) _vec.data(0))->mask = measures.mask().dptr; _vec.data(1) = lut.image(); *((int*) _vec.data(2)) = lut_size; _vec.call(); return( lut ); } // im_buildlut: generate LUT table from set of x/y positions VImage VImage::buildlut( VDMask xyes ) throw( VError ) { VImage lut; Vargv _vec( "im_buildlut" ); ((im_mask_object*) _vec.data(0))->mask = xyes.mask().dptr; _vec.data(1) = lut.image(); _vec.call(); return( lut ); } // im_maplut: map image through LUT VImage VImage::maplut( VImage lut ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_maplut" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = lut.image(); _vec.call(); out._ref->addref( in._ref ); out._ref->addref( lut._ref ); return( out ); } // im_project: find horizontal and vertical projections of an image VImage VImage::project( VImage& vout ) throw( VError ) { VImage in = *this; VImage hout; Vargv _vec( "im_project" ); _vec.data(0) = in.image(); _vec.data(1) = hout.image(); _vec.data(2) = vout.image(); _vec.call(); return( hout ); } // im_stdif: statistical differencing VImage VImage::stdif( double a, double m0, double b, double s0, int xw, int yw ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_stdif" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = a; *((double*) _vec.data(3)) = m0; *((double*) _vec.data(4)) = b; *((double*) _vec.data(5)) = s0; *((int*) _vec.data(6)) = xw; *((int*) _vec.data(7)) = yw; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_stdif_raw: statistical differencing, no border VImage VImage::stdif_raw( double a, double m0, double b, double s0, int xw, int yw ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_stdif_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = a; *((double*) _vec.data(3)) = m0; *((double*) _vec.data(4)) = b; *((double*) _vec.data(5)) = s0; *((int*) _vec.data(6)) = xw; *((int*) _vec.data(7)) = yw; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_tone_analyse: analyse in and create LUT for tone adjustment VImage VImage::tone_analyse( double Ps, double Pm, double Ph, double S, double M, double H ) throw( VError ) { VImage in = *this; VImage hist; Vargv _vec( "im_tone_analyse" ); _vec.data(0) = in.image(); _vec.data(1) = hist.image(); *((double*) _vec.data(2)) = Ps; *((double*) _vec.data(3)) = Pm; *((double*) _vec.data(4)) = Ph; *((double*) _vec.data(5)) = S; *((double*) _vec.data(6)) = M; *((double*) _vec.data(7)) = H; _vec.call(); return( hist ); } // im_tone_build: create LUT for tone adjustment of LabS images VImage VImage::tone_build( double Lb, double Lw, double Ps, double Pm, double Ph, double S, double M, double H ) throw( VError ) { VImage hist; Vargv _vec( "im_tone_build" ); _vec.data(0) = hist.image(); *((double*) _vec.data(1)) = Lb; *((double*) _vec.data(2)) = Lw; *((double*) _vec.data(3)) = Ps; *((double*) _vec.data(4)) = Pm; *((double*) _vec.data(5)) = Ph; *((double*) _vec.data(6)) = S; *((double*) _vec.data(7)) = M; *((double*) _vec.data(8)) = H; _vec.call(); return( hist ); } // im_tone_build_range: create LUT for tone adjustment VImage VImage::tone_build_range( int in_max, int out_max, double Lb, double Lw, double Ps, double Pm, double Ph, double S, double M, double H ) throw( VError ) { VImage hist; Vargv _vec( "im_tone_build_range" ); _vec.data(0) = hist.image(); *((int*) _vec.data(1)) = in_max; *((int*) _vec.data(2)) = out_max; *((double*) _vec.data(3)) = Lb; *((double*) _vec.data(4)) = Lw; *((double*) _vec.data(5)) = Ps; *((double*) _vec.data(6)) = Pm; *((double*) _vec.data(7)) = Ph; *((double*) _vec.data(8)) = S; *((double*) _vec.data(9)) = M; *((double*) _vec.data(10)) = H; _vec.call(); return( hist ); } // im_tone_map: map L channel of LabS or LabQ image through LUT VImage VImage::tone_map( VImage lut ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_tone_map" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = lut.image(); _vec.call(); out._ref->addref( in._ref ); out._ref->addref( lut._ref ); return( out ); } // im_circle: plot circle on image void VImage::circle( int cx, int cy, int radius, int intensity ) throw( VError ) { VImage image = *this; Vargv _vec( "im_circle" ); _vec.data(0) = image.image(); *((int*) _vec.data(1)) = cx; *((int*) _vec.data(2)) = cy; *((int*) _vec.data(3)) = radius; *((int*) _vec.data(4)) = intensity; _vec.call(); } // im_flood_blob_copy: flood with ink from start_x, start_y while pixel == start pixel VImage VImage::flood_blob_copy( int start_x, int start_y, std::vector ink ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_flood_blob_copy" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = start_x; *((int*) _vec.data(3)) = start_y; ((im_doublevec_object*) _vec.data(4))->n = ink.size(); ((im_doublevec_object*) _vec.data(4))->vec = new double[ink.size()]; for( unsigned int i = 0; i < ink.size(); i++ ) ((im_doublevec_object*) _vec.data(4))->vec[i] = ink[i]; _vec.call(); return( out ); } // im_insertplace: draw image sub inside image main at position (x,y) void VImage::insertplace( VImage sub, int x, int y ) throw( VError ) { VImage main = *this; Vargv _vec( "im_insertplace" ); _vec.data(0) = main.image(); _vec.data(1) = sub.image(); *((int*) _vec.data(2)) = x; *((int*) _vec.data(3)) = y; _vec.call(); } // im_line: draw line between points (x1,y1) and (x2,y2) void VImage::line( int x1, int y1, int x2, int y2, int pelval ) throw( VError ) { VImage im = *this; Vargv _vec( "im_line" ); _vec.data(0) = im.image(); *((int*) _vec.data(1)) = x1; *((int*) _vec.data(2)) = y1; *((int*) _vec.data(3)) = x2; *((int*) _vec.data(4)) = y2; *((int*) _vec.data(5)) = pelval; _vec.call(); } // im_lineset: draw line between points (x1,y1) and (x2,y2) VImage VImage::lineset( VImage mask, VImage ink, std::vector x1, std::vector y1, std::vector x2, std::vector y2 ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lineset" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = mask.image(); _vec.data(3) = ink.image(); ((im_intvec_object*) _vec.data(4))->n = x1.size(); ((im_intvec_object*) _vec.data(4))->vec = new int[x1.size()]; for( unsigned int i = 0; i < x1.size(); i++ ) ((im_intvec_object*) _vec.data(4))->vec[i] = x1[i]; ((im_intvec_object*) _vec.data(5))->n = y1.size(); ((im_intvec_object*) _vec.data(5))->vec = new int[y1.size()]; for( unsigned int i = 0; i < y1.size(); i++ ) ((im_intvec_object*) _vec.data(5))->vec[i] = y1[i]; ((im_intvec_object*) _vec.data(6))->n = x2.size(); ((im_intvec_object*) _vec.data(6))->vec = new int[x2.size()]; for( unsigned int i = 0; i < x2.size(); i++ ) ((im_intvec_object*) _vec.data(6))->vec[i] = x2[i]; ((im_intvec_object*) _vec.data(7))->n = y2.size(); ((im_intvec_object*) _vec.data(7))->vec = new int[y2.size()]; for( unsigned int i = 0; i < y2.size(); i++ ) ((im_intvec_object*) _vec.data(7))->vec[i] = y2[i]; _vec.call(); return( out ); } // im_binfile: open a headerless binary file VImage VImage::binfile( char* filename, int width, int height, int bands, int offset ) throw( VError ) { VImage out; Vargv _vec( "im_binfile" ); _vec.data(0) = (im_object) filename; _vec.data(1) = out.image(); *((int*) _vec.data(2)) = width; *((int*) _vec.data(3)) = height; *((int*) _vec.data(4)) = bands; *((int*) _vec.data(5)) = offset; _vec.call(); return( out ); } // im_cache: cache results of an operation VImage VImage::cache( int tile_width, int tile_height, int max_tiles ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_cache" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = tile_width; *((int*) _vec.data(3)) = tile_height; *((int*) _vec.data(4)) = max_tiles; _vec.call(); return( out ); } // im_header_get_type: return field type int VImage::header_get_type( char* field ) throw( VError ) { VImage image = *this; int gtype; Vargv _vec( "im_header_get_type" ); _vec.data(0) = (im_object) field; _vec.data(1) = image.image(); _vec.call(); gtype = *((int*)_vec.data(2)); return( gtype ); } // im_header_int: extract int fields from header int VImage::header_int( char* field ) throw( VError ) { VImage image = *this; int value; Vargv _vec( "im_header_int" ); _vec.data(0) = (im_object) field; _vec.data(1) = image.image(); _vec.call(); value = *((int*)_vec.data(2)); return( value ); } // im_header_double: extract double fields from header double VImage::header_double( char* field ) throw( VError ) { VImage image = *this; double value; Vargv _vec( "im_header_double" ); _vec.data(0) = (im_object) field; _vec.data(1) = image.image(); _vec.call(); value = *((double*)_vec.data(2)); return( value ); } // im_header_string: extract string fields from header char* VImage::header_string( char* field ) throw( VError ) { VImage image = *this; char* value; Vargv _vec( "im_header_string" ); _vec.data(0) = (im_object) field; _vec.data(1) = image.image(); _vec.call(); value = (char*) _vec.data(2); return( value ); } // im_cntlines: count horizontal or vertical lines double VImage::cntlines( int direction ) throw( VError ) { VImage in = *this; double nlines; Vargv _vec( "im_cntlines" ); _vec.data(0) = in.image(); *((int*) _vec.data(2)) = direction; _vec.call(); nlines = *((double*)_vec.data(1)); return( nlines ); } // im_dilate: dilate image with mask, adding a black border VImage VImage::dilate( VIMask mask ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_dilate" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = mask.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_dilate_raw: dilate image with mask VImage VImage::dilate_raw( VIMask mask ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_dilate_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = mask.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_erode: erode image with mask, adding a black border VImage VImage::erode( VIMask mask ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_erode" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = mask.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_erode_raw: erode image with mask VImage VImage::erode_raw( VIMask mask ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_erode_raw" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_mask_object*) _vec.data(2))->mask = mask.mask().iptr; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_profile: find first horizontal/vertical edge VImage VImage::profile( int direction ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_profile" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = direction; _vec.call(); return( out ); } // im_affine: affine transform VImage VImage::affine( double a, double b, double c, double d, double dx, double dy, int x, int y, int w, int h ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_affine" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = a; *((double*) _vec.data(3)) = b; *((double*) _vec.data(4)) = c; *((double*) _vec.data(5)) = d; *((double*) _vec.data(6)) = dx; *((double*) _vec.data(7)) = dy; *((int*) _vec.data(8)) = x; *((int*) _vec.data(9)) = y; *((int*) _vec.data(10)) = w; *((int*) _vec.data(11)) = h; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_correl: search area around sec for match for area around ref double VImage::correl( VImage sec, int xref, int yref, int xsec, int ysec, int hwindowsize, int hsearchsize, int& x, int& y ) throw( VError ) { VImage ref = *this; double correlation; Vargv _vec( "im_correl" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); *((int*) _vec.data(2)) = xref; *((int*) _vec.data(3)) = yref; *((int*) _vec.data(4)) = xsec; *((int*) _vec.data(5)) = ysec; *((int*) _vec.data(6)) = hwindowsize; *((int*) _vec.data(7)) = hsearchsize; _vec.call(); correlation = *((double*)_vec.data(8)); x = *((int*)_vec.data(9)); y = *((int*)_vec.data(10)); return( correlation ); } // im__find_lroverlap: search for left-right overlap of ref and sec int VImage::_find_lroverlap( VImage sec, int bandno, int xr, int yr, int xs, int ys, int halfcorrelation, int halfarea, int& dy0, double& scale1, double& angle1, double& dx1, double& dy1 ) throw( VError ) { VImage ref = *this; int dx0; Vargv _vec( "im__find_lroverlap" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); *((int*) _vec.data(2)) = bandno; *((int*) _vec.data(3)) = xr; *((int*) _vec.data(4)) = yr; *((int*) _vec.data(5)) = xs; *((int*) _vec.data(6)) = ys; *((int*) _vec.data(7)) = halfcorrelation; *((int*) _vec.data(8)) = halfarea; _vec.call(); dx0 = *((int*)_vec.data(9)); dy0 = *((int*)_vec.data(10)); scale1 = *((double*)_vec.data(11)); angle1 = *((double*)_vec.data(12)); dx1 = *((double*)_vec.data(13)); dy1 = *((double*)_vec.data(14)); return( dx0 ); } // im__find_tboverlap: search for top-bottom overlap of ref and sec int VImage::_find_tboverlap( VImage sec, int bandno, int xr, int yr, int xs, int ys, int halfcorrelation, int halfarea, int& dy0, double& scale1, double& angle1, double& dx1, double& dy1 ) throw( VError ) { VImage ref = *this; int dx0; Vargv _vec( "im__find_tboverlap" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); *((int*) _vec.data(2)) = bandno; *((int*) _vec.data(3)) = xr; *((int*) _vec.data(4)) = yr; *((int*) _vec.data(5)) = xs; *((int*) _vec.data(6)) = ys; *((int*) _vec.data(7)) = halfcorrelation; *((int*) _vec.data(8)) = halfarea; _vec.call(); dx0 = *((int*)_vec.data(9)); dy0 = *((int*)_vec.data(10)); scale1 = *((double*)_vec.data(11)); angle1 = *((double*)_vec.data(12)); dx1 = *((double*)_vec.data(13)); dy1 = *((double*)_vec.data(14)); return( dx0 ); } // im_global_balance: automatically rebuild mosaic with balancing VImage VImage::global_balance( double gamma ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_global_balance" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = gamma; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_global_balancef: automatically rebuild mosaic with balancing, float output VImage VImage::global_balancef( double gamma ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_global_balancef" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = gamma; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lrmerge: left-right merge of in1 and in2 VImage VImage::lrmerge( VImage sec, int dx, int dy, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_lrmerge" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = dx; *((int*) _vec.data(4)) = dy; *((int*) _vec.data(5)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_lrmerge1: first-order left-right merge of ref and sec VImage VImage::lrmerge1( VImage sec, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_lrmerge1" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = xr1; *((int*) _vec.data(4)) = yr1; *((int*) _vec.data(5)) = xs1; *((int*) _vec.data(6)) = ys1; *((int*) _vec.data(7)) = xr2; *((int*) _vec.data(8)) = yr2; *((int*) _vec.data(9)) = xs2; *((int*) _vec.data(10)) = ys2; *((int*) _vec.data(11)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_lrmosaic: left-right mosaic of ref and sec VImage VImage::lrmosaic( VImage sec, int bandno, int xr, int yr, int xs, int ys, int halfcorrelation, int halfarea, int balancetype, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_lrmosaic" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = bandno; *((int*) _vec.data(4)) = xr; *((int*) _vec.data(5)) = yr; *((int*) _vec.data(6)) = xs; *((int*) _vec.data(7)) = ys; *((int*) _vec.data(8)) = halfcorrelation; *((int*) _vec.data(9)) = halfarea; *((int*) _vec.data(10)) = balancetype; *((int*) _vec.data(11)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_lrmosaic1: first-order left-right mosaic of ref and sec VImage VImage::lrmosaic1( VImage sec, int bandno, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, int halfcorrelation, int halfarea, int balancetype, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_lrmosaic1" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = bandno; *((int*) _vec.data(4)) = xr1; *((int*) _vec.data(5)) = yr1; *((int*) _vec.data(6)) = xs1; *((int*) _vec.data(7)) = ys1; *((int*) _vec.data(8)) = xr2; *((int*) _vec.data(9)) = yr2; *((int*) _vec.data(10)) = xs2; *((int*) _vec.data(11)) = ys2; *((int*) _vec.data(12)) = halfcorrelation; *((int*) _vec.data(13)) = halfarea; *((int*) _vec.data(14)) = balancetype; *((int*) _vec.data(15)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_match_linear: resample ref so that tie-points match VImage VImage::match_linear( VImage sec, int xref1, int yref1, int xsec1, int ysec1, int xref2, int yref2, int xsec2, int ysec2 ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_match_linear" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = xref1; *((int*) _vec.data(4)) = yref1; *((int*) _vec.data(5)) = xsec1; *((int*) _vec.data(6)) = ysec1; *((int*) _vec.data(7)) = xref2; *((int*) _vec.data(8)) = yref2; *((int*) _vec.data(9)) = xsec2; *((int*) _vec.data(10)) = ysec2; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_match_linear_search: search sec, then resample so that tie-points match VImage VImage::match_linear_search( VImage sec, int xref1, int yref1, int xsec1, int ysec1, int xref2, int yref2, int xsec2, int ysec2, int hwindowsize, int hsearchsize ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_match_linear_search" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = xref1; *((int*) _vec.data(4)) = yref1; *((int*) _vec.data(5)) = xsec1; *((int*) _vec.data(6)) = ysec1; *((int*) _vec.data(7)) = xref2; *((int*) _vec.data(8)) = yref2; *((int*) _vec.data(9)) = xsec2; *((int*) _vec.data(10)) = ysec2; *((int*) _vec.data(11)) = hwindowsize; *((int*) _vec.data(12)) = hsearchsize; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_remosaic: automatically rebuild mosaic with new files VImage VImage::remosaic( char* old_str, char* new_str ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_remosaic" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.data(2) = (im_object) old_str; _vec.data(3) = (im_object) new_str; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_similarity_area: output area xywh of similarity transformation VImage VImage::similarity_area( double a, double b, double dx, double dy, int x, int y, int w, int h ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_similarity_area" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = a; *((double*) _vec.data(3)) = b; *((double*) _vec.data(4)) = dx; *((double*) _vec.data(5)) = dy; *((int*) _vec.data(6)) = x; *((int*) _vec.data(7)) = y; *((int*) _vec.data(8)) = w; *((int*) _vec.data(9)) = h; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_similarity: similarity transformation VImage VImage::similarity( double a, double b, double dx, double dy ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_similarity" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = a; *((double*) _vec.data(3)) = b; *((double*) _vec.data(4)) = dx; *((double*) _vec.data(5)) = dy; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_tbmerge: top-bottom merge of in1 and in2 VImage VImage::tbmerge( VImage sec, int dx, int dy, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_tbmerge" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = dx; *((int*) _vec.data(4)) = dy; *((int*) _vec.data(5)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_tbmerge1: first-order top-bottom merge of in1 and in2 VImage VImage::tbmerge1( VImage sec, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_tbmerge1" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = xr1; *((int*) _vec.data(4)) = yr1; *((int*) _vec.data(5)) = xs1; *((int*) _vec.data(6)) = ys1; *((int*) _vec.data(7)) = xr2; *((int*) _vec.data(8)) = yr2; *((int*) _vec.data(9)) = xs2; *((int*) _vec.data(10)) = ys2; *((int*) _vec.data(11)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_tbmosaic: top-bottom mosaic of in1 and in2 VImage VImage::tbmosaic( VImage sec, int bandno, int xr, int yr, int xs, int ys, int halfcorrelation, int halfarea, int balancetype, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_tbmosaic" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = bandno; *((int*) _vec.data(4)) = xr; *((int*) _vec.data(5)) = yr; *((int*) _vec.data(6)) = xs; *((int*) _vec.data(7)) = ys; *((int*) _vec.data(8)) = halfcorrelation; *((int*) _vec.data(9)) = halfarea; *((int*) _vec.data(10)) = balancetype; *((int*) _vec.data(11)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_tbmosaic1: first-order top-bottom mosaic of ref and sec VImage VImage::tbmosaic1( VImage sec, int bandno, int xr1, int yr1, int xs1, int ys1, int xr2, int yr2, int xs2, int ys2, int halfcorrelation, int halfarea, int balancetype, int mwidth ) throw( VError ) { VImage ref = *this; VImage out; Vargv _vec( "im_tbmosaic1" ); _vec.data(0) = ref.image(); _vec.data(1) = sec.image(); _vec.data(2) = out.image(); *((int*) _vec.data(3)) = bandno; *((int*) _vec.data(4)) = xr1; *((int*) _vec.data(5)) = yr1; *((int*) _vec.data(6)) = xs1; *((int*) _vec.data(7)) = ys1; *((int*) _vec.data(8)) = xr2; *((int*) _vec.data(9)) = yr2; *((int*) _vec.data(10)) = xs2; *((int*) _vec.data(11)) = ys2; *((int*) _vec.data(12)) = halfcorrelation; *((int*) _vec.data(13)) = halfarea; *((int*) _vec.data(14)) = balancetype; *((int*) _vec.data(15)) = mwidth; _vec.call(); out._ref->addref( ref._ref ); out._ref->addref( sec._ref ); return( out ); } // im_benchmark: do something complicated for testing VImage VImage::benchmark() throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_benchmark" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_benchmark2: do something complicated for testing double VImage::benchmark2() throw( VError ) { VImage in = *this; double value; Vargv _vec( "im_benchmark2" ); _vec.data(0) = in.image(); _vec.call(); value = *((double*)_vec.data(1)); return( value ); } // im_benchmarkn: do something complicated for testing VImage VImage::benchmarkn( int n ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_benchmarkn" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((int*) _vec.data(2)) = n; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_eye: generate IM_BANDFMT_UCHAR [0,255] frequency/amplitude image VImage VImage::eye( int xsize, int ysize, double factor ) throw( VError ) { VImage out; Vargv _vec( "im_eye" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; *((double*) _vec.data(3)) = factor; _vec.call(); return( out ); } // im_grey: generate IM_BANDFMT_UCHAR [0,255] grey scale image VImage VImage::grey( int xsize, int ysize ) throw( VError ) { VImage out; Vargv _vec( "im_grey" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; _vec.call(); return( out ); } // im_feye: generate IM_BANDFMT_FLOAT [-1,1] frequency/amplitude image VImage VImage::feye( int xsize, int ysize, double factor ) throw( VError ) { VImage out; Vargv _vec( "im_feye" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; *((double*) _vec.data(3)) = factor; _vec.call(); return( out ); } // im_fgrey: generate IM_BANDFMT_FLOAT [0,1] grey scale image VImage VImage::fgrey( int xsize, int ysize ) throw( VError ) { VImage out; Vargv _vec( "im_fgrey" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; _vec.call(); return( out ); } // im_fzone: generate IM_BANDFMT_FLOAT [-1,1] zone plate image VImage VImage::fzone( int size ) throw( VError ) { VImage out; Vargv _vec( "im_fzone" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = size; _vec.call(); return( out ); } // im_make_xy: generate image with pixel value equal to coordinate VImage VImage::make_xy( int xsize, int ysize ) throw( VError ) { VImage out; Vargv _vec( "im_make_xy" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = xsize; *((int*) _vec.data(2)) = ysize; _vec.call(); return( out ); } // im_zone: generate IM_BANDFMT_UCHAR [0,255] zone plate image VImage VImage::zone( int size ) throw( VError ) { VImage out; Vargv _vec( "im_zone" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = size; _vec.call(); return( out ); } // im_blend: use cond image to blend between images in1 and in2 VImage VImage::blend( VImage in1, VImage in2 ) throw( VError ) { VImage cond = *this; VImage out; Vargv _vec( "im_blend" ); _vec.data(0) = cond.image(); _vec.data(1) = in1.image(); _vec.data(2) = in2.image(); _vec.data(3) = out.image(); _vec.call(); out._ref->addref( cond._ref ); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_equal: two images equal in value VImage VImage::equal( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_equal" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_equal_vec: image equals doublevec VImage VImage::equal( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_equal_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_equalconst: image equals const VImage VImage::equal( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_equalconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_ifthenelse: use cond image to choose pels from image in1 or in2 VImage VImage::ifthenelse( VImage in1, VImage in2 ) throw( VError ) { VImage cond = *this; VImage out; Vargv _vec( "im_ifthenelse" ); _vec.data(0) = cond.image(); _vec.data(1) = in1.image(); _vec.data(2) = in2.image(); _vec.data(3) = out.image(); _vec.call(); out._ref->addref( cond._ref ); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_less: in1 less than in2 in value VImage VImage::less( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_less" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_less_vec: in less than doublevec VImage VImage::less( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_less_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lessconst: in less than const VImage VImage::less( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lessconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lesseq: in1 less than or equal to in2 in value VImage VImage::lesseq( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_lesseq" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_lesseq_vec: in less than or equal to doublevec VImage VImage::lesseq( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lesseq_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_lesseqconst: in less than or equal to const VImage VImage::lesseq( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_lesseqconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_more: in1 more than in2 in value VImage VImage::more( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_more" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_more_vec: in more than doublevec VImage VImage::more( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_more_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_moreconst: in more than const VImage VImage::more( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_moreconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_moreeq: in1 more than or equal to in2 in value VImage VImage::moreeq( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_moreeq" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_moreeq_vec: in more than or equal to doublevec VImage VImage::moreeq( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_moreeq_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_moreeqconst: in more than or equal to const VImage VImage::moreeq( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_moreeqconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_notequal: two images not equal in value VImage VImage::notequal( VImage in2 ) throw( VError ) { VImage in1 = *this; VImage out; Vargv _vec( "im_notequal" ); _vec.data(0) = in1.image(); _vec.data(1) = in2.image(); _vec.data(2) = out.image(); _vec.call(); out._ref->addref( in1._ref ); out._ref->addref( in2._ref ); return( out ); } // im_notequal_vec: image does not equal doublevec VImage VImage::notequal( std::vector vec ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_notequal_vec" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); ((im_doublevec_object*) _vec.data(2))->n = vec.size(); ((im_doublevec_object*) _vec.data(2))->vec = new double[vec.size()]; for( unsigned int i = 0; i < vec.size(); i++ ) ((im_doublevec_object*) _vec.data(2))->vec[i] = vec[i]; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_notequalconst: image does not equal const VImage VImage::notequal( double c ) throw( VError ) { VImage in = *this; VImage out; Vargv _vec( "im_notequalconst" ); _vec.data(0) = in.image(); _vec.data(1) = out.image(); *((double*) _vec.data(2)) = c; _vec.call(); out._ref->addref( in._ref ); return( out ); } // im_video_test: test video grabber VImage VImage::video_test( int brightness, int error ) throw( VError ) { VImage out; Vargv _vec( "im_video_test" ); _vec.data(0) = out.image(); *((int*) _vec.data(1)) = brightness; *((int*) _vec.data(2)) = error; _vec.call(); return( out ); } // im_video_v4l1: grab a video frame with v4l1 VImage VImage::video_v4l1( char* device, int channel, int brightness, int colour, int contrast, int hue, int ngrabs ) throw( VError ) { VImage out; Vargv _vec( "im_video_v4l1" ); _vec.data(0) = out.image(); _vec.data(1) = (im_object) device; *((int*) _vec.data(2)) = channel; *((int*) _vec.data(3)) = brightness; *((int*) _vec.data(4)) = colour; *((int*) _vec.data(5)) = contrast; *((int*) _vec.data(6)) = hue; *((int*) _vec.data(7)) = ngrabs; _vec.call(); return( out ); }