From f5b0722a13e4fe0e0356d43b0e0b17fa74274adc Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Tue, 7 Jan 2014 09:06:02 +0000 Subject: [PATCH] redo im_phasecor_fft() a s aclass --- ChangeLog | 4 +- TODO | 9 +- libvips/deprecated/vips7compat.c | 17 ++++ libvips/freqfilt/Makefile.am | 2 +- libvips/freqfilt/freqfilt.c | 2 + libvips/freqfilt/im_phasecor_fft.c | 72 -------------- libvips/freqfilt/phasecor.c | 150 +++++++++++++++++++++++++++++ libvips/include/vips/freqfilt.h | 3 +- libvips/include/vips/vips7compat.h | 1 + 9 files changed, 183 insertions(+), 77 deletions(-) delete mode 100644 libvips/freqfilt/im_phasecor_fft.c create mode 100644 libvips/freqfilt/phasecor.c diff --git a/ChangeLog b/ChangeLog index 8caada80..faf156f9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -32,8 +32,8 @@ - vipsthumbnail has a --crop option - remove video4linux1 code, it was useless on all modern linuxes - redone freq filter builders as classes -- redone im_fwfft(), im_invfft(), im_freqflt(), im_disp_ps(), im_fractsurf() - as classes +- redone im_fwfft(), im_invfft(), im_freqflt(), im_disp_ps(), im_fractsurf(), + im_phasecor() as classes 20/11/13 started 7.36.5 - better cache sizing in unbuffered sequential mode diff --git a/TODO b/TODO index 2d979028..fe7e5b4b 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,11 @@ -- freqfilt almost done +- fix cross-phase + + $ vips complex2 x.v x2.v x3.v cross-phase + vips_object_sanity: null object + ** VIPS:ERROR:image.c:2473:vips_image_pio_input: assertion failed: + (vips_object_sanity( VIPS_OBJECT( image ) )) + Aborted (core dumped) + - try: diff --git a/libvips/deprecated/vips7compat.c b/libvips/deprecated/vips7compat.c index deddbe98..3efdec01 100644 --- a/libvips/deprecated/vips7compat.c +++ b/libvips/deprecated/vips7compat.c @@ -4471,3 +4471,20 @@ im_fractsurf( IMAGE *out, int size, double frd ) return( 0 ); } + +int +im_phasecor_fft( IMAGE *in1, IMAGE *in2, IMAGE *out ) +{ + VipsImage *x; + + if( vips_phasecor( in1, in2, &x, NULL ) ) + return( -1 ); + + if( im_copy( x, out ) ) { + g_object_unref( x ); + return( -1 ); + } + g_object_unref( x ); + + return( 0 ); +} diff --git a/libvips/freqfilt/Makefile.am b/libvips/freqfilt/Makefile.am index ca9a0607..128b2b0f 100644 --- a/libvips/freqfilt/Makefile.am +++ b/libvips/freqfilt/Makefile.am @@ -7,7 +7,7 @@ libfreqfilt_la_SOURCES = \ invfft.c \ freqmult.c \ spectrum.c \ - im_phasecor_fft.c \ + phasecor.c \ freq_dispatch.c AM_CPPFLAGS = -I${top_srcdir}/libvips/include @VIPS_CFLAGS@ @VIPS_INCLUDES@ diff --git a/libvips/freqfilt/freqfilt.c b/libvips/freqfilt/freqfilt.c index 4124fe99..66f65b45 100644 --- a/libvips/freqfilt/freqfilt.c +++ b/libvips/freqfilt/freqfilt.c @@ -167,6 +167,7 @@ vips_freqfilt_operation_init( void ) #endif /*HAVE_FFTW*/ extern GType vips_freqmult_get_type( void ); extern GType vips_spectrum_get_type( void ); + extern GType vips_phasecor_get_type( void ); #ifdef HAVE_FFTW vips_fwfft_get_type(); @@ -174,5 +175,6 @@ vips_freqfilt_operation_init( void ) #endif /*HAVE_FFTW*/ vips_freqmult_get_type(); vips_spectrum_get_type(); + vips_phasecor_get_type(); } diff --git a/libvips/freqfilt/im_phasecor_fft.c b/libvips/freqfilt/im_phasecor_fft.c deleted file mode 100644 index 11e1b2a6..00000000 --- a/libvips/freqfilt/im_phasecor_fft.c +++ /dev/null @@ -1,72 +0,0 @@ -/* Like im_spcor(), but calculates phase correlation in the Fourier domain. - * - * Copyright: 2008, Nottingham Trent University - * - * Author: Tom Vajzovic - * Written on: 2008-01-16 - * 7/2/10 - * - cleanups - * - gtkdoc - */ - -/* - - This file is part of VIPS. - - VIPS is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA - - */ - -/* - - These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk - - */ - -#ifdef HAVE_CONFIG_H -#include -#endif /*HAVE_CONFIG_H*/ -#include - -#include - -/** - * im_phasecor_fft: - * @in1: first input image - * @in2: second input image - * @out: output image - * - * Convert the two input images to Fourier space, calculate phase-correlation, - * back to real space. - * - * See also: im_fwfft(), im_cross_phase(), - * - * Returns: 0 on success, -1 on error - */ -int -im_phasecor_fft( IMAGE *in1, IMAGE *in2, IMAGE *out ) -{ - IMAGE *t[3]; - - if( im_open_local_array( out, t, 3, "im_phasecor_fft", "p" ) || - im_fwfft( in1, t[0] ) || - im_fwfft( in2, t[1] ) || - im_cross_phase( t[0], t[1], t[2] ) || - im_invfftr( t[2], out ) ) - return( -1 ); - - return( 0 ); -} diff --git a/libvips/freqfilt/phasecor.c b/libvips/freqfilt/phasecor.c new file mode 100644 index 00000000..dad98928 --- /dev/null +++ b/libvips/freqfilt/phasecor.c @@ -0,0 +1,150 @@ +/* Like spcor, but calculates phase correlation in the Fourier domain. + * + * Copyright: 2008, Nottingham Trent University + * + * Author: Tom Vajzovic + * Written on: 2008-01-16 + * 7/2/10 + * - cleanups + * - gtkdoc + * 3/1/14 + * - redone as a class + */ + +/* + + This file is part of VIPS. + + VIPS is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA + + */ + +/* + + These files are distributed with VIPS - http://www.vips.ecs.soton.ac.uk + + */ + +#ifdef HAVE_CONFIG_H +#include +#endif /*HAVE_CONFIG_H*/ +#include + +#include +#include + +#include +#include "pfreqfilt.h" + +typedef struct _VipsPhasecor { + VipsFreqfilt parent_instance; + + VipsImage *in2; +} VipsPhasecor; + +typedef VipsFreqfiltClass VipsPhasecorClass; + +G_DEFINE_TYPE( VipsPhasecor, vips_phasecor, VIPS_TYPE_FREQFILT ); + +static int +vips_phasecor_build( VipsObject *object ) +{ + VipsFreqfilt *freqfilt = VIPS_FREQFILT( object ); + VipsPhasecor *phasecor = (VipsPhasecor *) object; + VipsImage **t = (VipsImage **) vips_object_local_array( object, 5 ); + + VipsImage *in1, *in2; + + if( VIPS_OBJECT_CLASS( vips_phasecor_parent_class )-> + build( object ) ) + return( -1 ); + + in1 = freqfilt->in; + in2 = phasecor->in2; + + if( in1->BandFmt != VIPS_FORMAT_COMPLEX ) { + if( vips_fwfft( in1, &t[0], NULL ) ) + return( -1 ); + in1 = t[0]; + } + + if( in2->BandFmt != VIPS_FORMAT_COMPLEX ) { + if( vips_fwfft( in2, &t[1], NULL ) ) + return( -1 ); + in2 = t[1]; + } + + if( vips_cross_phase( in1, in2, &t[2], NULL ) || + vips_invfft( t[2], &t[3], "real", TRUE, NULL ) || + vips_image_write( t[3], freqfilt->out ) ) + return( -1 ); + + return( 0 ); +} + +static void +vips_phasecor_class_init( VipsPhasecorClass *class ) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS( class ); + VipsObjectClass *vobject_class = VIPS_OBJECT_CLASS( class ); + + gobject_class->set_property = vips_object_set_property; + gobject_class->get_property = vips_object_get_property; + + vobject_class->nickname = "phasecor"; + vobject_class->description = _( "calculate phase correlation" ); + vobject_class->build = vips_phasecor_build; + + VIPS_ARG_IMAGE( class, "in2", 0, + _( "in2" ), + _( "Second input image" ), + VIPS_ARGUMENT_REQUIRED_INPUT, + G_STRUCT_OFFSET( VipsPhasecor, in2 ) ); + +} + +static void +vips_phasecor_init( VipsPhasecor *phasecor ) +{ +} + +/** + * vips_phasecor: + * @in1: first input image + * @in2: second input image + * @out: output image + * @...: %NULL-terminated list of optional named arguments + * + * Convert the two input images to Fourier space, calculate phase-correlation, + * back to real space. + * + * See also: vips_fwfft(), vips_cross_phase(), + * + * Returns: 0 on success, -1 on error. + */ +int +vips_phasecor( VipsImage *in1, VipsImage *in2, VipsImage **out, ... ) +{ + va_list ap; + int result; + + va_start( ap, out ); + result = vips_call_split( "phasecor", ap, in1, in2, out ); + va_end( ap ); + + return( result ); +} + diff --git a/libvips/include/vips/freqfilt.h b/libvips/include/vips/freqfilt.h index d2e66a8b..a46d38c6 100644 --- a/libvips/include/vips/freqfilt.h +++ b/libvips/include/vips/freqfilt.h @@ -49,7 +49,8 @@ int vips_freqmult( VipsImage *in, VipsImage *mask, VipsImage **out, ... ) int vips_spectrum( VipsImage *in, VipsImage **out, ... ) __attribute__((sentinel)); -int im_phasecor_fft( VipsImage *in1, VipsImage *in2, VipsImage *out ); +int vips_phasecor( VipsImage *in1, VipsImage *in2, VipsImage **out, ... ) + __attribute__((sentinel)); #ifdef __cplusplus } diff --git a/libvips/include/vips/vips7compat.h b/libvips/include/vips/vips7compat.h index 2b61d427..6020b17c 100644 --- a/libvips/include/vips/vips7compat.h +++ b/libvips/include/vips/vips7compat.h @@ -973,6 +973,7 @@ int im_invfftr( VipsImage *in, VipsImage *out ); int im_freqflt( VipsImage *in, VipsImage *mask, VipsImage *out ); int im_disp_ps( VipsImage *in, VipsImage *out ); int im_fractsurf( VipsImage *out, int size, double frd ); +int im_phasecor_fft( VipsImage *in1, VipsImage *in2, VipsImage *out ); #ifdef __cplusplus }