/* @(#) Thresholds an image. Works for any non-complex type. * @(#) Output is a binary image with 0 and 255 only * @(#) Input is either memory mapped or in a buffer. * @(#) * @(#) int im_thresh(imin, imout, threshold) * @(#) IMAGE *imin, *imout; * @(#) double threshold; * @(#) * @(#) Returns 0 on success and -1 on error * * Copyright: 1991, N. Dessipris, J Cupitt * * Author: N. Dessipris, J. Cupitt * Written on: 15/03/1991 * Modified on : */ /* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 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 #ifdef WITH_DMALLOC #include #endif /*WITH_DMALLOC*/ /* Useful: Call a macro with the name, type pairs for all VIPS functions. */ #define BRIGHT 255 #define DARK 0 #define im_for_all_types(A) \ case IM_BANDFMT_UCHAR: A(unsigned char); break; \ case IM_BANDFMT_CHAR: A(signed char); break; \ case IM_BANDFMT_USHORT: A(unsigned short); break; \ case IM_BANDFMT_SHORT: A(signed short); break; \ case IM_BANDFMT_UINT: A(unsigned int); break; \ case IM_BANDFMT_INT: A(signed int); break; \ case IM_BANDFMT_FLOAT: A(float); break; \ case IM_BANDFMT_DOUBLE: A(double); break; /* Replacement for im_thresh */ int im_thresh( in, out, threshold ) IMAGE *in, *out; double threshold; { int x, y; PEL *bu; /* Buffer we write to */ int s, epl; /* Size and els per line */ /* Check our args. */ if( im_iocheck( in, out ) ) { im_errormsg("im_thresh: im_iocheck failed"); return( -1 ); } if( in->Coding != IM_CODING_NONE ) { im_errormsg("im_thresh: input should be uncoded");return(-1);} /* Set up the output header. */ if( im_cp_desc( out, in ) ) { im_errormsg("im_thresh: im_cp_desc failed"); return( -1 ); } out->BandFmt = IM_BANDFMT_UCHAR; out->Bbits = IM_BBITS_BYTE; if( im_setupout( out ) ) { im_errormsg("im_thresh: im_setupout failed"); return( -1 ); } /* Make buffer for building o/p in. */ epl = in->Xsize * in->Bands; s = epl * sizeof( PEL ); if( (bu = (PEL *) im_malloc( out, (unsigned)s )) == NULL ) return( -1 ); /* Define what we do for each band element type. */ #define im_thresh_loop(TYPE)\ { TYPE *a = (TYPE *) in->data;\ \ for( y = 0; y < in->Ysize; y++ ) {\ PEL *b = bu;\ \ for( x = 0; x < epl; x++ ) {\ double f = (double) *a++;\ if ( f >= threshold)\ *b++ = (PEL)BRIGHT;\ else\ *b++ = (PEL)DARK;\ }\ \ if( im_writeline( y, out, bu ) ) \ return( -1 );\ }\ } /* Do the above for all image types. */ switch( in->BandFmt ) { im_for_all_types( im_thresh_loop ); default: im_errormsg("im_thresh: Unknown input format"); return( -1 ); } return( 0 ); }