morph done phew
This commit is contained in:
parent
66a87b709d
commit
ceb3a6ec5c
@ -44,6 +44,8 @@
|
|||||||
- dilate/erode do (!=0) on non-uchar images
|
- dilate/erode do (!=0) on non-uchar images
|
||||||
- add multipass Orc to im_conv(), 3.5x faster for 5x5 mask
|
- add multipass Orc to im_conv(), 3.5x faster for 5x5 mask
|
||||||
- im_profile() works for any image format, any number of bands
|
- im_profile() works for any image format, any number of bands
|
||||||
|
- im_rank_image() works for mix of formats, bands
|
||||||
|
- morph gtk-doc done
|
||||||
|
|
||||||
12/5/10 started 7.22.2
|
12/5/10 started 7.22.2
|
||||||
- the conditional image of ifthenelse can be any format, a (!=0) is added if
|
- the conditional image of ifthenelse can be any format, a (!=0) is added if
|
||||||
|
@ -59,7 +59,7 @@ EXTRA_HFILES=
|
|||||||
|
|
||||||
# Header files to ignore when scanning. Use base file name, no paths
|
# Header files to ignore when scanning. Use base file name, no paths
|
||||||
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
|
# e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h
|
||||||
IGNORE_HFILES=merge.h debug.h internal.h intl.h CImg.h im_video_v4l1.h global_balance.h dbh.h base64.h templates.h mosaic.h deprecated.h thread.h private.h internal.h almostdeprecated.h inlines.h struct.h disp.h
|
IGNORE_HFILES=merge.h debug.h internal.h intl.h CImg.h im_video_v4l1.h global_balance.h dbh.h base64.h templates.h mosaic.h deprecated.h thread.h private.h internal.h almostdeprecated.h inlines.h struct.h disp.h vector.h
|
||||||
|
|
||||||
# Images to copy into HTML directory.
|
# Images to copy into HTML directory.
|
||||||
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
# e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png
|
||||||
|
@ -43,11 +43,11 @@
|
|||||||
<xi:include href="xml/histograms_lut.xml"/>
|
<xi:include href="xml/histograms_lut.xml"/>
|
||||||
<xi:include href="xml/inplace.xml"/>
|
<xi:include href="xml/inplace.xml"/>
|
||||||
<xi:include href="xml/mask.xml"/>
|
<xi:include href="xml/mask.xml"/>
|
||||||
|
<xi:include href="xml/morphology.xml"/>
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter>
|
<chapter>
|
||||||
<title>VIPS operation API by section (no gtkdoc comments yet)</title>
|
<title>VIPS operation API by section (no gtkdoc comments yet)</title>
|
||||||
<xi:include href="xml/morphology.xml"/>
|
|
||||||
<xi:include href="xml/resample.xml"/>
|
<xi:include href="xml/resample.xml"/>
|
||||||
<xi:include href="xml/mosaicing.xml"/>
|
<xi:include href="xml/mosaicing.xml"/>
|
||||||
<xi:include href="xml/other.xml"/>
|
<xi:include href="xml/other.xml"/>
|
||||||
|
@ -237,7 +237,7 @@ im__formatalike( IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 )
|
|||||||
/* Make an n-band image. Input 1 or n bands.
|
/* Make an n-band image. Input 1 or n bands.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
im__bandup( IMAGE *in, IMAGE *out, int n )
|
im__bandup( const char *domain, IMAGE *in, IMAGE *out, int n )
|
||||||
{
|
{
|
||||||
IMAGE *bands[256];
|
IMAGE *bands[256];
|
||||||
int i;
|
int i;
|
||||||
@ -245,11 +245,11 @@ im__bandup( IMAGE *in, IMAGE *out, int n )
|
|||||||
if( in->Bands == n )
|
if( in->Bands == n )
|
||||||
return( im_copy( in, out ) );
|
return( im_copy( in, out ) );
|
||||||
if( in->Bands != 1 ) {
|
if( in->Bands != 1 ) {
|
||||||
im_error( "im__bandup", _( "not one band or %d bands" ), n );
|
im_error( domain, _( "not one band or %d bands" ), n );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
if( n > 256 || n < 1 ) {
|
if( n > 256 || n < 1 ) {
|
||||||
im_error( "im__bandup", "%s", _( "bad bands" ) );
|
im_error( domain, "%s", _( "bad bands" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,12 +260,35 @@ im__bandup( IMAGE *in, IMAGE *out, int n )
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
im__bandalike( IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 )
|
im__bandalike_vec( const char *domain, IMAGE **in, IMAGE **out, int n )
|
||||||
{
|
{
|
||||||
if( im_check_bands_1orn( "im__bandalike", in1, in2 ) )
|
int i;
|
||||||
return( -1 );
|
int max_bands;
|
||||||
if( im__bandup( in1, out1, IM_MAX( in1->Bands, in2->Bands ) ) ||
|
|
||||||
im__bandup( in2, out2, IM_MAX( in1->Bands, in2->Bands ) ) )
|
g_assert( n >= 1 );
|
||||||
|
|
||||||
|
max_bands = in[0]->Bands;
|
||||||
|
for( i = 1; i < n; i++ )
|
||||||
|
max_bands = IM_MAX( max_bands, in[i]->Bands );
|
||||||
|
for( i = 0; i < n; i++ )
|
||||||
|
if( im__bandup( domain, in[i], out[i], max_bands ) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
|
return( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
im__bandalike( const char *domain,
|
||||||
|
IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 )
|
||||||
|
{
|
||||||
|
IMAGE *in[2];
|
||||||
|
IMAGE *out[2];
|
||||||
|
|
||||||
|
in[0] = in1;
|
||||||
|
in[1] = in2;
|
||||||
|
out[0] = out1;
|
||||||
|
out[1] = out2;
|
||||||
|
if( im__bandalike_vec( domain, in, out, 2 ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
@ -301,7 +324,7 @@ im__arith_binary( const char *domain,
|
|||||||
*/
|
*/
|
||||||
if( im_open_local_array( out, t, 4, domain, "p" ) ||
|
if( im_open_local_array( out, t, 4, domain, "p" ) ||
|
||||||
im__formatalike( in1, in2, t[0], t[1] ) ||
|
im__formatalike( in1, in2, t[0], t[1] ) ||
|
||||||
im__bandalike( t[0], t[1], t[2], t[3] ) )
|
im__bandalike( domain, t[0], t[1], t[2], t[3] ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* Generate the output.
|
/* Generate the output.
|
||||||
|
@ -262,7 +262,7 @@ make_pixel( IMAGE *out, VipsBandFmt fmt, int n, double *p )
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
im__arith_binary_const( const char *name,
|
im__arith_binary_const( const char *domain,
|
||||||
IMAGE *in, IMAGE *out,
|
IMAGE *in, IMAGE *out,
|
||||||
int n, double *c, VipsBandFmt vfmt,
|
int n, double *c, VipsBandFmt vfmt,
|
||||||
int format_table[10],
|
int format_table[10],
|
||||||
@ -271,8 +271,8 @@ im__arith_binary_const( const char *name,
|
|||||||
PEL *vector;
|
PEL *vector;
|
||||||
|
|
||||||
if( im_piocheck( in, out ) ||
|
if( im_piocheck( in, out ) ||
|
||||||
im_check_vector( name, n, in ) ||
|
im_check_vector( domain, n, in ) ||
|
||||||
im_check_uncoded( name, in ) )
|
im_check_uncoded( domain, in ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
if( im_cp_desc( out, in ) )
|
if( im_cp_desc( out, in ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
@ -297,8 +297,8 @@ im__arith_binary_const( const char *name,
|
|||||||
if( n > 1 && out->Bands == 1 ) {
|
if( n > 1 && out->Bands == 1 ) {
|
||||||
IMAGE *t;
|
IMAGE *t;
|
||||||
|
|
||||||
if( !(t = im_open_local( out, "arith_binary_const", "p" )) ||
|
if( !(t = im_open_local( out, domain, "p" )) ||
|
||||||
im__bandup( in, t, n ) )
|
im__bandup( domain, in, t, n ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
in = t;
|
in = t;
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
/* Struct we carry stuff around in.
|
/* Struct we carry stuff around in.
|
||||||
*/
|
*/
|
||||||
typedef struct joins {
|
typedef struct joins {
|
||||||
int n; /* Number of input images */
|
int n; /* Number of input images */
|
||||||
IMAGE **in; /* Array of input images, NULL-terminated */
|
IMAGE **in; /* Array of input images, NULL-terminated */
|
||||||
int *is; /* An int for SIZEOF_PEL() for each image */
|
int *is; /* An int for SIZEOF_PEL() for each image */
|
||||||
} Join;
|
} Join;
|
||||||
|
@ -97,7 +97,7 @@ im__insert_base( const char *domain,
|
|||||||
*/
|
*/
|
||||||
if( im_open_local_array( out, t, 4, domain, "p" ) ||
|
if( im_open_local_array( out, t, 4, domain, "p" ) ||
|
||||||
im__formatalike( in1, in2, t[0], t[1] ) ||
|
im__formatalike( in1, in2, t[0], t[1] ) ||
|
||||||
im__bandalike( t[0], t[1], t[2], t[3] ) ||
|
im__bandalike( domain, t[0], t[1], t[2], t[3] ) ||
|
||||||
!(vec = im_allocate_input_array( out, t[2], t[3], NULL )) )
|
!(vec = im_allocate_input_array( out, t[2], t[3], NULL )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ join_buffer( PEL **p, PEL *q, int n, IMAGE *im )
|
|||||||
*
|
*
|
||||||
* Compose two real images to make a complex image. If either @in1 or @in2 are
|
* Compose two real images to make a complex image. If either @in1 or @in2 are
|
||||||
* %IM_BANDFMT_DOUBLE, @out is %IM_BANDFMT_DPCOMPLEX. Otherwise @out is
|
* %IM_BANDFMT_DOUBLE, @out is %IM_BANDFMT_DPCOMPLEX. Otherwise @out is
|
||||||
* %IM_BANDFMT_COMPLEX. @in1 becomes the real component fo @out and @in2 the
|
* %IM_BANDFMT_COMPLEX. @in1 becomes the real component of @out and @in2 the
|
||||||
* imaginary.
|
* imaginary.
|
||||||
*
|
*
|
||||||
* If the number of bands differs, one of the images
|
* If the number of bands differs, one of the images
|
||||||
@ -105,10 +105,6 @@ join_buffer( PEL **p, PEL *q, int n, IMAGE *im )
|
|||||||
* one-band image by joining n copies of the one-band image together, and then
|
* one-band image by joining n copies of the one-band image together, and then
|
||||||
* the two n-band images are operated upon.
|
* the two n-band images are operated upon.
|
||||||
*
|
*
|
||||||
* The two input images are cast up to the smallest common type (see table
|
|
||||||
* Smallest common format in
|
|
||||||
* <link linkend="VIPS-arithmetic">arithmetic</link>).
|
|
||||||
*
|
|
||||||
* See also: im_c2real(), im_c2imag().
|
* See also: im_c2real(), im_c2imag().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
@ -141,7 +137,7 @@ im_ri2c( IMAGE *in1, IMAGE *in2, IMAGE *out )
|
|||||||
if( im_open_local_array( out, t, 4, "im_ri2c", "p" ) ||
|
if( im_open_local_array( out, t, 4, "im_ri2c", "p" ) ||
|
||||||
im_clip2fmt( in1, t[0], fmt ) ||
|
im_clip2fmt( in1, t[0], fmt ) ||
|
||||||
im_clip2fmt( in2, t[1], fmt ) ||
|
im_clip2fmt( in2, t[1], fmt ) ||
|
||||||
im__bandalike( t[0], t[1], t[2], t[3] ) )
|
im__bandalike( "im_ri2c", t[0], t[1], t[2], t[3] ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* Remember to NULL-terminate.
|
/* Remember to NULL-terminate.
|
||||||
|
@ -151,15 +151,17 @@ char *im__gslist_gvalue_get( const GSList *list );
|
|||||||
|
|
||||||
void im__buffer_init( void );
|
void im__buffer_init( void );
|
||||||
|
|
||||||
int im__bandup( IMAGE *in, IMAGE *out, int n );
|
int im__bandup( const char *domain, IMAGE *in, IMAGE *out, int n );
|
||||||
int im__bandalike( IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 );
|
int im__bandalike_vec( const char *domain, IMAGE **in, IMAGE **out, int n );
|
||||||
|
int im__bandalike( const char *domain,
|
||||||
|
IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 );
|
||||||
int im__formatalike_vec( IMAGE **in, IMAGE **out, int n );
|
int im__formatalike_vec( IMAGE **in, IMAGE **out, int n );
|
||||||
int im__formatalike( IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 );
|
int im__formatalike( IMAGE *in1, IMAGE *in2, IMAGE *out1, IMAGE *out2 );
|
||||||
int im__arith_binary( const char *name,
|
int im__arith_binary( const char *domain,
|
||||||
IMAGE *in1, IMAGE *in2, IMAGE *out,
|
IMAGE *in1, IMAGE *in2, IMAGE *out,
|
||||||
int format_table[10],
|
int format_table[10],
|
||||||
im_wrapmany_fn fn, void *b );
|
im_wrapmany_fn fn, void *b );
|
||||||
int im__arith_binary_const( const char *name,
|
int im__arith_binary_const( const char *domain,
|
||||||
IMAGE *in, IMAGE *out,
|
IMAGE *in, IMAGE *out,
|
||||||
int n, double *c, VipsBandFmt vfmt,
|
int n, double *c, VipsBandFmt vfmt,
|
||||||
int format_table[10],
|
int format_table[10],
|
||||||
|
@ -37,15 +37,15 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /*__cplusplus*/
|
#endif /*__cplusplus*/
|
||||||
|
|
||||||
int im_dilate( IMAGE *in, IMAGE *out, INTMASK *m );
|
int im_dilate( IMAGE *in, IMAGE *out, INTMASK *mask );
|
||||||
int im_erode( IMAGE *in, IMAGE *out, INTMASK *m );
|
int im_erode( IMAGE *in, IMAGE *out, INTMASK *mask );
|
||||||
|
|
||||||
int im_rank( IMAGE *in, IMAGE *out, int xsize, int ysize, int order );
|
int im_rank( IMAGE *in, IMAGE *out, int width, int height, int index );
|
||||||
int im_rank_image( IMAGE **in, IMAGE *out, int n, int index );
|
int im_rank_image( IMAGE **in, IMAGE *out, int n, int index );
|
||||||
int im_maxvalue( IMAGE **in, IMAGE *out, int n );
|
int im_maxvalue( IMAGE **in, IMAGE *out, int n );
|
||||||
|
|
||||||
int im_cntlines( IMAGE *im, double *nolines, int flag );
|
int im_cntlines( IMAGE *im, double *nolines, int flag );
|
||||||
int im_zerox( IMAGE *in, IMAGE *out, int flag );
|
int im_zerox( IMAGE *in, IMAGE *out, int sign );
|
||||||
int im_profile( IMAGE *in, IMAGE *out, int dir );
|
int im_profile( IMAGE *in, IMAGE *out, int dir );
|
||||||
int im_label_regions( IMAGE *test, IMAGE *mask, int *segments );
|
int im_label_regions( IMAGE *test, IMAGE *mask, int *segments );
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ im__inplace_base( const char *domain,
|
|||||||
/* Cast sub to match main in bands and format.
|
/* Cast sub to match main in bands and format.
|
||||||
*/
|
*/
|
||||||
if( im_open_local_array( out, t, 2, domain, "p" ) ||
|
if( im_open_local_array( out, t, 2, domain, "p" ) ||
|
||||||
im__bandup( sub, t[0], main->Bands ) ||
|
im__bandup( domain, sub, t[0], main->Bands ) ||
|
||||||
im_clip2fmt( t[0], t[1], main->BandFmt ) )
|
im_clip2fmt( t[0], t[1], main->BandFmt ) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
|
|
||||||
|
@ -711,7 +711,7 @@ int
|
|||||||
im_check_bands( const char *domain, IMAGE *im, int bands )
|
im_check_bands( const char *domain, IMAGE *im, int bands )
|
||||||
{
|
{
|
||||||
if( im->Bands != bands ) {
|
if( im->Bands != bands ) {
|
||||||
im_error( domain, _( "image must %d bands" ), bands );
|
im_error( domain, _( "image must have %d bands" ), bands );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -735,7 +735,8 @@ int
|
|||||||
im_check_bands_1or3( const char *domain, IMAGE *im )
|
im_check_bands_1or3( const char *domain, IMAGE *im )
|
||||||
{
|
{
|
||||||
if( im->Bands != 1 && im->Bands != 3 ) {
|
if( im->Bands != 1 && im->Bands != 3 ) {
|
||||||
im_error( domain, "%s", _( "image must one or three bands" ) );
|
im_error( domain, "%s",
|
||||||
|
_( "image must have one or three bands" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
IMAGE *in, *out; /* Images we run */
|
IMAGE *in, *out; /* Images we run */
|
||||||
int xsize, ysize; /* Window size */
|
int xsize, ysize; /* Window size */
|
||||||
int order; /* Element select */
|
int index; /* Element select */
|
||||||
int n; /* xsize * ysize */
|
int n; /* xsize * ysize */
|
||||||
} RankInfo;
|
} RankInfo;
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ rank_start( IMAGE *out, void *a, void *b )
|
|||||||
d += ls; \
|
d += ls; \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
/* Rearrange sort[] to make the order-th element the order-th
|
/* Rearrange sort[] to make the index-th element the index-th
|
||||||
* smallest, adapted from Numerical Recipes in C.
|
* smallest, adapted from Numerical Recipes in C.
|
||||||
*/ \
|
*/ \
|
||||||
lower = 0; /* Range we know the result lies in */ \
|
lower = 0; /* Range we know the result lies in */ \
|
||||||
@ -202,14 +202,14 @@ rank_start( IMAGE *out, void *a, void *b )
|
|||||||
\
|
\
|
||||||
/* Move to partition with the kth element.
|
/* Move to partition with the kth element.
|
||||||
*/ \
|
*/ \
|
||||||
if( j >= rnk->order ) \
|
if( j >= rnk->index ) \
|
||||||
upper = j - 1; \
|
upper = j - 1; \
|
||||||
if( j <= rnk->order ) \
|
if( j <= rnk->index ) \
|
||||||
lower = i; \
|
lower = i; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
q[x] = sort[rnk->order]; \
|
q[x] = sort[rnk->index]; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,9 +320,9 @@ rank_gen( REGION *or, void *vseq, void *a, void *b )
|
|||||||
ls = IM_REGION_LSKIP( ir ) / IM_IMAGE_SIZEOF_ELEMENT( in );
|
ls = IM_REGION_LSKIP( ir ) / IM_IMAGE_SIZEOF_ELEMENT( in );
|
||||||
|
|
||||||
for( y = to; y < bo; y++ ) {
|
for( y = to; y < bo; y++ ) {
|
||||||
if( rnk->order == 0 )
|
if( rnk->index == 0 )
|
||||||
SWITCH( LOOP_MIN )
|
SWITCH( LOOP_MIN )
|
||||||
else if( rnk->order == rnk->n - 1 )
|
else if( rnk->index == rnk->n - 1 )
|
||||||
SWITCH( LOOP_MAX )
|
SWITCH( LOOP_MAX )
|
||||||
else
|
else
|
||||||
SWITCH( LOOP_SELECT ) }
|
SWITCH( LOOP_SELECT ) }
|
||||||
@ -333,7 +333,7 @@ rank_gen( REGION *or, void *vseq, void *a, void *b )
|
|||||||
/* Rank filter.
|
/* Rank filter.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order )
|
im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int index )
|
||||||
{
|
{
|
||||||
RankInfo *rnk;
|
RankInfo *rnk;
|
||||||
|
|
||||||
@ -342,7 +342,7 @@ im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order )
|
|||||||
im_check_noncomplex( "im_rank", in ) )
|
im_check_noncomplex( "im_rank", in ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
if( xsize > 1000 || ysize > 1000 || xsize <= 0 || ysize <= 0 ||
|
if( xsize > 1000 || ysize > 1000 || xsize <= 0 || ysize <= 0 ||
|
||||||
order < 0 || order > xsize * ysize - 1 ) {
|
index < 0 || index > xsize * ysize - 1 ) {
|
||||||
im_error( "im_rank", "%s", _( "bad parameters" ) );
|
im_error( "im_rank", "%s", _( "bad parameters" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
@ -355,7 +355,7 @@ im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order )
|
|||||||
rnk->out = out;
|
rnk->out = out;
|
||||||
rnk->xsize = xsize;
|
rnk->xsize = xsize;
|
||||||
rnk->ysize = ysize;
|
rnk->ysize = ysize;
|
||||||
rnk->order = order;
|
rnk->index = index;
|
||||||
rnk->n = xsize * ysize;
|
rnk->n = xsize * ysize;
|
||||||
|
|
||||||
/* Prepare output. Consider a 7x7 window and a 7x7 image --- the output
|
/* Prepare output. Consider a 7x7 window and a 7x7 image --- the output
|
||||||
@ -394,12 +394,12 @@ im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order )
|
|||||||
* @out: output image
|
* @out: output image
|
||||||
* @width: window width
|
* @width: window width
|
||||||
* @height: window height
|
* @height: window height
|
||||||
* @order: select pixel
|
* @index: select pixel
|
||||||
*
|
*
|
||||||
* im_rank() does rank filtering on an image. A window of size @width by
|
* im_rank() does rank filtering on an image. A window of size @width by
|
||||||
* @height is passed over the image. At each position, the pixels inside the
|
* @height is passed over the image. At each position, the pixels inside the
|
||||||
* window are sorted into ascending order and the pixel at position @order is
|
* window are sorted into ascending order and the pixel at position @index is
|
||||||
* output. @order numbers from 0.
|
* output. @index numbers from 0.
|
||||||
*
|
*
|
||||||
* It works for any non-complex image type, with any number of bands.
|
* It works for any non-complex image type, with any number of bands.
|
||||||
* The input is expanded by copying edge pixels before performing the
|
* The input is expanded by copying edge pixels before performing the
|
||||||
@ -418,7 +418,7 @@ im_rank_raw( IMAGE *in, IMAGE *out, int xsize, int ysize, int order )
|
|||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
im_rank( IMAGE *in, IMAGE *out, int width, int height, int order )
|
im_rank( IMAGE *in, IMAGE *out, int width, int height, int index )
|
||||||
{
|
{
|
||||||
IMAGE *t1;
|
IMAGE *t1;
|
||||||
|
|
||||||
@ -426,7 +426,7 @@ im_rank( IMAGE *in, IMAGE *out, int width, int height, int order )
|
|||||||
im_embed( in, t1, 1,
|
im_embed( in, t1, 1,
|
||||||
width / 2, height / 2,
|
width / 2, height / 2,
|
||||||
in->Xsize + width - 1, in->Ysize + height - 1 ) ||
|
in->Xsize + width - 1, in->Ysize + height - 1 ) ||
|
||||||
im_rank_raw( t1, out, width, height, order ) )
|
im_rank_raw( t1, out, width, height, index ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
out->Xoffset = 0;
|
out->Xoffset = 0;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
* 10/11/10
|
* 10/11/10
|
||||||
* - gtkdoc
|
* - gtkdoc
|
||||||
* - cleanups
|
* - cleanups
|
||||||
|
* - any mix of formats and bands
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -43,6 +44,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include <vips/vips.h>
|
#include <vips/vips.h>
|
||||||
|
#include <vips/internal.h>
|
||||||
|
|
||||||
#ifdef WITH_DMALLOC
|
#ifdef WITH_DMALLOC
|
||||||
#include <dmalloc.h>
|
#include <dmalloc.h>
|
||||||
@ -63,7 +65,7 @@ static Rank *
|
|||||||
rank_new( IMAGE **in, IMAGE *out, int n, int index )
|
rank_new( IMAGE **in, IMAGE *out, int n, int index )
|
||||||
{
|
{
|
||||||
Rank *rank;
|
Rank *rank;
|
||||||
int i;
|
IMAGE **t;
|
||||||
|
|
||||||
if( !(rank = IM_NEW( out, Rank )) )
|
if( !(rank = IM_NEW( out, Rank )) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
@ -71,10 +73,17 @@ rank_new( IMAGE **in, IMAGE *out, int n, int index )
|
|||||||
rank->n = n;
|
rank->n = n;
|
||||||
rank->index = index;
|
rank->index = index;
|
||||||
rank->out = out;
|
rank->out = out;
|
||||||
if( !(rank->in = IM_ARRAY( out, n + 1, IMAGE * )) )
|
if( !(t = IM_ARRAY( out, n, IMAGE * )) ||
|
||||||
|
!(rank->in = IM_ARRAY( out, n + 1, IMAGE * )) )
|
||||||
|
return( NULL );
|
||||||
|
|
||||||
|
/* Cast inputs up to a common format, common bands.
|
||||||
|
*/
|
||||||
|
if( im_open_local_array( out, rank->in, n, "im_rank_image", "p" ) ||
|
||||||
|
im_open_local_array( out, rank->in, n, "im_rank_image", "p" ) ||
|
||||||
|
im__bandalike_vec( "im_rank_image", in, t, n ) ||
|
||||||
|
im__formatalike_vec( t, rank->in, n ) )
|
||||||
return( NULL );
|
return( NULL );
|
||||||
for( i = 0; i < n; i++ )
|
|
||||||
rank->in[i] = in[i];
|
|
||||||
rank->in[n] = NULL;
|
rank->in[n] = NULL;
|
||||||
|
|
||||||
return( rank );
|
return( rank );
|
||||||
@ -270,23 +279,27 @@ rank_gen( REGION *or, void *vseq, void *a, void *b )
|
|||||||
* @in: input image array
|
* @in: input image array
|
||||||
* @out: output image
|
* @out: output image
|
||||||
* @n: number of input images
|
* @n: number of input images
|
||||||
* @order: select pixel
|
* @index: select pixel
|
||||||
*
|
*
|
||||||
* im_rank_image() sorts the input images pixel-wise, then outputs an image
|
* im_rank_image() sorts the images @in pixel-wise, then outputs an
|
||||||
* in which each pixel is selected from the sorted list by the
|
* image in which each pixel is selected from the sorted list by the
|
||||||
* @order parameter. For example, if @order
|
* @index parameter. For example, if @index
|
||||||
* is zero, then each output pixel will be the minimum of all the
|
* is zero, then each output pixel will be the minimum of all the
|
||||||
* corresponding input pixels.
|
* corresponding input pixels.
|
||||||
*
|
*
|
||||||
* It works for any uncoded, non-complex image type. All input images must
|
* It works for any uncoded, non-complex image type. Images are cast up to the
|
||||||
* match in size, format, and number of bands.
|
* smallest common-format.
|
||||||
|
*
|
||||||
|
* Any image can have either 1 band or n bands, where n is the same for all
|
||||||
|
* the non-1-band images. Single band images are then effectively copied to
|
||||||
|
* make n-band images.
|
||||||
*
|
*
|
||||||
* See also: im_rank(), im_maxvalue().
|
* See also: im_rank(), im_maxvalue().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
im_rank_image( IMAGE **in, IMAGE *out, int n, int order )
|
im_rank_image( IMAGE **in, IMAGE *out, int n, int index )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
Rank *rank;
|
Rank *rank;
|
||||||
@ -295,7 +308,7 @@ im_rank_image( IMAGE **in, IMAGE *out, int n, int order )
|
|||||||
im_error( "im_rank_image", "%s", _( "zero input images!" ) );
|
im_error( "im_rank_image", "%s", _( "zero input images!" ) );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
}
|
}
|
||||||
if( order < 0 || order > n - 1 ) {
|
if( index < 0 || index > n - 1 ) {
|
||||||
im_error( "im_rank_image",
|
im_error( "im_rank_image",
|
||||||
_( "index should be in range 0 - %d" ), n - 1 );
|
_( "index should be in range 0 - %d" ), n - 1 );
|
||||||
return( -1 );
|
return( -1 );
|
||||||
@ -306,12 +319,10 @@ im_rank_image( IMAGE **in, IMAGE *out, int n, int order )
|
|||||||
if( im_pincheck( in[i] ) ||
|
if( im_pincheck( in[i] ) ||
|
||||||
im_check_uncoded( "im_rank_image", in[i] ) ||
|
im_check_uncoded( "im_rank_image", in[i] ) ||
|
||||||
im_check_noncomplex( "im_rank_image", in[i] ) ||
|
im_check_noncomplex( "im_rank_image", in[i] ) ||
|
||||||
im_check_size_same( "im_rank_image", in[i], in[0] ) ||
|
im_check_size_same( "im_rank_image", in[i], in[0] ) )
|
||||||
im_check_format_same( "im_rank_image", in[i], in[0] ) ||
|
|
||||||
im_check_bands_same( "im_rank_image", in[i], in[0] ) )
|
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
if( !(rank = rank_new( in, out, n, order )) ||
|
if( !(rank = rank_new( in, out, n, index )) ||
|
||||||
im_cp_desc_array( out, rank->in ) ||
|
im_cp_desc_array( out, rank->in ) ||
|
||||||
im_demand_hint_array( out, IM_THINSTRIP, rank->in ) ||
|
im_demand_hint_array( out, IM_THINSTRIP, rank->in ) ||
|
||||||
im_generate( out,
|
im_generate( out,
|
||||||
@ -327,16 +338,17 @@ im_rank_image( IMAGE **in, IMAGE *out, int n, int order )
|
|||||||
* @out: output image
|
* @out: output image
|
||||||
* @n: number of input images
|
* @n: number of input images
|
||||||
*
|
*
|
||||||
* im_maxvalue() sorts the input images pixel-wise, then outputs an image
|
* im_maxvalue() is a convenience function over im_rank_image(). It sorts the
|
||||||
* in which each pixel is
|
* input images pixel-wise, then outputs an image
|
||||||
* @order parameter. For example, if @order
|
* in which each pixel is the maximum of all the corresponding input images.
|
||||||
* is zero, then each output pixel will be the minimum of all the
|
* It works for any uncoded, non-complex image type. Images are cast up to the
|
||||||
* corresponding input pixels.
|
* smallest common-format.
|
||||||
*
|
*
|
||||||
* It works for any uncoded, non-complex image type. All input images must
|
* Any image can have either 1 band or n bands, where n is the same for all
|
||||||
* match in size, format, and number of bands.
|
* the non-1-band images. Single band images are then effectively copied to
|
||||||
|
* make n-band images.
|
||||||
*
|
*
|
||||||
* See also: im_rank(), im_maxvalue().
|
* See also: im_rank_image().
|
||||||
*
|
*
|
||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
|
@ -137,7 +137,7 @@ zerox_gen( REGION *or, void *seq, void *a, void *b )
|
|||||||
* Returns: 0 on success, -1 on error
|
* Returns: 0 on success, -1 on error
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
im_zerox( IMAGE *in, IMAGE *out, int flag )
|
im_zerox( IMAGE *in, IMAGE *out, int sign )
|
||||||
{
|
{
|
||||||
IMAGE *t1;
|
IMAGE *t1;
|
||||||
|
|
||||||
|
@ -378,7 +378,7 @@ im_blend( IMAGE *c, IMAGE *a, IMAGE *b, IMAGE *out )
|
|||||||
/* Make a and b match in bands and format.
|
/* Make a and b match in bands and format.
|
||||||
*/
|
*/
|
||||||
if( im__formatalike( a, b, t[2], t[3] ) ||
|
if( im__formatalike( a, b, t[2], t[3] ) ||
|
||||||
im__bandalike( t[2], t[3], t[4], t[5] ) )
|
im__bandalike( "im_blend", t[2], t[3], t[4], t[5] ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
if( blend( c, t[4], t[5], t[6] ) )
|
if( blend( c, t[4], t[5], t[6] ) )
|
||||||
|
@ -216,7 +216,7 @@ im_ifthenelse( IMAGE *c, IMAGE *a, IMAGE *b, IMAGE *out )
|
|||||||
* special-case this in code above ^^^ for speed.
|
* special-case this in code above ^^^ for speed.
|
||||||
*/
|
*/
|
||||||
if( im__formatalike( a, b, t[0], t[1] ) ||
|
if( im__formatalike( a, b, t[0], t[1] ) ||
|
||||||
im__bandalike( t[0], t[1], t[2], t[3] ) )
|
im__bandalike( "im_ifthenelse", t[0], t[1], t[2], t[3] ) )
|
||||||
return( -1 );
|
return( -1 );
|
||||||
|
|
||||||
/* If c is not uchar, do (!=0) to make a uchar image.
|
/* If c is not uchar, do (!=0) to make a uchar image.
|
||||||
|
Loading…
Reference in New Issue
Block a user