IM: im_process_loc.h Source File
From IM - An Imaging Tool
im_process_loc.h
Go to the documentation of this file.00001 /** \file 00002 * \brief Image Processing - Local Operations 00003 * 00004 * See Copyright Notice in im_lib.h 00005 * $Id: im_process_loc.h,v 1.6 2005/12/13 18:35:02 scuri Exp $ 00006 */ 00007 00008 #ifndef __IM_PROCESS_LOC_H 00009 #define __IM_PROCESS_LOC_H 00010 00011 #include "im_image.h" 00012 00013 #if defined(__cplusplus) 00014 extern "C" { 00015 #endif 00016 00017 00018 00019 /** \defgroup resize Image Resize 00020 * \par 00021 * Operations to change the image size. 00022 * \par 00023 * See \ref im_process_loc.h 00024 * \ingroup process */ 00025 00026 /** Only reduze the image size using the given decimation order. \n 00027 * Supported decimation orders: 00028 * \li 0 - zero order (mean) 00029 * \li 1 - first order (bilinear decimation) 00030 * Images must be of the same type. \n 00031 * Returns zero if the counter aborted. 00032 * 00033 * \verbatim im.ProcessReduce(src_image: imImage, dst_image: imImage, order: number) -> counter: boolean [in Lua 5] \endverbatim 00034 * \verbatim im.ProcessReduceNew(image: imImage, order: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00035 * \ingroup resize */ 00036 int imProcessReduce(const imImage* src_image, imImage* dst_image, int order); 00037 00038 /** Change the image size using the given interpolation order. \n 00039 * Supported interpolation orders: 00040 * \li 0 - zero order (near neighborhood) 00041 * \li 1 - first order (bilinear interpolation) 00042 * \li 3 - third order (bicubic interpolation) 00043 * Images must be of the same type. \n 00044 * Returns zero if the counter aborted. 00045 * 00046 * \verbatim im.ProcessResize(src_image: imImage, dst_image: imImage, order: number) -> counter: boolean [in Lua 5] \endverbatim 00047 * \verbatim im.ProcessResizeNew(image: imImage, order: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00048 * \ingroup resize */ 00049 int imProcessResize(const imImage* src_image, imImage* dst_image, int order); 00050 00051 /** Reduze the image area by 4 (w/2,h/2). \n 00052 * Images must be of the same type. Destiny image size must be source image width/2, height/2. 00053 * 00054 * \verbatim im.ProcessReduceBy4(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00055 * \verbatim im.ProcessReduceBy4New(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00056 * \ingroup resize */ 00057 void imProcessReduceBy4(const imImage* src_image, imImage* dst_image); 00058 00059 /** Extract a rectangular region from an image. \n 00060 * Images must be of the same type. Destiny image size must be smaller than source image width-xmin, height-ymin. \n 00061 * ymin and xmin must be >0 and <size. 00062 * 00063 * \verbatim im.ProcessCrop(src_image: imImage, dst_image: imImage, xmin: number, ymin: number) [in Lua 5] \endverbatim 00064 * \verbatim im.ProcessCropNew(image: imImage, xmin: number, xmax: number, ymin: number, ymax: number) -> new_image: imImage [in Lua 5] \endverbatim 00065 * \ingroup resize */ 00066 void imProcessCrop(const imImage* src_image, imImage* dst_image, int xmin, int ymin); 00067 00068 /** Insert a rectangular region in an image. \n 00069 * Images must be of the same type. Region image size can be larger than source image. \n 00070 * ymin and xmin must be >0 and <size. \n 00071 * Source and destiny must be of the same size. Can be done in place. 00072 * 00073 * \verbatim im.ProcessInsert(src_image: imImage, region_image: imImage, dst_image: imImage, xmin: number, ymin: number) [in Lua 5] \endverbatim 00074 * \verbatim im.ProcessInsertNew(image: imImage, region_image: imImage, xmin: number, ymin: number) -> new_image: imImage [in Lua 5] \endverbatim 00075 * \ingroup resize */ 00076 void imProcessInsert(const imImage* src_image, const imImage* region_image, imImage* dst_image, int xmin, int ymin); 00077 00078 /** Increase the image size by adding pixels with zero value. \n 00079 * Images must be of the same type. Destiny image size must be greatter than source image width+xmin, height+ymin. 00080 * 00081 * \verbatim im.ProcessAddMargins(src_image: imImage, dst_image: imImage, xmin: number, ymin: number) [in Lua 5] \endverbatim 00082 * \verbatim im.ProcessAddMarginsNew(image: imImage, xmin: number, xmax: number, ymin: number, ymax: number) -> new_image: imImage [in Lua 5] \endverbatim 00083 * \ingroup resize */ 00084 void imProcessAddMargins(const imImage* src_image, imImage* dst_image, int xmin, int ymin); 00085 00086 00087 00088 /** \defgroup geom Geometric Operations 00089 * \par 00090 * Operations to change the shape of the image. 00091 * \par 00092 * See \ref im_process_loc.h 00093 * \ingroup process */ 00094 00095 /** Calculates the size of the new image after rotation. 00096 * 00097 * \verbatim im.ProcessCalcRotateSize(width: number, height: number, cos0: number, sin0: number) [in Lua 5] \endverbatim 00098 * \ingroup geom */ 00099 void imProcessCalcRotateSize(int width, int height, int *new_width, int *new_height, double cos0, double sin0); 00100 00101 /** Rotates the image using the given interpolation order (see \ref imProcessResize). \n 00102 * Images must be of the same type. The destiny size can be calculated using \ref imProcessCalcRotateSize. \n 00103 * Returns zero if the counter aborted. 00104 * 00105 * \verbatim im.ProcessRotate(src_image: imImage, dst_image: imImage, cos0: number, sin0: number, order: number) -> counter: boolean [in Lua 5] \endverbatim 00106 * \verbatim im.ProcessRotateNew(image: imImage, cos0: number, sin0: number, order: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00107 * \ingroup geom */ 00108 int imProcessRotate(const imImage* src_image, imImage* dst_image, double cos0, double sin0, int order); 00109 00110 /** Rotate the image in 90 degrees counterclockwise or clockwise. Swap columns by lines. \n 00111 * Images must be of the same type. Destiny width and height must be source height and width. \n 00112 * Direction can be clockwise (1) or counter clockwise (-1). 00113 * 00114 * \verbatim im.ProcessRotate90(src_image: imImage, dst_image: imImage, dir_clockwise: boolean) [in Lua 5] \endverbatim 00115 * \verbatim im.ProcessRotate90New(image: imImage, dir_clockwise: boolean) -> new_image: imImage [in Lua 5] \endverbatim 00116 * \ingroup geom */ 00117 void imProcessRotate90(const imImage* src_image, imImage* dst_image, int dir_clockwise); 00118 00119 /** Rotate the image in 180 degrees. Swap columns and swap lines. \n 00120 * Images must be of the same type and size. 00121 * 00122 * \verbatim im.ProcessRotate180(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00123 * \verbatim im.ProcessRotate180New(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00124 * \ingroup geom */ 00125 void imProcessRotate180(const imImage* src_image, imImage* dst_image); 00126 00127 /** Mirrors the image in a horizontal flip. Swap columns. \n 00128 * Images must be of the same type and size. 00129 * 00130 * \verbatim im.ProcessMirror(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00131 * \verbatim im.ProcessMirrorNew(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00132 * \ingroup geom */ 00133 void imProcessMirror(const imImage* src_image, imImage* dst_image); 00134 00135 /** Apply a vertical flip. Swap lines. \n 00136 * Images must be of the same type and size. 00137 * 00138 * \verbatim im.ProcessFlip(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00139 * \verbatim im.ProcessFlipNew(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00140 * \ingroup geom */ 00141 void imProcessFlip(const imImage* src_image, imImage* dst_image); 00142 00143 /** Apply a radial distortion using the given interpolation order (see imProcessResize). \n 00144 * Images must be of the same type and size. Returns zero if the counter aborted. 00145 * 00146 * \verbatim im.ProcessRadial(src_image: imImage, dst_image: imImage, k1: number, order: number) -> counter: boolean [in Lua 5] \endverbatim 00147 * \verbatim im.ProcessRadialNew(image: imImage, k1: number, order: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00148 * \ingroup geom */ 00149 int imProcessRadial(const imImage* src_image, imImage* dst_image, float k1, int order); 00150 00151 00152 00153 /** \defgroup morphgray Morphology Operations for Gray Images 00154 * \par 00155 * See \ref im_process_loc.h 00156 * \ingroup process */ 00157 00158 /** Base gray morphology convolution. \n 00159 * Supports all data types except IM_CFLOAT. Can be applied on color images. \n 00160 * Kernel is always IM_INT. Use kernel size odd for better results. \n 00161 * You can use the maximum value or else the minimum value. \n 00162 * No border extensions are used. 00163 * All the gray morphology operations use this function. \n 00164 * If the kernel image attribute "Description" exists it is used by the counter. 00165 * 00166 * \verbatim im.ProcessGrayMorphConvolve(src_image: imImage, dst_image: imImage, kernel: imImage, ismax: boolean) -> counter: boolean [in Lua 5] \endverbatim 00167 * \verbatim im.ProcessGrayMorphConvolveNew(image: imImage, kernel: imImage, ismax: boolean) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00168 * \ingroup morphgray */ 00169 int imProcessGrayMorphConvolve(const imImage* src_image, imImage* dst_image, const imImage* kernel, int ismax); 00170 00171 /** Gray morphology convolution with a kernel full of "0"s and use minimum value. 00172 * 00173 * \verbatim im.ProcessGrayMorphErode(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00174 * \verbatim im.ProcessGrayMorphErodeNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00175 * \ingroup morphgray */ 00176 int imProcessGrayMorphErode(const imImage* src_image, imImage* dst_image, int kernel_size); 00177 00178 /** Gray morphology convolution with a kernel full of "0"s and use maximum value. 00179 * 00180 * \verbatim im.ProcessGrayMorphDilate(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00181 * \verbatim im.ProcessGrayMorphDilateNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00182 * \ingroup morphgray */ 00183 int imProcessGrayMorphDilate(const imImage* src_image, imImage* dst_image, int kernel_size); 00184 00185 /** Erode+Dilate. 00186 * 00187 * \verbatim im.ProcessGrayMorphOpen(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00188 * \verbatim im.ProcessGrayMorphOpenNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00189 * \ingroup morphgray */ 00190 int imProcessGrayMorphOpen(const imImage* src_image, imImage* dst_image, int kernel_size); 00191 00192 /** Dilate+Erode. 00193 * 00194 * \verbatim im.ProcessGrayMorphClose(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00195 * \verbatim im.ProcessGrayMorphCloseNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00196 * \ingroup morphgray */ 00197 int imProcessGrayMorphClose(const imImage* src_image, imImage* dst_image, int kernel_size); 00198 00199 /** Open+Difference. 00200 * 00201 * \verbatim im.ProcessGrayMorphTopHat(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00202 * \verbatim im.ProcessGrayMorphTopHatNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00203 * \ingroup morphgray */ 00204 int imProcessGrayMorphTopHat(const imImage* src_image, imImage* dst_image, int kernel_size); 00205 00206 /** Close+Difference. 00207 * 00208 * \verbatim im.ProcessGrayMorphWell(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00209 * \verbatim im.ProcessGrayMorphWellNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00210 * \ingroup morphgray */ 00211 int imProcessGrayMorphWell(const imImage* src_image, imImage* dst_image, int kernel_size); 00212 00213 /** Difference(Erode, Dilate). 00214 * 00215 * \verbatim im.ProcessGrayMorphGradient(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00216 * \verbatim im.ProcessGrayMorphGradientNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00217 * \ingroup morphgray */ 00218 int imProcessGrayMorphGradient(const imImage* src_image, imImage* dst_image, int kernel_size); 00219 00220 00221 00222 /** \defgroup morphbin Morphology Operations for Binary Images 00223 * \par 00224 * See \ref im_process_loc.h 00225 * \ingroup process */ 00226 00227 /** Base binary morphology convolution. \n 00228 * Images are all IM_BINARY. Kernel is IM_INT. Use kernel size odd for better results. \n 00229 * Hit white means hit=1 and miss=0, or else hit=0 and miss=1. \n 00230 * Use -1 for don't care positions in kernel. \n 00231 * The operation can be repeated by a number of iterations. 00232 * The border is zero extended. \n 00233 * Almost all the binary morphology operations use this function.\n 00234 * If the kernel image attribute "Description" exists it is used by the counter. 00235 * 00236 * \verbatim im.ProcessBinMorphConvolve(src_image: imImage, dst_image: imImage, kernel: imImage, hit_white: boolean, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00237 * \verbatim im.ProcessBinMorphConvolveNew(image: imImage, kernel: imImage, hit_white: boolean, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00238 * \ingroup morphbin */ 00239 int imProcessBinMorphConvolve(const imImage* src_image, imImage* dst_image, const imImage* kernel, int hit_white, int iter); 00240 00241 /** Binary morphology convolution with a kernel full of "1"s and hit white. 00242 * 00243 * \verbatim im.ProcessBinMorphErode(src_image: imImage, dst_image: imImage, kernel_size: number, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00244 * \verbatim im.ProcessBinMorphErodeNew(image: imImage, kernel_size: number, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00245 * \ingroup morphbin */ 00246 int imProcessBinMorphErode(const imImage* src_image, imImage* dst_image, int kernel_size, int iter); 00247 00248 /** Binary morphology convolution with a kernel full of "0"s and hit black. 00249 * 00250 * \verbatim im.ProcessBinMorphDilate(src_image: imImage, dst_image: imImage, kernel_size: number, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00251 * \verbatim im.ProcessBinMorphDilateNew(image: imImage, kernel_size: number, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00252 * \ingroup morphbin */ 00253 int imProcessBinMorphDilate(const imImage* src_image, imImage* dst_image, int kernel_size, int iter); 00254 00255 /** Erode+Dilate. 00256 * When iteration is more than one it means Erode+Erode+Erode+...+Dilate+Dilate+Dilate+... 00257 * 00258 * \verbatim im.ProcessBinMorphOpen(src_image: imImage, dst_image: imImage, kernel_size: number, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00259 * \verbatim im.ProcessBinMorphOpenNew(image: imImage, kernel_size: number, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00260 * \ingroup morphbin */ 00261 int imProcessBinMorphOpen(const imImage* src_image, imImage* dst_image, int kernel_size, int iter); 00262 00263 /** Dilate+Erode. 00264 * 00265 * \verbatim im.ProcessBinMorphClose(src_image: imImage, dst_image: imImage, kernel_size: number, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00266 * \verbatim im.ProcessBinMorphCloseNew(image: imImage, kernel_size: number, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00267 * \ingroup morphbin */ 00268 int imProcessBinMorphClose(const imImage* src_image, imImage* dst_image, int kernel_size, int iter); 00269 00270 /** Erode+Difference. \n 00271 * The difference from the source image is applied only once. 00272 * 00273 * \verbatim im.ProcessBinMorphOutline(src_image: imImage, dst_image: imImage, kernel_size: number, iter: number) -> counter: boolean [in Lua 5] \endverbatim 00274 * \verbatim im.ProcessBinMorphOutlineNew(image: imImage, kernel_size: number, iter: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00275 * \ingroup morphbin */ 00276 int imProcessBinMorphOutline(const imImage* src_image, imImage* dst_image, int kernel_size, int iter); 00277 00278 /** Thins the supplied binary image using Rosenfeld's parallel thinning algorithm. \n 00279 * Reference: \n 00280 * "Efficient Binary Image Thinning using Neighborhood Maps" \n 00281 * by Joseph M. Cychosz, 3ksnn64@ecn.purdue.edu \n 00282 * in "Graphics Gems IV", Academic Press, 1994 00283 * 00284 * \verbatim im.ProcessBinMorphThin(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00285 * \verbatim im.ProcessBinMorphThinNew(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00286 * \ingroup morphbin */ 00287 void imProcessBinMorphThin(const imImage* src_image, imImage* dst_image); 00288 00289 00290 00291 /** \defgroup rank Rank Convolution Operations 00292 * \par 00293 * All the rank convolution use the same base function. Near the border the base function 00294 * includes only the real image pixels in the rank. No border extensions are used. 00295 * \par 00296 * See \ref im_process_loc.h 00297 * \ingroup process */ 00298 00299 /** Rank convolution using the median value. \n 00300 * Returns zero if the counter aborted. \n 00301 * Supports all data types except IM_CFLOAT. Can be applied on color images. 00302 * 00303 * \verbatim im.ProcessMedianConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00304 * \verbatim im.ProcessMedianConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00305 * \ingroup rank */ 00306 int imProcessMedianConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00307 00308 /** Rank convolution using (maximum-minimum) value. \n 00309 * Returns zero if the counter aborted. \n 00310 * Supports all data types except IM_CFLOAT. Can be applied on color images. 00311 * 00312 * \verbatim im.ProcessRangeConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00313 * \verbatim im.ProcessRangeConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00314 * \ingroup rank */ 00315 int imProcessRangeConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00316 00317 /** Rank convolution using the closest maximum or minimum value. \n 00318 * Returns zero if the counter aborted. \n 00319 * Supports all data types except IM_CFLOAT. Can be applied on color images. 00320 * 00321 * \verbatim im.ProcessRankClosestConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00322 * \verbatim im.ProcessRankClosestConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00323 * \ingroup rank */ 00324 int imProcessRankClosestConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00325 00326 /** Rank convolution using the maximum value. \n 00327 * Returns zero if the counter aborted. \n 00328 * Supports all data types except IM_CFLOAT. Can be applied on color images. 00329 * 00330 * \verbatim im.ProcessRankMaxConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00331 * \verbatim im.ProcessRankMaxConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00332 * \ingroup rank */ 00333 int imProcessRankMaxConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00334 00335 /** Rank convolution using the minimum value. \n 00336 * Returns zero if the counter aborted. \n 00337 * Supports all data types except IM_CFLOAT. Can be applied on color images. 00338 * 00339 * \verbatim im.ProcessRankMinConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00340 * \verbatim im.ProcessRankMinConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00341 * \ingroup rank */ 00342 int imProcessRankMinConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00343 00344 /** Threshold using a rank convolution with a range contrast function. \n 00345 * Supports all integer IM_GRAY images as source, and IM_BINARY as destiny. \n 00346 * Local variable threshold by the method of Bernsen. \n 00347 * Extracted from XITE, Copyright 1991, Blab, UiO \n 00348 * http://www.ifi.uio.no/~blab/Software/Xite/ 00349 \verbatim 00350 Reference: 00351 Bernsen, J: "Dynamic thresholding of grey-level images" 00352 Proc. of the 8th ICPR, Paris, Oct 1986, 1251-1255. 00353 Author: Oivind Due Trier 00354 \endverbatim 00355 * Returns zero if the counter aborted. 00356 * 00357 * \verbatim im.ProcessRangeContrastThreshold(src_image: imImage, dst_image: imImage, kernel_size: number, min_range: number) -> counter: boolean [in Lua 5] \endverbatim 00358 * \verbatim im.ProcessRangeContrastThresholdNew(image: imImage, kernel_size: number, min_range: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00359 * \ingroup threshold */ 00360 int imProcessRangeContrastThreshold(const imImage* src_image, imImage* dst_image, int kernel_size, int min_range); 00361 00362 /** Threshold using a rank convolution with a local max function. \n 00363 * Returns zero if the counter aborted. \n 00364 * Supports all integer IM_GRAY images as source, and IM_BINARY as destiny. 00365 * 00366 * \verbatim im.ProcessLocalMaxThreshold(src_image: imImage, dst_image: imImage, kernel_size: number, min_level: number) -> counter: boolean [in Lua 5] \endverbatim 00367 * \verbatim im.ProcessLocalMaxThresholdNew(image: imImage, kernel_size: number, min_level: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00368 * \ingroup threshold */ 00369 int imProcessLocalMaxThreshold(const imImage* src_image, imImage* dst_image, int kernel_size, int min_level); 00370 00371 00372 00373 /** \defgroup convolve Convolution Operations 00374 * \par 00375 * See \ref im_process_loc.h 00376 * \ingroup process */ 00377 00378 /** Base Convolution with a kernel. \n 00379 * Kernel can be IM_INT or IM_FLOAT, but always IM_GRAY. Use kernel size odd for better results. \n 00380 * Supports all data types. The border is mirrored. \n 00381 * Returns zero if the counter aborted. Most of the convolutions use this function.\n 00382 * If the kernel image attribute "Description" exists it is used by the counter. 00383 * 00384 * \verbatim im.ProcessConvolve(src_image: imImage, dst_image: imImage, kernel: imImage) -> counter: boolean [in Lua 5] \endverbatim 00385 * \verbatim im.ProcessConvolveNew(image: imImage, kernel: imImage) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00386 * \ingroup convolve */ 00387 int imProcessConvolve(const imImage* src_image, imImage* dst_image, const imImage* kernel); 00388 00389 /** Repeats the convolution a number of times. \n 00390 * Returns zero if the counter aborted.\n 00391 * If the kernel image attribute "Description" exists it is used by the counter. 00392 * 00393 * \verbatim im.ProcessConvolveRep(src_image: imImage, dst_image: imImage, kernel: imImage, count: number) -> counter: boolean [in Lua 5] \endverbatim 00394 * \verbatim im.ProcessConvolveRepNew(image: imImage, kernel: imImage, count: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00395 * \ingroup convolve */ 00396 int imProcessConvolveRep(const imImage* src_image, imImage* dst_image, const imImage* kernel, int count); 00397 00398 /** Convolve with a kernel rotating it 8 times and getting the absolute maximum value. \n 00399 * Kernel must be square. \n 00400 * The rotation is implemented only for kernel sizes 3x3, 5x5 and 7x7. \n 00401 * Supports all data types except IM_CFLOAT. 00402 * Returns zero if the counter aborted.\n 00403 * If the kernel image attribute "Description" exists it is used by the counter. 00404 * 00405 * \verbatim im.ProcessCompassConvolve(src_image: imImage, dst_image: imImage, kernel: imImage) -> counter: boolean [in Lua 5] \endverbatim 00406 * \verbatim im.ProcessCompassConvolveNew(image: imImage, kernel: imImage) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00407 * \ingroup convolve */ 00408 int imProcessCompassConvolve(const imImage* src_image, imImage* dst_image, imImage* kernel); 00409 00410 /** Utility function to rotate a kernel one time. 00411 * 00412 * \verbatim im.ProcessRotateKernel(kernel: imImage) [in Lua 5] \endverbatim 00413 * \ingroup convolve */ 00414 void imProcessRotateKernel(imImage* kernel); 00415 00416 /** Difference(Gaussian1, Gaussian2). \n 00417 * Supports all data types, 00418 * but if source is IM_BYTE or IM_USHORT destiny image must be of type IM_INT. 00419 * 00420 * \verbatim im.ProcessDiffOfGaussianConvolve(src_image: imImage, dst_image: imImage, stddev1: number, stddev2: number) -> counter: boolean [in Lua 5] \endverbatim 00421 * \verbatim im.ProcessDiffOfGaussianConvolveNew(image: imImage, stddev1: number, stddev2: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00422 * \ingroup convolve */ 00423 int imProcessDiffOfGaussianConvolve(const imImage* src_image, imImage* dst_image, float stddev1, float stddev2); 00424 00425 /** Difference(Gaussian1, Gaussian2) using gaussian repetitions. \n 00426 * Supports all data types, 00427 * but if source is IM_BYTE or IM_USHORT destiny image must be of type IM_INT. 00428 * 00429 * \verbatim im.ProcessDiffOfGaussianConvolveRep(src_image: imImage, dst_image: imImage, stddev1: number, stddev2: number) -> counter: boolean [in Lua 5] \endverbatim 00430 * \verbatim im.ProcessDiffOfGaussianConvolveRepNew(image: imImage, stddev1: number, stddev2: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00431 * \ingroup convolve */ 00432 int imProcessDiffOfGaussianConvolveRep(const imImage* src_image, imImage* dst_image, float stddev1, float stddev2); 00433 00434 /** Convolution with a laplacian of a gaussian kernel. \n 00435 * Supports all data types, 00436 * but if source is IM_BYTE or IM_USHORT destiny image must be of type IM_INT. 00437 * 00438 * \verbatim im.ProcessLapOfGaussianConvolve(src_image: imImage, dst_image: imImage, stddev: number) -> counter: boolean [in Lua 5] \endverbatim 00439 * \verbatim im.ProcessLapOfGaussianConvolveNew(image: imImage, stddev: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00440 * \ingroup convolve */ 00441 int imProcessLapOfGaussianConvolve(const imImage* src_image, imImage* dst_image, float stddev); 00442 00443 /** Convolution with a kernel full of "1"s inside a circle. \n 00444 * Supports all data types. 00445 * 00446 * \verbatim im.ProcessMeanConvolve(src_image: imImage, dst_image: imImage, kernel_size: number) -> counter: boolean [in Lua 5] \endverbatim 00447 * \verbatim im.ProcessMeanConvolveNew(image: imImage, kernel_size: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00448 * \ingroup convolve */ 00449 int imProcessMeanConvolve(const imImage* src_image, imImage* dst_image, int kernel_size); 00450 00451 /** Convolution with a gaussian kernel. The gaussian in obtained by repetition of a base 3x3 IM_INT kernel. \n 00452 * Supports all data types. 00453 * 00454 * \verbatim im.ProcessGaussianConvolveRep(src_image: imImage, dst_image: imImage, stddev: number) -> counter: boolean [in Lua 5] \endverbatim 00455 * \verbatim im.ProcessGaussianConvolveRepNew(image: imImage, stddev: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00456 * \ingroup convolve */ 00457 int imProcessGaussianConvolveRep(const imImage* src_image, imImage* dst_image, float stddev); 00458 00459 /** Convolution with a float gaussian kernel. \n 00460 * Supports all data types. 00461 * 00462 * \verbatim im.ProcessGaussianConvolve(src_image: imImage, dst_image: imImage, stddev: number) -> counter: boolean [in Lua 5] \endverbatim 00463 * \verbatim im.ProcessGaussianConvolveNew(image: imImage, stddev: number) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00464 * \ingroup convolve */ 00465 int imProcessGaussianConvolve(const imImage* src_image, imImage* dst_image, float stddev); 00466 00467 /** Magnitude of the sobel convolution. \n 00468 * Supports all data types except IM_CFLOAT. 00469 * 00470 * \verbatim im.ProcessSobelConvolve(src_image: imImage, dst_image: imImage) -> counter: boolean [in Lua 5] \endverbatim 00471 * \verbatim im.ProcessSobelConvolveNew(image: imImage) -> counter: boolean, new_image: imImage [in Lua 5] \endverbatim 00472 * \ingroup convolve */ 00473 int imProcessSobelConvolve(const imImage* src_image, imImage* dst_image); 00474 00475 /** Finds the zero crossings of IM_INT and IM_FLOAT images. Crossings are marked with non zero values 00476 * indicating the intensity of the edge. It is usually used after a second derivative, laplace. \n 00477 * Extracted from XITE, Copyright 1991, Blab, UiO \n 00478 * http://www.ifi.uio.no/~blab/Software/Xite/ 00479 * 00480 * \verbatim im.ProcessZeroCrossing(src_image: imImage, dst_image: imImage) [in Lua 5] \endverbatim 00481 * \verbatim im.ProcessZeroCrossingNew(image: imImage) -> new_image: imImage [in Lua 5] \endverbatim 00482 * \ingroup convolve */ 00483 void imProcessZeroCrossing(const imImage* src_image, imImage* dst_image); 00484 00485 /** First part of the Canny edge detector. Includes the gaussian filtering and the nonmax suppression. \n 00486 * After using this you could apply a Hysteresis Threshold, see \ref imProcessHysteresisThreshold. \n 00487 * Image must be IM_BYTE/IM_GRAY. \n 00488 * Implementation from the book: 00489 \verbatim 00490 J. R. Parker 00491 "Algoritms for Image Processing and Computer Vision" 00492 WILEY 00493 \endverbatim 00494 * 00495 * \verbatim im.ProcessCanny(src_image: imImage, dst_image: imImage, stddev: number) [in Lua 5] \endverbatim 00496 * \verbatim im.ProcessCannyNew(image: imImage, stddev: number) -> new_image: imImage [in Lua 5] \endverbatim 00497 * \ingroup convolve */ 00498 void imProcessCanny(const imImage* src_image, imImage* dst_image, float stddev); 00499 00500 /** Calculates the number of 3x3 gaussian repetitions given the standard deviation. 00501 * 00502 * \verbatim im.GaussianStdDev2Repetitions(stddev: number) -> count: number [in Lua 5] \endverbatim 00503 * \ingroup convolve */ 00504 int imGaussianStdDev2Repetitions(float stddev); 00505 00506 /** Calculates the kernel size given the standard deviation. 00507 * 00508 * \verbatim im.GaussianStdDev2KernelSize(stddev: number) -> kernel_size: number [in Lua 5] \endverbatim 00509 * \ingroup convolve */ 00510 int imGaussianStdDev2KernelSize(float stddev); 00511 00512 00513 #if defined(__cplusplus) 00514 } 00515 #endif 00516 00517 #endif