blob: febb9e04b9134e242a3be0df2ecae64e5e71b920 [file] [log] [blame]
cristydcca3fa2010-12-29 21:50:07 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" dir="ltr">
cristy3eaa0ef2010-03-06 20:35:26 +00004<head>
cristy3c98a4f2010-08-13 20:09:41 +00005 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
6 <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U="/>
cristyffb69ed2010-12-25 00:06:48 +00007 <title>ImageMagick: MagickCore, C API for ImageMagick: Morphological Erosions, Dilations, Openings, and Closings</title>
cristyd2baf7d2010-03-06 04:26:44 +00008 <meta http-equiv="Content-Language" content="en-US"/>
9 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
10 <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
cristy3c98a4f2010-08-13 20:09:41 +000011 <meta name="Application-name" content="ImageMagick"/>
cristyaf8d6652011-02-04 21:57:45 +000012 <meta name="Description" content="Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats. In addition resize, rotate, shear, distort and transform images."/>
cristy3c98a4f2010-08-13 20:09:41 +000013 <meta name="Application-url" content="http://www.imagemagick.org"/>
cristyd2baf7d2010-03-06 04:26:44 +000014 <meta name="Generator" content="PHP"/>
15 <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"/>
cristyd2baf7d2010-03-06 04:26:44 +000016 <meta name="Rating" content="GENERAL"/>
17 <meta name="Robots" content="INDEX, FOLLOW"/>
18 <meta name="Generator" content="ImageMagick Studio LLC"/>
19 <meta name="Author" content="ImageMagick Studio LLC"/>
20 <meta name="Revisit-after" content="2 DAYS"/>
21 <meta name="Resource-type" content="document"/>
cristy4103d562010-12-10 01:38:54 +000022 <meta name="Copyright" content="Copyright (c) 1999-2011 ImageMagick Studio LLC"/>
cristyd2baf7d2010-03-06 04:26:44 +000023 <meta name="Distribution" content="Global"/>
cristydcca3fa2010-12-29 21:50:07 +000024 <link rel="icon" href="../../images/wand.png"/>
cristy3c98a4f2010-08-13 20:09:41 +000025 <link rel="shortcut icon" href="../../images/wand.ico" type="images/x-icon"/>
26 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
cristy7a40ba82011-01-08 20:31:18 +000027 <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
cristy3c98a4f2010-08-13 20:09:41 +000028 <style type="text/css" media="all">
29 @import url("../../www/magick.css");
30 </style>
cristydcca3fa2010-12-29 21:50:07 +000031 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
cristy361f4662010-12-31 23:02:52 +000032 <script type="text/javascript" src="../fancybox/jquery.fancybox-1.3.4.pack.js"></script>
33 <link rel="stylesheet" type="text/css" href="../fancybox/jquery.fancybox-1.3.4.css" media="screen" />
34 <script type="text/javascript">
35 $(document).ready(function() {
36 $("a[href$=.jpg],a[href$=.png],a[href$=.gif]").fancybox({
37 'transitionIn' : 'elastic',
38 'transitionOut' : 'elastic',
39 'overlayShow' : false,
40 'opacity' : true
41 });
42 });
43 </script>
cristy3eaa0ef2010-03-06 20:35:26 +000044</head>
45
46<body id="www-imagemagick-org">
47<div class="titlebar">
48<a href="../../index.html">
49 <img src="../../images/script.png" alt="[ImageMagick]"
50 style="width: 350px; height: 60px; margin: 28px auto; float: left;" /></a>
51<a href="http://www.networkredux.com">
52 <img src="../../images/networkredux.png" alt="[sponsor]"
cristy52923442011-01-15 22:54:31 +000053 style="margin-top: 42px; border: 0px; float: left;" /></a>
cristy3eaa0ef2010-03-06 20:35:26 +000054<a href="http://www.imagemagick.org/discourse-server/">
cristyaf8d6652011-02-04 21:57:45 +000055 <img src="../../images/logo.jpg"
56 alt="ImageMagick Logo"
cristy178edaf2011-01-23 03:42:39 +000057 style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
cristy3eaa0ef2010-03-06 20:35:26 +000058<a href="../../index.html">
cristyaf8d6652011-02-04 21:57:45 +000059 <img src="../../images/sprite.jpg"
60 alt="ImageMagick Sprite"
cristy3eaa0ef2010-03-06 20:35:26 +000061 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
62</div>
63
cristyce69bb02010-07-27 19:49:46 +000064<div class="westbar">
cristy3eaa0ef2010-03-06 20:35:26 +000065
cristyd2baf7d2010-03-06 04:26:44 +000066<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000067 <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
cristyd2baf7d2010-03-06 04:26:44 +000068</div>
cristy3eaa0ef2010-03-06 20:35:26 +000069<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +000070<div class="menu">
cristybb503372010-05-27 20:51:26 +000071 <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
72</div>
73<div class="sub">
74 <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
75</div>
76<div class="sub">
77 <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
78</div>
79<div class="sub">
80 <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
81</div>
82<div class="sep"></div>
83<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000084 <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
cristyd2baf7d2010-03-06 04:26:44 +000085</div>
86<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000087 <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
cristyd2baf7d2010-03-06 04:26:44 +000088</div>
89<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000090 <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
cristyd2baf7d2010-03-06 04:26:44 +000091</div>
92<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000093 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
cristyd2baf7d2010-03-06 04:26:44 +000094</div>
95<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000096 <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
cristyd2baf7d2010-03-06 04:26:44 +000097</div>
98<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000099 <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
cristyd2baf7d2010-03-06 04:26:44 +0000100</div>
101<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000102 <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
cristyd2baf7d2010-03-06 04:26:44 +0000103</div>
104<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000105 <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
cristyd2baf7d2010-03-06 04:26:44 +0000106</div>
107<div class="sub">
cristydcca3fa2010-12-29 21:50:07 +0000108 <a title="Program Interface: Magick++" href="../../www/magick++.html">Magick++</a>
cristyd2baf7d2010-03-06 04:26:44 +0000109</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000110<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000111<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000112 <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
cristyd2baf7d2010-03-06 04:26:44 +0000113</div>
114<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000115 <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
cristyd2baf7d2010-03-06 04:26:44 +0000116</div>
117<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000118 <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
cristyd2baf7d2010-03-06 04:26:44 +0000119 </div>
120<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000121 <a title="Resources" href="../../www/resources.html">Resources</a>
cristyd2baf7d2010-03-06 04:26:44 +0000122</div>
cristybb503372010-05-27 20:51:26 +0000123<div class="menu">
124 <a title="Architecture" href="../../www/architecture.html">Architecture</a>
125</div>
cristyd2baf7d2010-03-06 04:26:44 +0000126<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000127 <a title="Download" href="../../www/download.html">Download</a>
cristyd2baf7d2010-03-06 04:26:44 +0000128</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000129<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000130<div class="menu">
cristy52923442011-01-15 22:54:31 +0000131 <a title="Search" href="../../www/search.html">Search</a>
cristyd2baf7d2010-03-06 04:26:44 +0000132</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000133<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000134<div class="menu">
cristyffb69ed2010-12-25 00:06:48 +0000135 <a title="Site Map" href="../../www/sitemap.html">Site Map</a>
cristyd2baf7d2010-03-06 04:26:44 +0000136</div>
137<div class="sub">
cristyffb69ed2010-12-25 00:06:48 +0000138 <a title="Site Map: Links" href="../../www/links.html">Links</a>
cristyd2baf7d2010-03-06 04:26:44 +0000139</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000140<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000141<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000142 <a title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>
cristyd2baf7d2010-03-06 04:26:44 +0000143
144<div class="sponsbox">
cristy178edaf2011-01-23 03:42:39 +0000145<div class="sponsor">
cristyaf8d6652011-02-04 21:57:45 +0000146 <a title="Sponsor: Best Web Hosting" href="http://webhostinggeeks.com">Best Web Hosting</a><!-- 201110010720 -->
147</div>
148<div class="sponsor">
149 <a title="Sponsor: Web Hosting Ratings" href="http://webhostingrating.com">Web Hosting Ratings</a><!-- 201110010720 -->
150</div>
151<div class="sponsor">
cristy178edaf2011-01-23 03:42:39 +0000152 <a title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201106010240 -->
153</div>
cristyec6b4752011-01-08 03:16:23 +0000154<div class="sponsor">
cristy52923442011-01-15 22:54:31 +0000155 <a title="Sponsor: Web Hosting" href="http://www.bodhost.com/hosting.shtml">Web Hosting</a><!-- 201104010090 -->
cristy73fd1cd2010-09-12 19:14:25 +0000156</div>
157<div class="sponsor">
cristyc5baf4f2010-08-31 15:05:33 +0000158 <a title="Sponsor: Image Converter" href="http://www.batchphoto.com">Image Converter</a><!-- 201103010900 Bits Coffee-->
159</div>
160<div class="sponsor">
cristy851dbce2010-08-06 21:40:00 +0000161 <a title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
162</div>
cristyec6b4752011-01-08 03:16:23 +0000163<div class="sponsor">
cristy178edaf2011-01-23 03:42:39 +0000164 <a title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
165</div>
166<div class="sponsor">
cristya3c43262011-02-13 16:50:35 +0000167 <a title="Sponsor: Notebook Reparatur Berlin" href="http://www.notebook-reparaturen-berlin.de">Notebook Reparatur Berlin</a><!-- 2011050100025 gabi.schulze-->
cristyec6b4752011-01-08 03:16:23 +0000168</div>
cristyd2baf7d2010-03-06 04:26:44 +0000169</div>
170</div>
cristyce69bb02010-07-27 19:49:46 +0000171</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000172
cristyce69bb02010-07-27 19:49:46 +0000173<div class="eastbar">
174 <script type="text/javascript">
175 <!--
176 google_ad_client = "pub-3129977114552745";
cristyce69bb02010-07-27 19:49:46 +0000177 google_ad_slot = "0574824969";
178 google_ad_width = 160;
179 google_ad_height = 600;
180 //-->
181 </script>
182 <script type="text/javascript"
183 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
184 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000185</div>
186
187<div class="main">
188
cristy307ba182010-12-25 01:00:34 +0000189<h1>Module morphology
190 Methods</h1>
cristya7cb4312010-06-26 00:47:03 +0000191<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="#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>
cristyd2baf7d2010-03-06 04:26:44 +0000192
cristy70b59b62011-02-07 19:09:57 +0000193<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000194_8c.html" id="**_This macro IsNaN">** This macro IsNaN</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000195<div class="doc-section">
196
cristybb503372010-05-27 20:51:26 +0000197<p>** This macro IsNaN() is thus is only true if the value given is NaN. </p>
cristyd2baf7d2010-03-06 04:26:44 +0000198 </div>
cristy70b59b62011-02-07 19:09:57 +0000199<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000200_8c.html" id="AcquireKernelInfo">AcquireKernelInfo</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000201<div class="doc-section">
202
cristy7a40ba82011-01-08 20:31:18 +0000203<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>
cristyd2baf7d2010-03-06 04:26:44 +0000204
cristy7a40ba82011-01-08 20:31:18 +0000205<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>
cristyd2baf7d2010-03-06 04:26:44 +0000206
cristy7a40ba82011-01-08 20:31:18 +0000207<p>Previously IM was restricted to a square of odd size using the exact center as origin, this is no longer the case, and any rectangular kernel with any value being declared the origin. This in turn allows the use of highly asymmetrical kernels.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000208
cristy7a40ba82011-01-08 20:31:18 +0000209<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>
cristyd2baf7d2010-03-06 04:26:44 +0000210
cristy7a40ba82011-01-08 20:31:18 +0000211<p>The returned kernel should be freed using the DestroyKernelInfo() when you are finished with it. Do not free this memory yourself.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000212
cristy7a40ba82011-01-08 20:31:18 +0000213<p>Input kernel defintion strings can consist of any of three types.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000214
cristy7a40ba82011-01-08 20:31:18 +0000215<p>"name:args[[@><]" Select from one of the built in kernels, using the name and geometry arguments supplied. See AcquireKernelBuiltIn()</p>
cristyd2baf7d2010-03-06 04:26:44 +0000216
cristy7a40ba82011-01-08 20:31:18 +0000217<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>
cristyd2baf7d2010-03-06 04:26:44 +0000218
cristy7a40ba82011-01-08 20:31:18 +0000219<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>
cristyd2baf7d2010-03-06 04:26:44 +0000220
cristy7a40ba82011-01-08 20:31:18 +0000221<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000222
cristy7a40ba82011-01-08 20:31:18 +0000223<p>" kernel ; kernel ; kernel ; "</p>
cristyf0d1f5d2010-05-13 16:29:38 +0000224
cristy7a40ba82011-01-08 20:31:18 +0000225<p>Any extra ';' characters, at start, end or between kernel defintions are simply ignored.</p>
cristyc4960862010-05-23 22:24:24 +0000226
cristy7a40ba82011-01-08 20:31:18 +0000227<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>
cristyc3186d52010-06-04 13:55:23 +0000228
cristy7a40ba82011-01-08 20:31:18 +0000229<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000230
cristyd2baf7d2010-03-06 04:26:44 +0000231<p>The format of the AcquireKernal method is:</p>
232
233<pre class="code">
234 KernelInfo *AcquireKernelInfo(const char *kernel_string)
235</pre>
236
cristy7a40ba82011-01-08 20:31:18 +0000237<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000238
239<h5>kernel_string</h5>
cristy7a40ba82011-01-08 20:31:18 +0000240<p>the Morphology/Convolution kernel wanted.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000241
242 </div>
cristy70b59b62011-02-07 19:09:57 +0000243<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000244_8c.html" id="AcquireKernelBuiltIn">AcquireKernelBuiltIn</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000245<div class="doc-section">
246
cristy7a40ba82011-01-08 20:31:18 +0000247<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>
cristyd2baf7d2010-03-06 04:26:44 +0000248
cristy7a40ba82011-01-08 20:31:18 +0000249<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>
cristyd2baf7d2010-03-06 04:26:44 +0000250
251<p>The format of the AcquireKernalBuiltIn method is:</p>
252
253<pre class="code">
254 KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
255 const GeometryInfo args)
256</pre>
257
cristy7a40ba82011-01-08 20:31:18 +0000258<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000259
260<h5>type</h5>
cristy7a40ba82011-01-08 20:31:18 +0000261<p>the pre-defined type of kernel wanted</p>
cristyd2baf7d2010-03-06 04:26:44 +0000262
263<h5>args</h5>
cristy7a40ba82011-01-08 20:31:18 +0000264<p>arguments defining or modifying the kernel</p>
cristyd2baf7d2010-03-06 04:26:44 +0000265
cristy7a40ba82011-01-08 20:31:18 +0000266<p>Convolution Kernels</p>
cristyd2baf7d2010-03-06 04:26:44 +0000267
cristy7a40ba82011-01-08 20:31:18 +0000268<p>Unity the No-Op kernel, also requivelent to Gaussian of sigma zero. Basically a 3x3 kernel of a 1 surrounded by zeros.</p>
cristyc4960862010-05-23 22:24:24 +0000269
cristy7a40ba82011-01-08 20:31:18 +0000270<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>
cristyf1310b52010-05-15 16:42:04 +0000271
cristy7a40ba82011-01-08 20:31:18 +0000272<p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000273
cristy7a40ba82011-01-08 20:31:18 +0000274<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>
cristyd2baf7d2010-03-06 04:26:44 +0000275
cristy7a40ba82011-01-08 20:31:18 +0000276<p>LoG:{radius},{sigma} "Laplacian of a Gaussian" or "Mexician Hat" Kernel. The supposed ideal edge detection, zero-summing kernel.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000277
cristy7a40ba82011-01-08 20:31:18 +0000278<p>An alturnative to this kernel is to use a "DoG" with a sigma ratio of approx 1.6 (according to wikipedia).</p>
cristyc4960862010-05-23 22:24:24 +0000279
cristy7a40ba82011-01-08 20:31:18 +0000280<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>
cristyc4960862010-05-23 22:24:24 +0000281
cristy7a40ba82011-01-08 20:31:18 +0000282<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>
cristyf1310b52010-05-15 16:42:04 +0000283
cristy7a40ba82011-01-08 20:31:18 +0000284<p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p>
cristyf1310b52010-05-15 16:42:04 +0000285
cristy7a40ba82011-01-08 20:31:18 +0000286<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>
cristyf1310b52010-05-15 16:42:04 +0000287
cristy7a40ba82011-01-08 20:31:18 +0000288<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>
cristyd2baf7d2010-03-06 04:26:44 +0000289
cristy7a40ba82011-01-08 20:31:18 +0000290<p>Note that the first argument is the width of the kernel and not the radius of the kernel.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000291
cristy7a40ba82011-01-08 20:31:18 +0000292<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000293
cristy7a40ba82011-01-08 20:31:18 +0000294<p>Named Constant Convolution Kernels</p>
cristyf0d1f5d2010-05-13 16:29:38 +0000295
cristy7a40ba82011-01-08 20:31:18 +0000296<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000297
cristy7a40ba82011-01-08 20:31:18 +0000298<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>
cristyf1310b52010-05-15 16:42:04 +0000299
cristy7a40ba82011-01-08 20:31:18 +0000300<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>
cristyf1310b52010-05-15 16:42:04 +0000301
cristy7a40ba82011-01-08 20:31:18 +0000302<p>Sobel:{angle} Sobel 'Edge' convolution kernel (3x3) | -1, 0, 1 | | -2, 0,-2 | | -1, 0, 1 |</p>
cristyc4960862010-05-23 22:24:24 +0000303
cristy7a40ba82011-01-08 20:31:18 +0000304<p>Sobel:{type},{angle} Type 0: default un-nomalized version shown above.</p>
cristyc4960862010-05-23 22:24:24 +0000305
cristy7a40ba82011-01-08 20:31:18 +0000306<p>Type 1: As default but pre-normalized | 1, 0, -1 | | 2, 0, -2 | / 4 | 1, 0, -1 |</p>
cristybb503372010-05-27 20:51:26 +0000307
cristy7a40ba82011-01-08 20:31:18 +0000308<p>Type 2: Diagonal version with same normalization as 1 | 1, 0, -1 | | 2, 0, -2 | / 4 | 1, 0, -1 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000309
cristy7a40ba82011-01-08 20:31:18 +0000310<p>Roberts:{angle} Roberts convolution kernel (3x3) | 0, 0, 0 | | -1, 1, 0 | | 0, 0, 0 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000311
cristy7a40ba82011-01-08 20:31:18 +0000312<p>Prewitt:{angle} Prewitt Edge convolution kernel (3x3) | -1, 0, 1 | | -1, 0, 1 | | -1, 0, 1 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000313
cristy7a40ba82011-01-08 20:31:18 +0000314<p>Compass:{angle} Prewitt's "Compass" convolution kernel (3x3) | -1, 1, 1 | | -1,-2, 1 | | -1, 1, 1 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000315
cristy7a40ba82011-01-08 20:31:18 +0000316<p>Kirsch:{angle} Kirsch's "Compass" convolution kernel (3x3) | -3,-3, 5 | | -3, 0, 5 | | -3,-3, 5 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000317
cristy7a40ba82011-01-08 20:31:18 +0000318<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>
cristyfe0019b2010-06-07 02:23:32 +0000319
cristy7a40ba82011-01-08 20:31:18 +0000320<p>| 1, 0, -1 | | sqrt(2), 0, -sqrt(2) | | 1, 0, -1 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000321
cristy7a40ba82011-01-08 20:31:18 +0000322<p>FreiChen:{type},{angle}</p>
cristyfe0019b2010-06-07 02:23:32 +0000323
cristy7a40ba82011-01-08 20:31:18 +0000324<p>Frei-Chen Pre-weighted kernels...</p>
cristyfe0019b2010-06-07 02:23:32 +0000325
cristy7a40ba82011-01-08 20:31:18 +0000326<p>Type 0: default un-nomalized version shown above.</p>
cristyfe0019b2010-06-07 02:23:32 +0000327
cristy7a40ba82011-01-08 20:31:18 +0000328<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>
cristyfe0019b2010-06-07 02:23:32 +0000329
cristy7a40ba82011-01-08 20:31:18 +0000330<p>Type 2: Diagonal form of Kernel... | 1, sqrt(2), 0 | | sqrt(2), 0, -sqrt(2) | / 2*sqrt(2) | 0, -sqrt(2) -1 |</p>
cristybb503372010-05-27 20:51:26 +0000331
cristy7a40ba82011-01-08 20:31:18 +0000332<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>
cristybb503372010-05-27 20:51:26 +0000333
cristy7a40ba82011-01-08 20:31:18 +0000334<p>Type 10: All 9 of the following pre-weighted kernels...</p>
cristyc4960862010-05-23 22:24:24 +0000335
cristy7a40ba82011-01-08 20:31:18 +0000336<p>Type 11: | 1, 0, -1 | | sqrt(2), 0, -sqrt(2) | / 2*sqrt(2) | 1, 0, -1 |</p>
cristyc4960862010-05-23 22:24:24 +0000337
cristy7a40ba82011-01-08 20:31:18 +0000338<p>Type 12: | 1, sqrt(2), 1 | | 0, 0, 0 | / 2*sqrt(2) | 1, sqrt(2), 1 |</p>
cristyc4960862010-05-23 22:24:24 +0000339
cristy7a40ba82011-01-08 20:31:18 +0000340<p>Type 13: | sqrt(2), -1, 0 | | -1, 0, 1 | / 2*sqrt(2) | 0, 1, -sqrt(2) |</p>
cristyc4960862010-05-23 22:24:24 +0000341
cristy7a40ba82011-01-08 20:31:18 +0000342<p>Type 14: | 0, 1, -sqrt(2) | | -1, 0, 1 | / 2*sqrt(2) | sqrt(2), -1, 0 |</p>
cristyc4960862010-05-23 22:24:24 +0000343
cristy7a40ba82011-01-08 20:31:18 +0000344<p>Type 15: | 0, -1, 0 | | 1, 0, 1 | / 2 | 0, -1, 0 |</p>
cristyc4960862010-05-23 22:24:24 +0000345
cristy7a40ba82011-01-08 20:31:18 +0000346<p>Type 16: | 1, 0, -1 | | 0, 0, 0 | / 2 | -1, 0, 1 |</p>
cristyc4960862010-05-23 22:24:24 +0000347
cristy7a40ba82011-01-08 20:31:18 +0000348<p>Type 17: | 1, -2, 1 | | -2, 4, -2 | / 6 | -1, -2, 1 |</p>
cristyc4960862010-05-23 22:24:24 +0000349
cristy7a40ba82011-01-08 20:31:18 +0000350<p>Type 18: | -2, 1, -2 | | 1, 4, 1 | / 6 | -2, 1, -2 |</p>
cristyfe0019b2010-06-07 02:23:32 +0000351
cristy7a40ba82011-01-08 20:31:18 +0000352<p>Type 19: | 1, 1, 1 | | 1, 1, 1 | / 3 | 1, 1, 1 |</p>
cristyc4960862010-05-23 22:24:24 +0000353
cristy7a40ba82011-01-08 20:31:18 +0000354<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>
cristyc4960862010-05-23 22:24:24 +0000355
cristy7a40ba82011-01-08 20:31:18 +0000356<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>
cristybb503372010-05-27 20:51:26 +0000357
cristy7a40ba82011-01-08 20:31:18 +0000358<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>
cristybb503372010-05-27 20:51:26 +0000359
cristy7a40ba82011-01-08 20:31:18 +0000360<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>
cristyd2baf7d2010-03-06 04:26:44 +0000361
cristy7a40ba82011-01-08 20:31:18 +0000362<p>Boolean Kernels</p>
cristyd2baf7d2010-03-06 04:26:44 +0000363
cristy7a40ba82011-01-08 20:31:18 +0000364<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>
cristyd2baf7d2010-03-06 04:26:44 +0000365
cristy7a40ba82011-01-08 20:31:18 +0000366<p>Square:[{radius}[,{scale}]] Generate a square shaped kernel of size radius*2+1, and defaulting to a 3x3 (radius 1).</p>
cristyd2baf7d2010-03-06 04:26:44 +0000367
cristy7a40ba82011-01-08 20:31:18 +0000368<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>
cristyd2baf7d2010-03-06 04:26:44 +0000369
cristy7a40ba82011-01-08 20:31:18 +0000370<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>
cristyf1310b52010-05-15 16:42:04 +0000371
cristy7a40ba82011-01-08 20:31:18 +0000372<p>Properly centered and odd sized rectangles work the best.</p>
cristyf1310b52010-05-15 16:42:04 +0000373
cristy7a40ba82011-01-08 20:31:18 +0000374<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>
cristyd2baf7d2010-03-06 04:26:44 +0000375
cristy7a40ba82011-01-08 20:31:18 +0000376<p>Because a "disk" is more circular when using a larger radius, using a larger radius is preferred over iterating the morphological operation.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000377
cristy7a40ba82011-01-08 20:31:18 +0000378<p>Symbol Dilation Kernels</p>
cristyd2baf7d2010-03-06 04:26:44 +0000379
cristy7a40ba82011-01-08 20:31:18 +0000380<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>
cristy6f6c2962010-05-14 01:39:00 +0000381
cristy7a40ba82011-01-08 20:31:18 +0000382<p>For the same reasons iterating these kernels does not produce the same result as using a larger radius for the symbol.</p>
cristy6f6c2962010-05-14 01:39:00 +0000383
cristy7a40ba82011-01-08 20:31:18 +0000384<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>
cristyf1310b52010-05-15 16:42:04 +0000385
cristy7a40ba82011-01-08 20:31:18 +0000386<p>NOTE: "plus:1" is equivelent to a "Diamond" kernel.</p>
cristyf1310b52010-05-15 16:42:04 +0000387
cristy7a40ba82011-01-08 20:31:18 +0000388<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>
cristyf1310b52010-05-15 16:42:04 +0000389
cristy7a40ba82011-01-08 20:31:18 +0000390<p>Hit and Miss Kernels</p>
cristy6f6c2962010-05-14 01:39:00 +0000391
cristy7a40ba82011-01-08 20:31:18 +0000392<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 flat orthogonal edges of a binary shape Corners Find 90 degree corners of a binary shape LineEnds:type Find end points of lines (for pruning a skeletion) Two types of lines ends (default to both) can be searched for Type 0: All line ends Type 1: single kernel for 4-conneected line ends Type 2: single kernel for simple line ends LineJunctions Find three line junctions (within a skeletion) Type 0: all line junctions Type 1: Y Junction kernel Type 2: Diagonal T Junction kernel Type 3: Orthogonal T Junction kernel Type 4: Diagonal X Junction kernel Type 5: Orthogonal + Junction kernel Ridges:type Find single pixel ridges or thin lines Type 1: Fine single pixel thick lines and ridges Type 2: Find two pixel thick lines and ridges ConvexHull Octagonal thicken kernel, to generate convex hulls of 45 degrees Skeleton:type Traditional skeleton generating kernels. Type 1: Tradional Skeleton kernel (4 connected skeleton) Type 2: HIPR2 Skeleton kernel (8 connected skeleton) Type 3: Experimental Variation to try to present left-right symmetry Type 4: Experimental Variation to preserve left-right symmetry</p>
cristyd2baf7d2010-03-06 04:26:44 +0000393
cristy7a40ba82011-01-08 20:31:18 +0000394<p>Distance Measuring Kernels</p>
cristyd2baf7d2010-03-06 04:26:44 +0000395
cristy7a40ba82011-01-08 20:31:18 +0000396<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>
cristyd2baf7d2010-03-06 04:26:44 +0000397
cristy7a40ba82011-01-08 20:31:18 +0000398<p>See the 'Distance' Morphological Method, for information of how it is applied.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000399
cristy7a40ba82011-01-08 20:31:18 +0000400<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>
cristyd2baf7d2010-03-06 04:26:44 +0000401
cristy7a40ba82011-01-08 20:31:18 +0000402<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>
cristyf1310b52010-05-15 16:42:04 +0000403
cristy7a40ba82011-01-08 20:31:18 +0000404<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>
cristyd2baf7d2010-03-06 04:26:44 +0000405
cristy7a40ba82011-01-08 20:31:18 +0000406<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>
cristyd2baf7d2010-03-06 04:26:44 +0000407
cristy7a40ba82011-01-08 20:31:18 +0000408<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>
cristyd2baf7d2010-03-06 04:26:44 +0000409
cristyd2baf7d2010-03-06 04:26:44 +0000410 </div>
cristy70b59b62011-02-07 19:09:57 +0000411<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000412_8c.html" id="CloneKernelInfo">CloneKernelInfo</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000413<div class="doc-section">
414
cristy7a40ba82011-01-08 20:31:18 +0000415<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 longer needed.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000416
cristy0291e2d2010-04-04 17:50:18 +0000417<p>The format of the CloneKernelInfo method is:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000418
419<pre class="code">
420 KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
421</pre>
422
cristy7a40ba82011-01-08 20:31:18 +0000423<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000424
425<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000426<p>the Morphology/Convolution kernel to be cloned</p>
cristyd2baf7d2010-03-06 04:26:44 +0000427
428 </div>
cristy70b59b62011-02-07 19:09:57 +0000429<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000430_8c.html" id="DestroyKernelInfo">DestroyKernelInfo</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000431<div class="doc-section">
432
cristy7a40ba82011-01-08 20:31:18 +0000433<p>DestroyKernelInfo() frees the memory used by a Convolution/Morphology kernel.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000434
435<p>The format of the DestroyKernelInfo method is:</p>
436
437<pre class="code">
438 KernelInfo *DestroyKernelInfo(KernelInfo *kernel)
439</pre>
440
cristy7a40ba82011-01-08 20:31:18 +0000441<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000442
443<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000444<p>the Morphology/Convolution kernel to be destroyed</p>
cristyd2baf7d2010-03-06 04:26:44 +0000445
446 </div>
cristy70b59b62011-02-07 19:09:57 +0000447<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000448_8c.html" id="MorphologyApply">MorphologyApply</a></h2>
cristyc4960862010-05-23 22:24:24 +0000449<div class="doc-section">
450
cristy7a40ba82011-01-08 20:31:18 +0000451<p>MorphologyApply() applies a morphological method, multiple times using a list of multiple kernels.</p>
cristyc4960862010-05-23 22:24:24 +0000452
cristy7a40ba82011-01-08 20:31:18 +0000453<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>
cristyc4960862010-05-23 22:24:24 +0000454
cristy7a40ba82011-01-08 20:31:18 +0000455<p>It is MorphologyImageChannel() task to extract any such user controls, and pass them to this function for processing.</p>
cristyfe0019b2010-06-07 02:23:32 +0000456
cristy7a40ba82011-01-08 20:31:18 +0000457<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>
cristyc4960862010-05-23 22:24:24 +0000458
459<p>The format of the MorphologyApply method is:</p>
460
461<pre class="code">
462 Image *MorphologyApply(const Image *image,MorphologyMethod method,
cristybb503372010-05-27 20:51:26 +0000463 const ssize_t iterations,const KernelInfo *kernel,
cristyc4960862010-05-23 22:24:24 +0000464 const CompositeMethod compose, const double bias,
465 ExceptionInfo *exception)
466</pre>
467
cristy7a40ba82011-01-08 20:31:18 +0000468<p>A description of each parameter follows:</p>
cristyc4960862010-05-23 22:24:24 +0000469
470<h5>image</h5>
cristy7a40ba82011-01-08 20:31:18 +0000471<p>the source image</p>
cristyc4960862010-05-23 22:24:24 +0000472
473<h5>method</h5>
cristy7a40ba82011-01-08 20:31:18 +0000474<p>the morphology method to be applied.</p>
cristyc4960862010-05-23 22:24:24 +0000475
476<h5>iterations</h5>
cristy7a40ba82011-01-08 20:31:18 +0000477<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>
cristyc4960862010-05-23 22:24:24 +0000478
479<h5>channel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000480<p>the channel type.</p>
cristyc4960862010-05-23 22:24:24 +0000481
482<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000483<p>An array of double representing the morphology kernel.</p>
cristyc4960862010-05-23 22:24:24 +0000484
485<h5>compose</h5>
cristy7a40ba82011-01-08 20:31:18 +0000486<p>How to handle or merge multi-kernel results. If 'UndefinedCompositeOp' use default for the Morphology method. If 'NoCompositeOp' force image to be re-iterated by each kernel. Otherwise merge the results using the compose method given.</p>
cristyc4960862010-05-23 22:24:24 +0000487
488<h5>bias</h5>
cristy7a40ba82011-01-08 20:31:18 +0000489<p>Convolution Output Bias.</p>
cristyc4960862010-05-23 22:24:24 +0000490
491<h5>exception</h5>
cristy7a40ba82011-01-08 20:31:18 +0000492<p>return any errors or warnings in this structure.</p>
cristyc4960862010-05-23 22:24:24 +0000493
494 </div>
cristy70b59b62011-02-07 19:09:57 +0000495<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000496_8c.html" id="MorphologyImageChannel">MorphologyImageChannel</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000497<div class="doc-section">
498
cristy7a40ba82011-01-08 20:31:18 +0000499<p>MorphologyImageChannel() applies a user supplied kernel to the image according to the given mophology method.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000500
cristy7a40ba82011-01-08 20:31:18 +0000501<p>This function applies any and all user defined settings before calling the above internal function MorphologyApply().</p>
cristyc4960862010-05-23 22:24:24 +0000502
cristy7a40ba82011-01-08 20:31:18 +0000503<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>
cristyd2baf7d2010-03-06 04:26:44 +0000504
505<p>The format of the MorphologyImage method is:</p>
506
507<pre class="code">
508 Image *MorphologyImage(const Image *image,MorphologyMethod method,
cristybb503372010-05-27 20:51:26 +0000509 const ssize_t iterations,KernelInfo *kernel,ExceptionInfo *exception)
cristyd2baf7d2010-03-06 04:26:44 +0000510</pre>
511
cristy7a40ba82011-01-08 20:31:18 +0000512<p>Image *MorphologyImageChannel(const Image *image, const ChannelType channel,MorphologyMethod method,const ssize_t iterations, KernelInfo *kernel,ExceptionInfo *exception)</p>
cristyc4960862010-05-23 22:24:24 +0000513
cristy7a40ba82011-01-08 20:31:18 +0000514<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000515
516<h5>image</h5>
cristy7a40ba82011-01-08 20:31:18 +0000517<p>the image.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000518
519<h5>method</h5>
cristy7a40ba82011-01-08 20:31:18 +0000520<p>the morphology method to be applied.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000521
522<h5>iterations</h5>
cristy7a40ba82011-01-08 20:31:18 +0000523<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>
cristyd2baf7d2010-03-06 04:26:44 +0000524
525<h5>channel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000526<p>the channel type.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000527
528<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000529<p>An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000530
531<h5>exception</h5>
cristy7a40ba82011-01-08 20:31:18 +0000532<p>return any errors or warnings in this structure.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000533
cristyc4960862010-05-23 22:24:24 +0000534 </div>
cristy70b59b62011-02-07 19:09:57 +0000535<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000536_8c.html" id="ScaleGeometryKernelInfo">ScaleGeometryKernelInfo</a></h2>
cristyc4960862010-05-23 22:24:24 +0000537<div class="doc-section">
cristyd2baf7d2010-03-06 04:26:44 +0000538
cristy7a40ba82011-01-08 20:31:18 +0000539<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>
cristyc4960862010-05-23 22:24:24 +0000540
cristy7a40ba82011-01-08 20:31:18 +0000541<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>
cristyc4960862010-05-23 22:24:24 +0000542
cristy178edaf2011-01-23 03:42:39 +0000543<p>The format of the ScaleGeometryKernelInfo method is:</p>
cristyc4960862010-05-23 22:24:24 +0000544
545<pre class="code">
cristy178edaf2011-01-23 03:42:39 +0000546 void ScaleGeometryKernelInfo(KernelInfo *kernel,
547 const double scaling_factor,const MagickStatusType normalize_flags)
cristyc4960862010-05-23 22:24:24 +0000548</pre>
549
cristy7a40ba82011-01-08 20:31:18 +0000550<p>A description of each parameter follows:</p>
cristyc4960862010-05-23 22:24:24 +0000551
552<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000553<p>the Morphology/Convolution kernel to modify</p>
cristyc4960862010-05-23 22:24:24 +0000554
555<p>o geometry:</p>
556
557<pre class="text">
558 "-set option:convolve:scale {geometry}" setting.
559</pre>
cristyd2baf7d2010-03-06 04:26:44 +0000560
561 </div>
cristy70b59b62011-02-07 19:09:57 +0000562<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000563_8c.html" id="ScaleKernelInfo">ScaleKernelInfo</a></h2>
cristyd2baf7d2010-03-06 04:26:44 +0000564<div class="doc-section">
565
cristy7a40ba82011-01-08 20:31:18 +0000566<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>
cristyd2baf7d2010-03-06 04:26:44 +0000567
cristy7a40ba82011-01-08 20:31:18 +0000568<p>By default (no flags given) the values within the kernel is scaled directly using given scaling factor without change.</p>
cristyd2baf7d2010-03-06 04:26:44 +0000569
cristy7a40ba82011-01-08 20:31:18 +0000570<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>
cristyd2baf7d2010-03-06 04:26:44 +0000571
cristy7a40ba82011-01-08 20:31:18 +0000572<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>
cristyd2baf7d2010-03-06 04:26:44 +0000573
cristy7a40ba82011-01-08 20:31:18 +0000574<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>
cristyd2baf7d2010-03-06 04:26:44 +0000575
cristy7a40ba82011-01-08 20:31:18 +0000576<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>
cristyd2baf7d2010-03-06 04:26:44 +0000577
cristy7a40ba82011-01-08 20:31:18 +0000578<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>
cristyd2baf7d2010-03-06 04:26:44 +0000579
cristy7a40ba82011-01-08 20:31:18 +0000580<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>
cristyd2baf7d2010-03-06 04:26:44 +0000581
cristy7a40ba82011-01-08 20:31:18 +0000582<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>
cristyd2baf7d2010-03-06 04:26:44 +0000583
cristy7a40ba82011-01-08 20:31:18 +0000584<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>
cristyd2baf7d2010-03-06 04:26:44 +0000585
586<p>The format of the ScaleKernelInfo method is:</p>
587
588<pre class="code">
589 void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
590 const MagickStatusType normalize_flags )
591</pre>
592
cristy7a40ba82011-01-08 20:31:18 +0000593<p>A description of each parameter follows:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000594
595<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000596<p>the Morphology/Convolution kernel</p>
cristyd2baf7d2010-03-06 04:26:44 +0000597
598<p>o scaling_factor:</p>
599
600<pre class="text">
601 zero. If the kernel is normalized regardless of any flags.
602</pre>
603
604<p>o normalize_flags:</p>
605
606<pre class="text">
607 specifically: NormalizeValue, CorrelateNormalizeValue,
608 and/or PercentValue
609</pre>
610
cristyc4960862010-05-23 22:24:24 +0000611 </div>
cristy70b59b62011-02-07 19:09:57 +0000612<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000613_8c.html" id="ShowKernelInfo">ShowKernelInfo</a></h2>
cristyc4960862010-05-23 22:24:24 +0000614<div class="doc-section">
615
cristy7a40ba82011-01-08 20:31:18 +0000616<p>ShowKernelInfo() outputs the details of the given kernel defination to standard error, generally due to a users 'showkernel' option request.</p>
cristyc4960862010-05-23 22:24:24 +0000617
618<p>The format of the ShowKernel method is:</p>
619
620<pre class="code">
621 void ShowKernelInfo(KernelInfo *kernel)
622</pre>
623
cristy7a40ba82011-01-08 20:31:18 +0000624<p>A description of each parameter follows:</p>
cristyc4960862010-05-23 22:24:24 +0000625
626<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000627<p>the Morphology/Convolution kernel</p>
cristyc4960862010-05-23 22:24:24 +0000628
629 </div>
cristy70b59b62011-02-07 19:09:57 +0000630<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000631_8c.html" id="UnityAddKernelInfo">UnityAddKernelInfo</a></h2>
cristyc4960862010-05-23 22:24:24 +0000632<div class="doc-section">
633
cristy7a40ba82011-01-08 20:31:18 +0000634<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>
cristyc4960862010-05-23 22:24:24 +0000635
cristy7a40ba82011-01-08 20:31:18 +0000636<p>The resulting effect is to convert the defined kernels into blended soft-blurs, unsharp kernels or into sharpening kernels.</p>
cristyc4960862010-05-23 22:24:24 +0000637
638<p>The format of the UnityAdditionKernelInfo method is:</p>
639
640<pre class="code">
641 void UnityAdditionKernelInfo(KernelInfo *kernel, const double scale )
642</pre>
643
cristy7a40ba82011-01-08 20:31:18 +0000644<p>A description of each parameter follows:</p>
cristyc4960862010-05-23 22:24:24 +0000645
646<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000647<p>the Morphology/Convolution kernel</p>
cristyc4960862010-05-23 22:24:24 +0000648
649<p>o scale:</p>
650
651<pre class="text">
652 the given kernel.
653</pre>
654
655 </div>
cristy70b59b62011-02-07 19:09:57 +0000656<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristy7a40ba82011-01-08 20:31:18 +0000657_8c.html" id="ZeroKernelNans">ZeroKernelNans</a></h2>
cristyc4960862010-05-23 22:24:24 +0000658<div class="doc-section">
659
cristy7a40ba82011-01-08 20:31:18 +0000660<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>
cristyc4960862010-05-23 22:24:24 +0000661
662<p>The format of the ZeroKernelNans method is:</p>
663
664<pre class="code">
665 void ZeroKernelNans (KernelInfo *kernel)
666</pre>
667
cristy7a40ba82011-01-08 20:31:18 +0000668<p>A description of each parameter follows:</p>
cristyc4960862010-05-23 22:24:24 +0000669
670<h5>kernel</h5>
cristy7a40ba82011-01-08 20:31:18 +0000671<p>the Morphology/Convolution kernel</p>
cristyc4960862010-05-23 22:24:24 +0000672
cristyd2baf7d2010-03-06 04:26:44 +0000673 </div>
cristy3eaa0ef2010-03-06 20:35:26 +0000674
675</div>
676
677<div id="linkbar">
cristyce69bb02010-07-27 19:49:46 +0000678 <span id="linkbar-west">&nbsp;</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000679 <span id="linkbar-center">
680 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristya8902942010-07-30 00:49:52 +0000681 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000682 </span>
683 <span id="linkbar-east">&nbsp;</span>
684 </div>
685 <div class="footer">
cristy4103d562010-12-10 01:38:54 +0000686 <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000687 <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
688 </div>
689 <div style="clear: both; margin: 0; width: 100%; "></div>
cristya8902942010-07-30 00:49:52 +0000690 <script type="text/javascript">
691 var _gaq = _gaq || [];
692 _gaq.push(['_setAccount', 'UA-17690367-1']);
693 _gaq.push(['_trackPageview']);
694
695 (function() {
696 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
697 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
698 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
699 })();
700 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000701</body>
702</html>