From 30364aada32eabe5dfd2f7d5a98d6ee4d2cc906f Mon Sep 17 00:00:00 2001 From: John Cupitt Date: Tue, 13 Aug 2013 16:03:20 +0100 Subject: [PATCH] redo im_heq() as a class --- ChangeLog | 3 +- libvips/deprecated/vips7compat.c | 17 ++++ libvips/histogram/Makefile.am | 2 +- libvips/histogram/hist_equal.c | 146 +++++++++++++++++++++++++++++ libvips/histogram/histogram.c | 2 + libvips/histogram/im_heq.c | 79 ---------------- libvips/include/vips/histogram.h | 3 +- libvips/include/vips/vips7compat.h | 1 + 8 files changed, 171 insertions(+), 82 deletions(-) create mode 100644 libvips/histogram/hist_equal.c delete mode 100644 libvips/histogram/im_heq.c diff --git a/ChangeLog b/ChangeLog index 5e4a7c82..abef4d30 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,7 +3,8 @@ - rename image arrays as image matrices ... INTERPRETATION_ARRAY -> INTERPRETATION_MATRIX etc. - rewrite im_buildlut(), im_identity*(), im_maplut(), im_falsecolour(), - im_gammacorrect(), im_histgr(), im_histcum(), im_histnorm() as classes + im_gammacorrect(), im_histgr(), im_histcum(), im_histnorm(), im_heq() + as classes - added vips_error_freeze() / vips_error_thaw() - used freeze() / thaw() to stop file format sniffers logging spurious errors - vipsthumbnail uses embedded jpg thumbnails if it can diff --git a/libvips/deprecated/vips7compat.c b/libvips/deprecated/vips7compat.c index 6842828d..a3387cce 100644 --- a/libvips/deprecated/vips7compat.c +++ b/libvips/deprecated/vips7compat.c @@ -3371,6 +3371,23 @@ im_histeq( IMAGE *in, IMAGE *out ) return( 0 ); } +int +im_heq( VipsImage *in, VipsImage *out, int bandno ) +{ + VipsImage *x; + + if( vips_hist_equal( in, &x, "band", bandno, NULL ) ) + return( -1 ); + + if( im_copy( x, out ) ) { + g_object_unref( x ); + return( -1 ); + } + g_object_unref( x ); + + return( 0 ); +} + int im_hist( IMAGE *in, IMAGE *out, int bandno ) { diff --git a/libvips/histogram/Makefile.am b/libvips/histogram/Makefile.am index 443c4df2..e41ac1d8 100644 --- a/libvips/histogram/Makefile.am +++ b/libvips/histogram/Makefile.am @@ -8,9 +8,9 @@ libhistogram_la_SOURCES = \ hist_buffer.h \ hist_cum.c \ hist_norm.c \ + hist_equal.c \ \ hist_dispatch.c \ - im_heq.c \ im_histnD.c \ im_histplot.c \ im_histindexed.c \ diff --git a/libvips/histogram/hist_equal.c b/libvips/histogram/hist_equal.c new file mode 100644 index 00000000..32efa294 --- /dev/null +++ b/libvips/histogram/hist_equal.c @@ -0,0 +1,146 @@ +/* Histogram-equalise an image. + * + * Copyright: 1991, N. Dessipris. + * + * Author: Nicos Dessipris + * Written on: 27/03/1991 + * Modified on : + * 16/6/93 J.Cupitt + * - im_ioflag() changed to im_iocheck() + * 24/5/95 JC + * - ANSIfied and tidied up + * 3/3/01 JC + * - more cleanup + * 23/3/10 + * - gtkdoc + * 12/8/13 + * - 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 "phistogram.h" + +typedef struct _VipsHistEqual { + VipsHistogram parent_instance; + + /* -1 for all bands, or the band we scan. + */ + int which; +} VipsHistEqual; + +typedef VipsHistogramClass VipsHistEqualClass; + +G_DEFINE_TYPE( VipsHistEqual, vips_hist_equal, VIPS_TYPE_HISTOGRAM ); + +static int +vips_hist_equal_build( VipsObject *object ) +{ + VipsHistogram *histogram = VIPS_HISTOGRAM( object ); + VipsHistEqual *hist_equal = (VipsHistEqual *) histogram; + VipsImage **t = (VipsImage **) vips_object_local_array( object, 4 ); + + if( VIPS_OBJECT_CLASS( vips_hist_equal_parent_class )->build( object ) ) + return( -1 ); + + if( vips_hist_find( histogram->in, &t[0], + "band", hist_equal->which, + NULL ) || + vips_hist_cum( t[0], &t[1], NULL ) || + vips_hist_norm( t[1], &t[2], NULL ) || + vips_maplut( histogram->in, &t[3], t[2], NULL ) || + vips_image_write( t[3], histogram->out ) ) + return( -1 ); + + return( 0 ); +} + +static void +vips_hist_equal_class_init( VipsHistEqualClass *class ) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS( class ); + VipsObjectClass *object_class = (VipsObjectClass *) class; + + gobject_class->set_property = vips_object_set_property; + gobject_class->get_property = vips_object_get_property; + + object_class->nickname = "hist_equal"; + object_class->description = _( "histogram equalisation" ); + object_class->build = vips_hist_equal_build; + + VIPS_ARG_INT( class, "band", 110, + _( "Band" ), + _( "Equalise with this band" ), + VIPS_ARGUMENT_OPTIONAL_INPUT, + G_STRUCT_OFFSET( VipsHistEqual, which ), + -1, 100000, -1 ); +} + +static void +vips_hist_equal_init( VipsHistEqual *hist_equal ) +{ + hist_equal->which = -1; +} + +/** + * vips_hist_equal: + * @in: input image + * @out: output image + * + * Optional arguments: + * + * @band: band to equalise + * + * Histogram-equalise @in. Equalise using band @bandno, or if @bandno is -1, + * equalise bands independently. + * + * See also: + * + * Returns: 0 on success, -1 on error + */ +int +vips_hist_equal( VipsImage *in, VipsImage **out, ... ) +{ + va_list ap; + int result; + + va_start( ap, out ); + result = vips_call_split( "hist_equal", ap, in, out ); + va_end( ap ); + + return( result ); +} diff --git a/libvips/histogram/histogram.c b/libvips/histogram/histogram.c index 9e962457..c8408271 100644 --- a/libvips/histogram/histogram.c +++ b/libvips/histogram/histogram.c @@ -136,8 +136,10 @@ vips_histogram_operation_init( void ) extern GType vips_maplut_get_type( void ); extern GType vips_hist_cum_get_type( void ); extern GType vips_hist_norm_get_type( void ); + extern GType vips_hist_equal_get_type( void ); vips_maplut_get_type(); vips_hist_cum_get_type(); vips_hist_norm_get_type(); + vips_hist_equal_get_type(); } diff --git a/libvips/histogram/im_heq.c b/libvips/histogram/im_heq.c deleted file mode 100644 index 6d985a17..00000000 --- a/libvips/histogram/im_heq.c +++ /dev/null @@ -1,79 +0,0 @@ -/* Histogram-equalise an image. - * - * Copyright: 1991, N. Dessipris. - * - * Author: Nicos Dessipris - * Written on: 27/03/1991 - * Modified on : - * 16/6/93 J.Cupitt - * - im_ioflag() changed to im_iocheck() - * 24/5/95 JC - * - ANSIfied and tidied up - * 3/3/01 JC - * - more cleanup - * 23/3/10 - * - 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 - -#include - -/** - * im_heq: - * @in: input image - * @out: output image - * @bandno: band to equalise - * - * Histogram-equalise @in. Equalise using band @bandno, or if @bandno is -1, - * equalise all bands. - * - * See also: im_lhisteq(), im_histgr(), im_histeq(). - * - * Returns: 0 on success, -1 on error - */ -int -im_heq( IMAGE *in, IMAGE *out, int bandno ) -{ - IMAGE *t[2]; - - if( im_open_local_array( out, t, 2, "im_heq", "p" ) || - im_histgr( in, t[0], bandno ) || - im_histeq( t[0], t[1] ) || - im_maplut( in, out, t[1] ) ) - return( -1 ); - - return( 0 ); -} diff --git a/libvips/include/vips/histogram.h b/libvips/include/vips/histogram.h index b9293f64..1afe9601 100644 --- a/libvips/include/vips/histogram.h +++ b/libvips/include/vips/histogram.h @@ -44,6 +44,8 @@ int vips_hist_cum( VipsImage *in, VipsImage **out, ... ) __attribute__((sentinel)); int vips_hist_norm( VipsImage *in, VipsImage **out, ... ) __attribute__((sentinel)); +int vips_hist_equal( VipsImage *in, VipsImage **out, ... ) + __attribute__((sentinel)); int im_histnD( VipsImage *in, VipsImage *out, int bins ); @@ -60,7 +62,6 @@ int im_hsp( VipsImage *in, VipsImage *ref, VipsImage *out ); int im_mpercent( VipsImage *in, double percent, int *out ); int im_mpercent_hist( VipsImage *hist, double percent, int *out ); -int im_heq( VipsImage *in, VipsImage *out, int bandno ); int im_lhisteq( VipsImage *in, VipsImage *out, int xwin, int ywin ); int im_stdif( VipsImage *in, VipsImage *out, double a, double m0, double b, double s0, int xwin, int ywin ); diff --git a/libvips/include/vips/vips7compat.h b/libvips/include/vips/vips7compat.h index 77cdc62f..1ef87008 100644 --- a/libvips/include/vips/vips7compat.h +++ b/libvips/include/vips/vips7compat.h @@ -855,6 +855,7 @@ int im_histgr( VipsImage *in, VipsImage *out, int bandno ); int im_histcum( VipsImage *in, VipsImage *out ); int im_histnorm( VipsImage *in, VipsImage *out ); int im_histeq( VipsImage *in, VipsImage *out ); +int im_heq( VipsImage *in, VipsImage *out, int bandno ); /* ruby-vips uses this */