redo im_heq() as a class
This commit is contained in:
parent
15dcb27916
commit
30364aada3
@ -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
|
||||
|
@ -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 )
|
||||
{
|
||||
|
@ -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 \
|
||||
|
146
libvips/histogram/hist_equal.c
Normal file
146
libvips/histogram/hist_equal.c
Normal file
@ -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 <config.h>
|
||||
#endif /*HAVE_CONFIG_H*/
|
||||
#include <vips/intl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
|
||||
#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 );
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
@ -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 <config.h>
|
||||
#endif /*HAVE_CONFIG_H*/
|
||||
#include <vips/intl.h>
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <vips/vips.h>
|
||||
|
||||
/**
|
||||
* 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 );
|
||||
}
|
@ -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 );
|
||||
|
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user