]> granicus.if.org Git - imagemagick/blob - www/api/morphology.html
(no commit message)
[imagemagick] / www / api / morphology.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\r
2     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\r
3 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">\r
4 <head>\r
5   <meta http-equiv="content-type" content="text/html; charset=utf-8"/>\r
6   <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U=" />\r
7   <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf" />\r
8   <style type="text/css" media="all">\r
9     @import url("../../www/magick.css");\r
10   </style>\r
11   <link rel="shortcut icon" href="../../images/wand.ico"  type="images/vnd.microsoft.icon"/>
12   <title>ImageMagick: MagickCore, C API for ImageMagick: Morphological Erosions, Dilations, Openings, and Closings</title>
13   <meta http-equiv="Content-Language" content="en-US"/>
14   <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
15   <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
16   <meta name="Generator" content="PHP"/>
17   <meta name="Keywords" content="magickcore, c, api, for, imagemagick:, morphological, erosions, dilations, openings, closings, ImageMagick, ImageMagic, MagickCore, MagickWand, PerlMagick, Magick++, RMagick, PythonMagick, JMagick, TclMagick, Image, Magick, Magic, Wand, ImageMagickObject, Swiss, Army, Knife, Image, Processing"/>
18   <meta name="Description" content="ImageMagick® is a software suite to create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (about 100) including GIF, JPEG, JPEG-2000, PNG, PDF, PhotoCD, TIFF, and DPX. Use ImageMagick to translate, flip, mirror, rotate, scale, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves.  ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you can freely use, copy, modify, and distribute. Its license is compatible with the GPL. It runs on all major operating systems.  The functionality of ImageMagick is typically utilized from the command line or you can use the features from programs written in your favorite programming language. Choose from these interfaces: MagickCore (C), MagickWand (C), ChMagick (Ch), Magick++ (C++), JMagick (Java), L-Magick (Lisp), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images automagically and dynamically."/>
19   <meta name="Rating" content="GENERAL"/>
20   <meta name="Robots" content="INDEX, FOLLOW"/>
21   <meta name="Generator" content="ImageMagick Studio LLC"/>
22   <meta name="Author" content="ImageMagick Studio LLC"/>
23   <meta name="Revisit-after" content="2 DAYS"/>
24   <meta name="Resource-type" content="document"/>
25   <meta name="Copyright" content="Copyright (c) 1999-2010 ImageMagick Studio LLC"/>
26   <meta name="Distribution" content="Global"/>
27 </head>\r
28 \r
29 <body id="www-imagemagick-org">\r
30 <div class="titlebar">\r
31 <a href="../../index.html">\r
32   <img src="../../images/script.png" alt="[ImageMagick]"\r
33   style="width: 350px; height: 60px; margin: 28px auto; float: left;" /></a>\r
34 <a href="http://www.networkredux.com">\r
35   <img src="../../images/networkredux.png" alt="[sponsor]"\r
36   style="margin: 45px auto; border: 0px; float: left;" /></a>\r
37 <a href="http://www.imagemagick.org/discourse-server/">\r
38   <img src="../../images/logo.jpg" alt=""\r
39   style="width: 114px; height: 118px; border: 0px; float: right;" /></a>\r
40 <a href="../../index.html">\r
41   <img src="../../images/sprite.jpg" alt=""\r
42   style="width: 114px; height: 118px; border: 0px; float: right;" /></a>\r
43 </div>\r
44 \r
45 <div class="eastbar">\r
46 \r
47 <div class="menu">
48   <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
49 </div>
50 <div class="sep"></div>\r
51 <div class="menu">
52   <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
53 </div>
54 <div class="sub">
55     <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
56 </div>
57 <div class="sub">
58     <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
59 </div>
60 <div class="sub">
61     <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
62 </div>
63 <div class="sep"></div>\r
64 <div class="menu">
65   <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
66 </div>
67 <div class="sub">
68     <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
69 </div>
70 <div class="sub">
71     <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
72 </div>
73 <div class="sub">
74     <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
75 </div>
76 <div class="menu">
77   <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
78 </div>
79 <div class="sub">
80     <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
81 </div>
82 <div class="sub">
83     <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
84 </div>
85 <div class="sub">
86     <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
87 </div>
88 <div class="sub">
89     <a title="Program Interface: Magick++" href="../../Magick++/">Magick++</a>
90 </div>
91 <div class="sep"></div>\r
92 <div  class="menu">
93    <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
94 </div>
95 <div class="sub">
96     <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
97 </div>
98 <div class="sub">
99     <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
100  </div>
101 <div class="menu">
102   <a title="Resources" href="../../www/resources.html">Resources</a>
103 </div>
104 <div class="menu">
105   <a title="Architecture" href="../../www/architecture.html">Architecture</a>
106 </div>
107 <div class="menu">
108   <a title="Download" href="../../www/download.html">Download</a>
109 </div>
110 <div class="sep"></div>\r
111 <div class="menu">
112   <a title="Search" href="../http://www.imagemagick.org/script/search.php">Search</a>
113 </div>
114 <div class="sep"></div>\r
115 <div class="menu">
116   <a title="Site Map"href="../../www/sitemap.html">Site Map</a>
117 </div>
118 <div  class="sub">
119     <a title="Site Map: Links"href="../../www/links.html">Links</a>
120 </div>
121 <div class="sep"></div>\r
122 <div  class="menu">
123   <a title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>
124
125 <div class="sponsbox">
126 <div  class="sponsor">
127   <a title="Sponsor: Webdesign Agentur" href="http://www.ventzke-partner.de">Webdesign Agentur</a><!-- 201101010480 invendio.de-->
128 </div>
129 <div  class="sponsor">
130   <a title="Sponsor: LVM Versicherung" href="http://www.neu-reich.de">LVM Versicherung</a><!-- 201101010480 -->
131 </div>
132 <div  class="sponsor">
133   <a title="Sponsor: Deko.net" href="http://www.deko.net">Deko.net</a><!-- 201101010600 Peterssen-->
134 </div>
135 <div  class="sponsor">
136   <a title="Sponsor: Kredit" href="http://www.online-kredit-index.de">Kredit</a><!-- 201007010120 Buchhorn -->
137 </div>
138 <div  class="sponsor">
139   <a title="Sponsor: Druckerei" href="http://www.print24.de/">Druckerei</a><!-- 201009010720 -->
140 </div>
141 <div  class="sponsor">
142    <a title="Sponsor: Druckerei Online" href="http://www.allesdruck.de">Druckerei Online</a><!-- 201012011200 allesdruck.de-->
143 </div>
144 <div  class="sponsor">
145    <a title="Sponsor: Webdesign" href="http://www.renehornig.com/" title="Webdesign">Webdesign</a><!-- 20110101000120 -->
146 </div>
147 </div>
148 </div>
149 \r
150 \r
151 </div>\r
152 \r
153 <div class="main">\r
154 \r
155 <p class="navigation-index">[<a href="#** This macro  IsNaN">** This macro  IsNaN</a> &bull; <a href="#AcquireKernelInfo">AcquireKernelInfo</a> &bull; <a href="#AcquireKernelBuiltIn">AcquireKernelBuiltIn</a> &bull; <a href="#CloneKernelInfo">CloneKernelInfo</a> &bull; <a href="#DestroyKernelInfo">DestroyKernelInfo</a> &bull; <a href="#ExpandMirrorKernelInfo">ExpandMirrorKernelInfo</a> &bull; <a href="#ExpandRotateKernelInfo">ExpandRotateKernelInfo</a> &bull; <a href="#MorphologyApply">MorphologyApply</a> &bull; <a href="#MorphologyImageChannel">MorphologyImageChannel</a> &bull; <a href="#ScaleGeometryKernelInfo">ScaleGeometryKernelInfo</a> &bull; <a href="#ScaleKernelInfo">ScaleKernelInfo</a> &bull; <a href="#ShowKernelInfo">ShowKernelInfo</a> &bull; <a href="#UnityAddKernelInfo">UnityAddKernelInfo</a> &bull; <a href="#ZeroKernelNans">ZeroKernelNans</a>]</p>
156
157 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
158 _8c.html" target="source" name="** This macro  IsNaN">** This macro  IsNaN</a></h2>
159 <div class="doc-section">
160
161 <p>** This macro  IsNaN() is thus is only true if the value given is NaN. </p>
162  </div>
163 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
164 _8c.html" target="source" name="AcquireKernelInfo">AcquireKernelInfo</a></h2>
165 <div class="doc-section">
166
167 <p>AcquireKernelInfo() takes the given string (generally supplied by the user) and converts it into a Morphology/Convolution Kernel.  This allows users to specify a kernel from a number of pre-defined kernels, or to fully specify their own kernel for a specific Convolution or Morphology Operation.</p></ol>
168
169 <p>The kernel so generated can be any rectangular array of floating point values (doubles) with the 'control point' or 'pixel being affected' anywhere within that array of values.</p></ol>
170
171 <p>Previously IM was restricted to a square of odd size using the exact center as origin, this is no ssize_ter the case, and any rectangular kernel with any value being declared the origin. This in turn allows the use of highly asymmetrical kernels.</p></ol>
172
173 <p>The floating point values in the kernel can also include a special value known as 'nan' or 'not a number' to indicate that this value is not part of the kernel array. This allows you to shaped the kernel within its rectangular area. That is 'nan' values provide a 'mask' for the kernel shape.  However at least one non-nan value must be provided for correct working of a kernel.</p></ol>
174
175 <p>The returned kernel should be freed using the DestroyKernelInfo() when you are finished with it.  Do not free this memory yourself.</p></ol>
176
177 <p>Input kernel defintion strings can consist of any of three types.</p></ol>
178
179 <p>"name:args[[@><]" Select from one of the built in kernels, using the name and geometry arguments supplied.  See AcquireKernelBuiltIn()</p></ol>
180
181 <p>"WxH[+X+Y][@><]:num, num, num ..." a kernel of size W by H, with W*H floating point numbers following. the 'center' can be optionally be defined at +X+Y (such that +0+0 is top left corner). If not defined the pixel in the center, for odd sizes, or to the immediate top or left of center for even sizes is automatically selected.</p></ol>
182
183 <p>"num, num, num, num, ..." list of floating point numbers defining an 'old style' odd sized square kernel.  At least 9 values should be provided for a 3x3 square kernel, 25 for a 5x5 square kernel, 49 for 7x7, etc. Values can be space or comma separated.  This is not recommended.</p></ol>
184
185 <p>You can define a 'list of kernels' which can be used by some morphology operators A list is defined as a semi-colon seperated list kernels.</p></ol>
186
187 <p>" kernel ; kernel ; kernel ; "</p></ol>
188
189 <p>Any extra ';' characters, at start, end or between kernel defintions are simply ignored.</p></ol>
190
191 <p>The special flags will expand a single kernel, into a list of rotated kernels. A '@' flag will expand a 3x3 kernel into a list of 45-degree cyclic rotations, while a '>' will generate a list of 90-degree rotations. The '<' also exands using 90-degree rotates, but giving a 180-degree reflected kernel before the +/- 90-degree rotations, which can be important for Thinning operations.</p></ol>
192
193 <p>Note that 'name' kernels will start with an alphabetic character while the new kernel specification has a ':' character in its specification string. If neither is the case, it is assumed an old style of a simple list of numbers generating a odd-sized square kernel has been given.</p></ol>
194
195 <p>The format of the AcquireKernal method is:</p>
196
197 <pre class="code">
198   KernelInfo *AcquireKernelInfo(const char *kernel_string)
199 </pre>
200
201 <p>A description of each parameter follows:</p></ol>
202
203 <h5>kernel_string</h5>
204 <ol><p>the Morphology/Convolution kernel wanted.</p></ol>
205
206  </div>
207 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
208 _8c.html" target="source" name="AcquireKernelBuiltIn">AcquireKernelBuiltIn</a></h2>
209 <div class="doc-section">
210
211 <p>AcquireKernelBuiltIn() returned one of the 'named' built-in types of kernels used for special purposes such as gaussian blurring, skeleton pruning, and edge distance determination.</p></ol>
212
213 <p>They take a KernelType, and a set of geometry style arguments, which were typically decoded from a user supplied string, or from a more complex Morphology Method that was requested.</p></ol>
214
215 <p>The format of the AcquireKernalBuiltIn method is:</p>
216
217 <pre class="code">
218   KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
219        const GeometryInfo args)
220 </pre>
221
222 <p>A description of each parameter follows:</p></ol>
223
224 <h5>type</h5>
225 <ol><p>the pre-defined type of kernel wanted</p></ol>
226
227 <h5>args</h5>
228 <ol><p>arguments defining or modifying the kernel</p></ol>
229
230 <p>Convolution Kernels</p></ol>
231
232 <p>Unity the No-Op kernel, also requivelent to  Gaussian of sigma zero. Basically a 3x3 kernel of a 1 surrounded by zeros.</p></ol>
233
234 <p>Gaussian:{radius},{sigma} Generate a two-dimentional gaussian kernel, as used by -gaussian. The sigma for the curve is required.  The resulting kernel is normalized,</p></ol>
235
236 <p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p></ol>
237
238 <p>NOTE: that the 'radius' is optional, but if provided can limit (clip) the final size of the resulting kernel to a square 2*radius+1 in size. The radius should be at least 2 times that of the sigma value, or sever clipping and aliasing may result.  If not given or set to 0 the radius will be determined so as to produce the best minimal error result, which is usally much larger than is normally needed.</p></ol>
239
240 <p>LoG:{radius},{sigma} "Laplacian of a Gaussian" or "Mexician Hat" Kernel. The supposed ideal edge detection, zero-summing kernel.</p></ol>
241
242 <p>An alturnative to this kernel is to use a "DoG" with a sigma ratio of approx 1.6 (according to wikipedia).</p></ol>
243
244 <p>DoG:{radius},{sigma1},{sigma2} "Difference of Gaussians" Kernel. As "Gaussian" but with a gaussian produced by 'sigma2' subtracted from the gaussian produced by 'sigma1'. Typically sigma2 > sigma1. The result is a zero-summing kernel.</p></ol>
245
246 <p>Blur:{radius},{sigma}[,{angle}] Generates a 1 dimensional or linear gaussian blur, at the angle given (current restricted to orthogonal angles).  If a 'radius' is given the kernel is clipped to a width of 2*radius+1.  Kernel can be rotated by a 90 degree angle.</p></ol>
247
248 <p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p></ol>
249
250 <p>Note that two convolutions with two "Blur" kernels perpendicular to each other, is equivelent to a far larger "Gaussian" kernel with the same sigma value, However it is much faster to apply. This is how the "-blur" operator actually works.</p></ol>
251
252 <p>Comet:{width},{sigma},{angle} Blur in one direction only, much like how a bright object leaves a comet like trail.  The Kernel is actually half a gaussian curve, Adding two such blurs in opposite directions produces a Blur Kernel. Angle can be rotated in multiples of 90 degrees.</p></ol>
253
254 <p>Note that the first argument is the width of the kernel and not the radius of the kernel.</p></ol>
255
256 <p># Still to be implemented... # # Filter2D # Filter1D #    Set kernel values using a resize filter, and given scale (sigma) #    Cylindrical or Linear.   Is this posible with an image? #</p></ol>
257
258 <p>Named Constant Convolution Kernels</p></ol>
259
260 <p>All these are unscaled, zero-summing kernels by default. As such for non-HDRI version of ImageMagick some form of normalization, user scaling, and biasing the results is recommended, to prevent the resulting image being 'clipped'.</p></ol>
261
262 <p>The 3x3 kernels (most of these) can be circularly rotated in multiples of 45 degrees to generate the 8 angled varients of each of the kernels.</p></ol>
263
264 <p>Laplacian:{type} Discrete Lapacian Kernels, (without normalization) Type 0 :  3x3 with center:8 surounded by -1  (8 neighbourhood) Type 1 :  3x3 with center:4 edge:-1 corner:0 (4 neighbourhood) Type 2 :  3x3 with center:4 edge:1 corner:-2 Type 3 :  3x3 with center:4 edge:-2 corner:1 Type 5 :  5x5 laplacian Type 7 :  7x7 laplacian Type 15 : 5x5 LoG (sigma approx 1.4) Type 19 : 9x9 LoG (sigma approx 1.4)</p></ol>
265
266 <p>Sobel:{angle} Sobel 'Edge' convolution kernel (3x3) | -1, 0, 1 | | -2, 0,-2 | | -1, 0, 1 |</p></ol>
267
268 <p>Sobel:{type},{angle} Type 0:  default un-nomalized version shown above.</p></ol>
269
270 <p>Type 1:  As default but pre-normalized | 1, 0, -1 | | 2, 0, -2 |  / 4 | 1, 0, -1 |</p></ol>
271
272 <p>Type 2:  Diagonal version with same normalization as 1 | 1, 0, -1 | | 2, 0, -2 |  / 4 | 1, 0, -1 |</p></ol>
273
274 <p>Roberts:{angle} Roberts convolution kernel (3x3) |  0, 0, 0 | | -1, 1, 0 | |  0, 0, 0 |</p></ol>
275
276 <p>Prewitt:{angle} Prewitt Edge convolution kernel (3x3) | -1, 0, 1 | | -1, 0, 1 | | -1, 0, 1 |</p></ol>
277
278 <p>Compass:{angle} Prewitt's "Compass" convolution kernel (3x3) | -1, 1, 1 | | -1,-2, 1 | | -1, 1, 1 |</p></ol>
279
280 <p>Kirsch:{angle} Kirsch's "Compass" convolution kernel (3x3) | -3,-3, 5 | | -3, 0, 5 | | -3,-3, 5 |</p></ol>
281
282 <p>FreiChen:{angle} Frei-Chen Edge Detector is based on a kernel that is similar to the Sobel Kernel, but is designed to be isotropic. That is it takes into account the distance of the diagonal in the kernel.</p></ol>
283
284 <p>|   1,     0,   -1     | | sqrt(2), 0, -sqrt(2) | |   1,     0,   -1     |</p></ol>
285
286 <p>FreiChen:{type},{angle}</p></ol>
287
288 <p>Frei-Chen Pre-weighted kernels...</p></ol>
289
290 <p>Type 0:  default un-nomalized version shown above.</p></ol>
291
292 <p>Type 1: Orthogonal Kernel (same as type 11 below) |   1,     0,   -1     | | sqrt(2), 0, -sqrt(2) | / 2*sqrt(2) |   1,     0,   -1     |</p></ol>
293
294 <p>Type 2: Diagonal form of Kernel... |   1,     sqrt(2),    0     | | sqrt(2),   0,     -sqrt(2) | / 2*sqrt(2) |   0,    -sqrt(2)    -1     |</p></ol>
295
296 <p>However this kernel is als at the heart of the FreiChen Edge Detection Process which uses a set of 9 specially weighted kernel.  These 9 kernels not be normalized, but directly applied to the image. The results is then added together, to produce the intensity of an edge in a specific direction.  The square root of the pixel value can then be taken as the cosine of the edge, and at least 2 such runs at 90 degrees from each other, both the direction and the strength of the edge can be determined.</p></ol>
297
298 <p>Type 10: All 9 of the following pre-weighted kernels...</p></ol>
299
300 <p>Type 11: |   1,     0,   -1     | | sqrt(2), 0, -sqrt(2) | / 2*sqrt(2) |   1,     0,   -1     |</p></ol>
301
302 <p>Type 12: | 1, sqrt(2), 1 | | 0,   0,     0 | / 2*sqrt(2) | 1, sqrt(2), 1 |</p></ol>
303
304 <p>Type 13: | sqrt(2), -1,    0     | |  -1,      0,    1     | / 2*sqrt(2) |   0,      1, -sqrt(2) |</p></ol>
305
306 <p>Type 14: |    0,     1, -sqrt(2) | |   -1,     0,     1    | / 2*sqrt(2) | sqrt(2), -1,     0    |</p></ol>
307
308 <p>Type 15: | 0, -1, 0 | | 1,  0, 1 | / 2 | 0, -1, 0 |</p></ol>
309
310 <p>Type 16: |  1, 0, -1 | |  0, 0,  0 | / 2 | -1, 0,  1 |</p></ol>
311
312 <p>Type 17: |  1, -2,  1 | | -2,  4, -2 | / 6 | -1, -2,  1 |</p></ol>
313
314 <p>Type 18: | -2, 1, -2 | |  1, 4,  1 | / 6 | -2, 1, -2 |</p></ol>
315
316 <p>Type 19: | 1, 1, 1 | | 1, 1, 1 | / 3 | 1, 1, 1 |</p></ol>
317
318 <p>The first 4 are for edge detection, the next 4 are for line detection and the last is to add a average component to the results.</p></ol>
319
320 <p>Using a special type of '-1' will return all 9 pre-weighted kernels as a multi-kernel list, so that you can use them directly (without normalization) with the special "-set option:morphology:compose Plus" setting to apply the full FreiChen Edge Detection Technique.</p></ol>
321
322 <p>If 'type' is large it will be taken to be an actual rotation angle for the default FreiChen (type 0) kernel.  As such  FreiChen:45  will look like a  Sobel:45  but with 'sqrt(2)' instead of '2' values.</p></ol>
323
324 <p>WARNING: The above was layed out as per http://www.math.tau.ac.il/~turkel/notes/edge_detectors.pdf But rotated 90 degrees so direction is from left rather than the top. I have yet to find any secondary confirmation of the above. The only other source found was actual source code at http://ltswww.epfl.ch/~courstiv/exos_labos/sol3.pdf Neigher paper defineds the kernels in a way that looks locical or correct when taken as a whole.</p></ol>
325
326 <p>Boolean Kernels</p></ol>
327
328 <p>Diamond:[{radius}[,{scale}]] Generate a diamond shaped kernel with given radius to the points. Kernel size will again be radius*2+1 square and defaults to radius 1, generating a 3x3 kernel that is slightly larger than a square.</p></ol>
329
330 <p>Square:[{radius}[,{scale}]] Generate a square shaped kernel of size radius*2+1, and defaulting to a 3x3 (radius 1).</p></ol>
331
332 <p>Note that using a larger radius for the "Square" or the "Diamond" is also equivelent to iterating the basic morphological method that many times. However iterating with the smaller radius is actually faster than using a larger kernel radius.</p></ol>
333
334 <p>Rectangle:{geometry} Simply generate a rectangle of 1's with the size given. You can also specify the location of the 'control point', otherwise the closest pixel to the center of the rectangle is selected.</p></ol>
335
336 <p>Properly centered and odd sized rectangles work the best.</p></ol>
337
338 <p>Disk:[{radius}[,{scale}]] Generate a binary disk of the radius given, radius may be a float. Kernel size will be ceil(radius)*2+1 square. NOTE: Here are some disk shapes of specific interest "Disk:1"    => "diamond" or "cross:1" "Disk:1.5"  => "square" "Disk:2"    => "diamond:2" "Disk:2.5"  => a general disk shape of radius 2 "Disk:2.9"  => "square:2" "Disk:3.5"  => default - octagonal/disk shape of radius 3 "Disk:4.2"  => roughly octagonal shape of radius 4 "Disk:4.3"  => a general disk shape of radius 4 After this all the kernel shape becomes more and more circular.</p></ol>
339
340 <p>Because a "disk" is more circular when using a larger radius, using a larger radius is preferred over iterating the morphological operation.</p></ol>
341
342 <p>Symbol Dilation Kernels</p></ol>
343
344 <p>These kernel is not a good general morphological kernel, but is used more for highlighting and marking any single pixels in an image using, a "Dilate" method as appropriate.</p></ol>
345
346 <p>For the same reasons iterating these kernels does not produce the same result as using a larger radius for the symbol.</p></ol>
347
348 <p>Plus:[{radius}[,{scale}]] Cross:[{radius}[,{scale}]] Generate a kernel in the shape of a 'plus' or a 'cross' with a each arm the length of the given radius (default 2).</p></ol>
349
350 <p>NOTE: "plus:1" is equivelent to a "Diamond" kernel.</p></ol>
351
352 <p>Ring:{radius1},{radius2}[,{scale}] A ring of the values given that falls between the two radii. Defaults to a ring of approximataly 3 radius in a 7x7 kernel. This is the 'edge' pixels of the default "Disk" kernel, More specifically, "Ring" -> "Ring:2.5,3.5,1.0"</p></ol>
353
354 <p>Hit and Miss Kernels</p></ol>
355
356 <p>Peak:radius1,radius2 Find any peak larger than the pixels the fall between the two radii. The default ring of pixels is as per "Ring". Edges Find edges of a binary shape Corners Find corners of a binary shape Ridges:type Find single pixel ridges or thin lines LineEnds Find end points of lines (for pruning a skeletion) LineJunctions Find three line junctions (within a skeletion) ConvexHull Octagonal thicken kernel, to generate convex hulls of 45 degrees Skeleton:type Traditional skeleton generating kernels.</p></ol>
357
358 <p>Distance Measuring Kernels</p></ol>
359
360 <p>Different types of distance measuring methods, which are used with the a 'Distance' morphology method for generating a gradient based on distance from an edge of a binary shape, though there is a technique for handling a anti-aliased shape.</p></ol>
361
362 <p>See the 'Distance' Morphological Method, for information of how it is applied.</p></ol>
363
364 <p>Chebyshev:[{radius}][x{scale}[!]] Chebyshev Distance (also known as Tchebychev Distance) is a value of one to any neighbour, orthogonal or diagonal. One why of thinking of it is the number of squares a 'King' or 'Queen' in chess needs to traverse reach any other position on a chess board.  It results in a 'square' like distance function, but one where diagonals are closer than expected.</p></ol>
365
366 <p>Manhattan:[{radius}][x{scale}[!]] Manhattan Distance (also known as Rectilinear Distance, or the Taxi Cab metric), is the distance needed when you can only travel in orthogonal (horizontal or vertical) only.  It is the distance a 'Rook' in chess would travel. It results in a diamond like distances, where diagonals are further than expected.</p></ol>
367
368 <p>Euclidean:[{radius}][x{scale}[!]] Euclidean Distance is the 'direct' or 'as the crow flys distance. However by default the kernel size only has a radius of 1, which limits the distance to 'Knight' like moves, with only orthogonal and diagonal measurements being correct.  As such for the default kernel you will get octagonal like distance function, which is reasonally accurate.</p></ol>
369
370 <p>However if you use a larger radius such as "Euclidean:4" you will get a much smoother distance gradient from the edge of the shape. Of course a larger kernel is slower to use, and generally not needed.</p></ol>
371
372 <p>To allow the use of fractional distances that you get with diagonals the actual distance is scaled by a fixed value which the user can provide.  This is not actually nessary for either ""Chebyshev" or "Manhattan" distance kernels, but is done for all three distance kernels.  If no scale is provided it is set to a value of 100, allowing for a maximum distance measurement of 655 pixels using a Q16 version of IM, from any edge.  However for small images this can result in quite a dark gradient.</p></ol>
373
374  </div>
375 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
376 _8c.html" target="source" name="CloneKernelInfo">CloneKernelInfo</a></h2>
377 <div class="doc-section">
378
379 <p>CloneKernelInfo() creates a new clone of the given Kernel List so that its can be modified without effecting the original.  The cloned kernel should be destroyed using DestoryKernelInfo() when no ssize_ter needed.</p></ol>
380
381 <p>The format of the CloneKernelInfo method is:</p>
382
383 <pre class="code">
384   KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
385 </pre>
386
387 <p>A description of each parameter follows:</p></ol>
388
389 <h5>kernel</h5>
390 <ol><p>the Morphology/Convolution kernel to be cloned</p></ol>
391
392  </div>
393 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
394 _8c.html" target="source" name="DestroyKernelInfo">DestroyKernelInfo</a></h2>
395 <div class="doc-section">
396
397 <p>DestroyKernelInfo() frees the memory used by a Convolution/Morphology kernel.</p></ol>
398
399 <p>The format of the DestroyKernelInfo method is:</p>
400
401 <pre class="code">
402   KernelInfo *DestroyKernelInfo(KernelInfo *kernel)
403 </pre>
404
405 <p>A description of each parameter follows:</p></ol>
406
407 <h5>kernel</h5>
408 <ol><p>the Morphology/Convolution kernel to be destroyed</p></ol>
409
410  </div>
411 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
412 _8c.html" target="source" name="ExpandMirrorKernelInfo">ExpandMirrorKernelInfo</a></h2>
413 <div class="doc-section">
414
415 <p>ExpandMirrorKernelInfo() takes a single kernel, and expands it into a sequence of 90-degree rotated kernels but providing a reflected 180 rotatation, before the -/+ 90-degree rotations.</p></ol>
416
417 <p>This special rotation order produces a better, more symetrical thinning of objects.</p></ol>
418
419 <p>The format of the ExpandMirrorKernelInfo method is:</p>
420
421 <pre class="code">
422   void ExpandMirrorKernelInfo(KernelInfo *kernel)
423 </pre>
424
425 <p>A description of each parameter follows:</p></ol>
426
427 <h5>kernel</h5>
428 <ol><p>the Morphology/Convolution kernel</p></ol>
429
430 <p>This function is only internel to this module, as it is not finalized, especially with regard to non-orthogonal angles, and rotation of larger 2D kernels. </p>
431  </div>
432 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
433 _8c.html" target="source" name="ExpandRotateKernelInfo">ExpandRotateKernelInfo</a></h2>
434 <div class="doc-section">
435
436 <p>ExpandRotateKernelInfo() takes a kernel list, and expands it by rotating incrementally by the angle given, until the first kernel repeats.</p></ol>
437
438 <p>WARNING: 45 degree rotations only works for 3x3 kernels. While 90 degree roatations only works for linear and square kernels</p></ol>
439
440 <p>The format of the ExpandRotateKernelInfo method is:</p>
441
442 <pre class="code">
443   void ExpandRotateKernelInfo(KernelInfo *kernel, double angle)
444 </pre>
445
446 <p>A description of each parameter follows:</p></ol>
447
448 <h5>kernel</h5>
449 <ol><p>the Morphology/Convolution kernel</p></ol>
450
451 <h5>angle</h5>
452 <ol><p>angle to rotate in degrees</p></ol>
453
454 <p>This function is only internel to this module, as it is not finalized, especially with regard to non-orthogonal angles, and rotation of larger 2D kernels. </p>
455  </div>
456 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
457 _8c.html" target="source" name="MorphologyApply">MorphologyApply</a></h2>
458 <div class="doc-section">
459
460 <p>MorphologyApply() applies a morphological method, multiple times using a list of multiple kernels.</p></ol>
461
462 <p>It is basically equivelent to as MorphologyImageChannel() (see below) but without any user controls.  This allows internel programs to use this function, to actually perform a specific task without posible interference by any API user supplied settings.</p></ol>
463
464 <p>It is MorphologyImageChannel() task to extract any such user controls, and pass them to this function for processing.</p></ol>
465
466 <p>More specifically kernels are not normalized/scaled/blended by the 'convolve:scale' Image Artifact (setting), nor is the convolve bias (-bias setting or image->bias) loooked at, but must be supplied from the function arguments.</p></ol>
467
468 <p>The format of the MorphologyApply method is:</p>
469
470 <pre class="code">
471   Image *MorphologyApply(const Image *image,MorphologyMethod method,
472     const ssize_t iterations,const KernelInfo *kernel,
473     const CompositeMethod compose, const double bias,
474     ExceptionInfo *exception)
475 </pre>
476
477 <p>A description of each parameter follows:</p></ol>
478
479 <h5>image</h5>
480 <ol><p>the image.</p></ol>
481
482 <h5>method</h5>
483 <ol><p>the morphology method to be applied.</p></ol>
484
485 <h5>iterations</h5>
486 <ol><p>apply the operation this many times (or no change). A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.</p></ol>
487
488 <h5>channel</h5>
489 <ol><p>the channel type.</p></ol>
490
491 <h5>kernel</h5>
492 <ol><p>An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.</p></ol>
493
494 <h5>compose</h5>
495 <ol><p>How to handle or merge multi-kernel results. If 'Undefined' use default of the Morphology method. If 'No' force image to be re-iterated by each kernel. Otherwise merge the results using the mathematical compose method given.</p></ol>
496
497 <h5>bias</h5>
498 <ol><p>Convolution Output Bias.</p></ol>
499
500 <h5>exception</h5>
501 <ol><p>return any errors or warnings in this structure.</p></ol>
502
503  </div>
504 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
505 _8c.html" target="source" name="MorphologyImageChannel">MorphologyImageChannel</a></h2>
506 <div class="doc-section">
507
508 <p>MorphologyImageChannel() applies a user supplied kernel to the image according to the given mophology method.</p></ol>
509
510 <p>This function applies any and all user defined settings before calling the above internal function MorphologyApply().</p></ol>
511
512 <p>User defined settings include... * Output Bias for Convolution and correlation   ("-bias") * Kernel Scale/normalize settings     ("-set 'option:convolve:scale'") This can also includes the addition of a scaled unity kernel. * Show Kernel being applied           ("-set option:showkernel 1")</p></ol>
513
514 <p>The format of the MorphologyImage method is:</p>
515
516 <pre class="code">
517   Image *MorphologyImage(const Image *image,MorphologyMethod method,
518     const ssize_t iterations,KernelInfo *kernel,ExceptionInfo *exception)
519 </pre>
520
521 <p>Image *MorphologyImageChannel(const Image *image, const ChannelType channel,MorphologyMethod method,const ssize_t iterations, KernelInfo *kernel,ExceptionInfo *exception)</p></ol>
522
523 <p>A description of each parameter follows:</p></ol>
524
525 <h5>image</h5>
526 <ol><p>the image.</p></ol>
527
528 <h5>method</h5>
529 <ol><p>the morphology method to be applied.</p></ol>
530
531 <h5>iterations</h5>
532 <ol><p>apply the operation this many times (or no change). A value of -1 means loop until no change found. How this is applied may depend on the morphology method. Typically this is a value of 1.</p></ol>
533
534 <h5>channel</h5>
535 <ol><p>the channel type.</p></ol>
536
537 <h5>kernel</h5>
538 <ol><p>An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.</p></ol>
539
540 <h5>exception</h5>
541 <ol><p>return any errors or warnings in this structure.</p></ol>
542
543  </div>
544 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
545 _8c.html" target="source" name="ScaleGeometryKernelInfo">ScaleGeometryKernelInfo</a></h2>
546 <div class="doc-section">
547
548 <p>ScaleGeometryKernelInfo() takes a geometry argument string, typically provided as a  "-set option:convolve:scale {geometry}" user setting, and modifies the kernel according to the parsed arguments of that setting.</p></ol>
549
550 <p>The first argument (and any normalization flags) are passed to ScaleKernelInfo() to scale/normalize the kernel.  The second argument is then passed to UnityAddKernelInfo() to add a scled unity kernel into the scaled/normalized kernel.</p></ol>
551
552 <p>The format of the ScaleKernelInfo method is:</p>
553
554 <pre class="code">
555   void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
556            const MagickStatusType normalize_flags )
557 </pre>
558
559 <p>A description of each parameter follows:</p></ol>
560
561 <h5>kernel</h5>
562 <ol><p>the Morphology/Convolution kernel to modify</p></ol>
563
564 <p>o geometry:</p>
565
566 <pre class="text">
567          "-set option:convolve:scale {geometry}" setting.
568 </pre>
569
570  </div>
571 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
572 _8c.html" target="source" name="ScaleKernelInfo">ScaleKernelInfo</a></h2>
573 <div class="doc-section">
574
575 <p>ScaleKernelInfo() scales the given kernel list by the given amount, with or without normalization of the sum of the kernel values (as per given flags).</p></ol>
576
577 <p>By default (no flags given) the values within the kernel is scaled directly using given scaling factor without change.</p></ol>
578
579 <p>If either of the two 'normalize_flags' are given the kernel will first be normalized and then further scaled by the scaling factor value given.</p></ol>
580
581 <p>Kernel normalization ('normalize_flags' given) is designed to ensure that any use of the kernel scaling factor with 'Convolve' or 'Correlate' morphology methods will fall into -1.0 to +1.0 range.  Note that for non-HDRI versions of IM this may cause images to have any negative results clipped, unless some 'bias' is used.</p></ol>
582
583 <p>More specifically.  Kernels which only contain positive values (such as a 'Gaussian' kernel) will be scaled so that those values sum to +1.0, ensuring a 0.0 to +1.0 output range for non-HDRI images.</p></ol>
584
585 <p>For Kernels that contain some negative values, (such as 'Sharpen' kernels) the kernel will be scaled by the absolute of the sum of kernel values, so that it will generally fall within the +/- 1.0 range.</p></ol>
586
587 <p>For kernels whose values sum to zero, (such as 'Laplician' kernels) kernel will be scaled by just the sum of the postive values, so that its output range will again fall into the  +/- 1.0 range.</p></ol>
588
589 <p>For special kernels designed for locating shapes using 'Correlate', (often only containing +1 and -1 values, representing foreground/brackground matching) a special normalization method is provided to scale the positive values seperatally to those of the negative values, so the kernel will be forced to become a zero-sum kernel better suited to such searches.</p></ol>
590
591 <p>WARNING: Correct normalization of the kernel assumes that the '*_range' attributes within the kernel structure have been correctly set during the kernels creation.</p></ol>
592
593 <p>NOTE: The values used for 'normalize_flags' have been selected specifically to match the use of geometry options, so that '!' means NormalizeValue, '^' means CorrelateNormalizeValue.  All other GeometryFlags values are ignored.</p></ol>
594
595 <p>The format of the ScaleKernelInfo method is:</p>
596
597 <pre class="code">
598   void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
599            const MagickStatusType normalize_flags )
600 </pre>
601
602 <p>A description of each parameter follows:</p></ol>
603
604 <h5>kernel</h5>
605 <ol><p>the Morphology/Convolution kernel</p></ol>
606
607 <p>o scaling_factor:</p>
608
609 <pre class="text">
610          zero.  If the kernel is normalized regardless of any flags.
611 </pre>
612
613 <p>o normalize_flags:</p>
614
615 <pre class="text">
616          specifically: NormalizeValue, CorrelateNormalizeValue,
617                        and/or PercentValue
618 </pre>
619
620  </div>
621 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
622 _8c.html" target="source" name="ShowKernelInfo">ShowKernelInfo</a></h2>
623 <div class="doc-section">
624
625 <p>ShowKernelInfo() outputs the details of the given kernel defination to standard error, generally due to a users 'showkernel' option request.</p></ol>
626
627 <p>The format of the ShowKernel method is:</p>
628
629 <pre class="code">
630   void ShowKernelInfo(KernelInfo *kernel)
631 </pre>
632
633 <p>A description of each parameter follows:</p></ol>
634
635 <h5>kernel</h5>
636 <ol><p>the Morphology/Convolution kernel</p></ol>
637
638  </div>
639 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
640 _8c.html" target="source" name="UnityAddKernelInfo">UnityAddKernelInfo</a></h2>
641 <div class="doc-section">
642
643 <p>UnityAddKernelInfo() Adds a given amount of the 'Unity' Convolution Kernel to the given pre-scaled and normalized Kernel.  This in effect adds that amount of the original image into the resulting convolution kernel.  This value is usually provided by the user as a percentage value in the 'convolve:scale' setting.</p></ol>
644
645 <p>The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.</p></ol>
646
647 <p>The format of the UnityAdditionKernelInfo method is:</p>
648
649 <pre class="code">
650   void UnityAdditionKernelInfo(KernelInfo *kernel, const double scale )
651 </pre>
652
653 <p>A description of each parameter follows:</p></ol>
654
655 <h5>kernel</h5>
656 <ol><p>the Morphology/Convolution kernel</p></ol>
657
658 <p>o scale:</p>
659
660 <pre class="text">
661          the given kernel.
662 </pre>
663
664  </div>
665 <h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
666 _8c.html" target="source" name="ZeroKernelNans">ZeroKernelNans</a></h2>
667 <div class="doc-section">
668
669 <p>ZeroKernelNans() replaces any special 'nan' value that may be present in the kernel with a zero value.  This is typically done when the kernel will be used in special hardware (GPU) convolution processors, to simply matters.</p></ol>
670
671 <p>The format of the ZeroKernelNans method is:</p>
672
673 <pre class="code">
674   void ZeroKernelNans (KernelInfo *kernel)
675 </pre>
676
677 <p>A description of each parameter follows:</p></ol>
678
679 <h5>kernel</h5>
680 <ol><p>the Morphology/Convolution kernel</p></ol>
681
682  </div>
683 \r
684 </div>\r
685 \r
686 <div id="linkbar">\r
687  <!--    <span id="linkbar-west">&nbsp;</span>  -->\r
688     <span id="linkbar-center">\r
689       <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;\r
690     <a href="http://studio.webbyland.com/ImageMagick/MagickStudio/scripts/MagickStudio.cgi">Studio</a>\r
691     </span>\r
692     <span id="linkbar-east">&nbsp;</span>\r
693   </div>\r
694   <div class="footer">\r
695     <span id="footer-west">&copy; 1999-2010 ImageMagick Studio LLC</span>\r
696     <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>\r
697   </div>\r
698   <div style="clear: both; margin: 0; width: 100%; "></div>\r
699 </body>\r
700 </html>\r