blob: 1ea31f6b164848ece79012a496ee101619a1854d [file] [log] [blame]
cristy3eaa0ef2010-03-06 20:35:26 +00001<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
cristy2c839602010-04-03 02:32:08 +00003<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
cristy3eaa0ef2010-03-06 20:35:26 +00004<head>
cristy3de29cc2010-04-15 02:34:44 +00005 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
cristy3eaa0ef2010-03-06 20:35:26 +00006 <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U=" />
7 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf" />
cristy3de29cc2010-04-15 02:34:44 +00008 <style type="text/css" media="all">
cristy3eaa0ef2010-03-06 20:35:26 +00009 @import url("../../www/magick.css");
cristy3de29cc2010-04-15 02:34:44 +000010 </style>
cristyd2baf7d2010-03-06 04:26:44 +000011 <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"/>
cristy3eaa0ef2010-03-06 20:35:26 +000027</head>
28
29<body id="www-imagemagick-org">
30<div class="titlebar">
31<a href="../../index.html">
32 <img src="../../images/script.png" alt="[ImageMagick]"
33 style="width: 350px; height: 60px; margin: 28px auto; float: left;" /></a>
34<a href="http://www.networkredux.com">
35 <img src="../../images/networkredux.png" alt="[sponsor]"
36 style="margin: 45px auto; border: 0px; float: left;" /></a>
37<a href="http://www.imagemagick.org/discourse-server/">
38 <img src="../../images/logo.jpg" alt=""
39 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
40<a href="../../index.html">
41 <img src="../../images/sprite.jpg" alt=""
42 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
43</div>
44
45<div class="eastbar">
46
cristyd2baf7d2010-03-06 04:26:44 +000047<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000048 <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
cristyd2baf7d2010-03-06 04:26:44 +000049</div>
cristy3eaa0ef2010-03-06 20:35:26 +000050<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +000051<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000052 <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
cristyd2baf7d2010-03-06 04:26:44 +000053</div>
54<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000055 <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
cristyd2baf7d2010-03-06 04:26:44 +000056</div>
57<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000058 <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
cristyd2baf7d2010-03-06 04:26:44 +000059</div>
60<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000061 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
cristyd2baf7d2010-03-06 04:26:44 +000062</div>
63<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000064 <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
cristyd2baf7d2010-03-06 04:26:44 +000065</div>
66<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000067 <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
cristyd2baf7d2010-03-06 04:26:44 +000068</div>
69<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000070 <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
cristyd2baf7d2010-03-06 04:26:44 +000071</div>
72<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000073 <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
cristyd2baf7d2010-03-06 04:26:44 +000074</div>
75<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000076 <a title="Program Interface: Magick++" href="../../Magick++/">Magick++</a>
cristyd2baf7d2010-03-06 04:26:44 +000077</div>
78<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000079 <a title="Architecture" href="../../www/architecture.html">Architecture</a>
cristyd2baf7d2010-03-06 04:26:44 +000080</div>
cristy3eaa0ef2010-03-06 20:35:26 +000081<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +000082<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000083 <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
cristyd2baf7d2010-03-06 04:26:44 +000084</div>
85<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000086 <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
cristyd2baf7d2010-03-06 04:26:44 +000087</div>
88<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000089 <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
cristyd2baf7d2010-03-06 04:26:44 +000090 </div>
91<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000092 <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
cristyd2baf7d2010-03-06 04:26:44 +000093</div>
94<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000095 <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
cristyd2baf7d2010-03-06 04:26:44 +000096</div>
97<div class="sub">
cristy83a272e2010-05-07 20:40:35 +000098 <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
cristyd2baf7d2010-03-06 04:26:44 +000099</div>
100<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000101 <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
cristyd2baf7d2010-03-06 04:26:44 +0000102</div>
103<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000104 <a title="Resources" href="../../www/resources.html">Resources</a>
cristyd2baf7d2010-03-06 04:26:44 +0000105</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000106<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000107<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000108 <a title="Download" href="../../www/download.html">Download</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="Search" href="../http://www.imagemagick.org/script/search.php">Search</a>
cristyd2baf7d2010-03-06 04:26:44 +0000113</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000114<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000115<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000116 <a title="Site Map"href="../../www/sitemap.html">Site Map</a>
cristyd2baf7d2010-03-06 04:26:44 +0000117</div>
118<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000119 <a title="Site Map: Links"href="../../www/links.html">Links</a>
cristyd2baf7d2010-03-06 04:26:44 +0000120</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000121<div class="sep"></div>
cristyd2baf7d2010-03-06 04:26:44 +0000122<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000123 <a title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>
cristyd2baf7d2010-03-06 04:26:44 +0000124
125<div class="sponsbox">
126<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000127 <a title="Sponsor: Webdesign Agentur" href="http://www.ventzke-partner.de">Webdesign Agentur</a><!-- 201101010480 invendio.de-->
cristyb36feb22010-03-26 16:54:37 +0000128</div>
129<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000130 <a title="Sponsor: LVM Versicherung" href="http://www.neu-reich.de">LVM Versicherung</a><!-- 201101010480 -->
cristyd2baf7d2010-03-06 04:26:44 +0000131</div>
132<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000133 <a title="Sponsor: Deko.net" href="http://www.deko.net">Deko.net</a><!-- 201101010600 Peterssen-->
cristyd2baf7d2010-03-06 04:26:44 +0000134</div>
135<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000136 <a title="Sponsor: Kredit" href="http://www.online-kredit-index.de">Kredit</a><!-- 201007010120 Buchhorn -->
cristyd2baf7d2010-03-06 04:26:44 +0000137</div>
138<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000139 <a title="Sponsor: Druckerei" href="http://www.print24.de/">Druckerei</a><!-- 201009010720 -->
cristyd2baf7d2010-03-06 04:26:44 +0000140</div>
141<div class="sponsor">
cristy83a272e2010-05-07 20:40:35 +0000142 <a title="Sponsor: Druckerei Online" href="http://www.allesdruck.de">Druckerei Online</a><!-- 201012011200 allesdruck.de-->
cristyd2baf7d2010-03-06 04:26:44 +0000143</div>
cristyd2baf7d2010-03-06 04:26:44 +0000144</div>
145</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000146
147
148</div>
149
150<div class="main">
151
cristyc4960862010-05-23 22:24:24 +0000152<p class="navigation-index">[<a href="#same variable That is the IsNaN">same variable That is the 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="#ExpandKernelInfo">ExpandKernelInfo</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 +0000153
154<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
155_8c.html" target="source" name="same variable That is the IsNaN">same variable That is the IsNaN</a></h2>
156<div class="doc-section">
157
158<p>same variable That is the IsNaN() macro is only true if the value is NaN. </p>
159 </div>
160<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
161_8c.html" target="source" name="AcquireKernelInfo">AcquireKernelInfo</a></h2>
162<div class="doc-section">
163
164<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>
165
166<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>
167
168<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></ol>
169
170<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>
171
cristyf0d1f5d2010-05-13 16:29:38 +0000172<p>The returned kernel should be freed using the DestroyKernelInfo() when you are finished with it. Do not free this memory yourself.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000173
174<p>Input kernel defintion strings can consist of any of three types.</p></ol>
175
176<p>"name:args" Select from one of the built in kernels, using the name and geometry arguments supplied. See AcquireKernelBuiltIn()</p></ol>
177
cristyc4960862010-05-23 22:24:24 +0000178<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>
179
180<p>If a '^' is included the kernel expanded with 90-degree rotations, While a '@' will allow you to expand a 3x3 kernel using 45-degree circular rotates.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000181
182<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>
183
cristyf0d1f5d2010-05-13 16:29:38 +0000184<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>
185
186<p>" kernel ; kernel ; kernel ; "</p></ol>
187
cristyc4960862010-05-23 22:24:24 +0000188<p>Any extra ';' characters (at start, end or between kernel defintions are simply ignored.</p></ol>
189
190<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000191
cristyd2baf7d2010-03-06 04:26:44 +0000192<p>The format of the AcquireKernal method is:</p>
193
194<pre class="code">
195 KernelInfo *AcquireKernelInfo(const char *kernel_string)
196</pre>
197
198<p>A description of each parameter follows:</p></ol>
199
200<h5>kernel_string</h5>
201<ol><p>the Morphology/Convolution kernel wanted.</p></ol>
202
203 </div>
204<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
205_8c.html" target="source" name="AcquireKernelBuiltIn">AcquireKernelBuiltIn</a></h2>
206<div class="doc-section">
207
208<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>
209
210<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>
211
212<p>The format of the AcquireKernalBuiltIn method is:</p>
213
214<pre class="code">
215 KernelInfo *AcquireKernelBuiltIn(const KernelInfoType type,
216 const GeometryInfo args)
217</pre>
218
219<p>A description of each parameter follows:</p></ol>
220
221<h5>type</h5>
222<ol><p>the pre-defined type of kernel wanted</p></ol>
223
224<h5>args</h5>
225<ol><p>arguments defining or modifying the kernel</p></ol>
226
227<p>Convolution Kernels</p></ol>
228
cristyc4960862010-05-23 22:24:24 +0000229<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>
230
cristyf1310b52010-05-15 16:42:04 +0000231<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>
232
233<p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000234
235<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>
236
cristyf1310b52010-05-15 16:42:04 +0000237<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>
cristyd2baf7d2010-03-06 04:26:44 +0000238
cristyc4960862010-05-23 22:24:24 +0000239<p>LOG:{radius},{sigma} "Laplacian of a Gaussian" or "Mexician Hat" Kernel. The supposed ideal edge detection, zero-summing kernel.</p></ol>
240
241<p>An alturnative to this kernel is to use a "DOG" with a sigma ratio of approx 1.6, which can also be applied as a 2 pass "DOB" (see below).</p></ol>
242
cristyf1310b52010-05-15 16:42:04 +0000243<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>
244
245<p>If 'sigma' is zero, you get a single pixel on a field of zeros.</p></ol>
246
247<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>
248
249<p>DOB:{radius},{sigma1},{sigma2}[,{angle}] "Difference of Blurs" Kernel. As "Blur" but with the 1D gaussian produced by 'sigma2' subtracted from thethe 1D gaussian produced by 'sigma1'. The result is a zero-summing kernel.</p></ol>
250
251<p>This can be used to generate a faster "DOG" convolution, in the same way "Blur" can.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000252
cristyf0d1f5d2010-05-13 16:29:38 +0000253<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>
cristyd2baf7d2010-03-06 04:26:44 +0000254
cristyf0d1f5d2010-05-13 16:29:38 +0000255<p>Note that the first argument is the width of the kernel and not the radius of the kernel.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000256
cristyf1310b52010-05-15 16:42:04 +0000257<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000258
259<p>Named Constant Convolution Kernels</p></ol>
260
cristyf1310b52010-05-15 16:42:04 +0000261<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>
cristyf0d1f5d2010-05-13 16:29:38 +0000262
cristyf1310b52010-05-15 16:42:04 +0000263<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>
264
cristyc4960862010-05-23 22:24:24 +0000265<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>
cristyf1310b52010-05-15 16:42:04 +0000266
cristyc4960862010-05-23 22:24:24 +0000267<p>Sobel:{angle} Sobel 'Edge' convolution kernel (3x3) -1, 0, 1 -2, 0,-2 -1, 0, 1</p></ol>
268
269<p>Roberts:{angle} Roberts convolution kernel (3x3) 0, 0, 0 -1, 1, 0 0, 0, 0 Prewitt:{angle} Prewitt Edge convolution kernel (3x3) -1, 0, 1 -1, 0, 1 -1, 0, 1 Compass:{angle} Prewitt's "Compass" convolution kernel (3x3) -1, 1, 1 -1,-2, 1 -1, 1, 1 Kirsch:{angle} Kirsch's "Compass" convolution kernel (3x3) -3,-3, 5 -3, 0, 5 -3,-3, 5</p></ol>
270
271<p>FreiChen:{type},{angle} Frei-Chen Edge Detector is a set of 9 unique convolution kernels that are specially weighted. They should not be normalized. After applying each to the original image, the results is then added together. The square root of the resulting image is the cosine of the edge, and the direction of the feature detection.</p></ol>
272
273<p>Type 1: | 1, sqrt(2), 1 | | 0, 0, 0 | / 2*sqrt(2) | -1, -sqrt(2), -1 |</p></ol>
274
275<p>Type 2: | 1, 0, 1 | | sqrt(2), 0, sqrt(2) | / 2*sqrt(2) | 1, 0, 1 |</p></ol>
276
277<p>Type 3: | 0, -1, sqrt(2) | | 1, 0, -1 | / 2*sqrt(2) | -sqrt(2), 1, 0 |</p></ol>
278
279<p>Type 4: | sqrt(2), -1, 0 | | -1, 0, 1 | / 2*sqrt(2) | 0, 1, -sqrt(2) |</p></ol>
280
281<p>Type 5: | 0, 1, 0 | | -1, 0, -1 | / 2 | 0, 1, 0 |</p></ol>
282
283<p>Type 6: | -1, 0, 1 | | 0, 0, 0 | / 2 | 1, 0, -1 |</p></ol>
284
285<p>Type 7: | 1, -2, 1 | | -2, 4, -2 | / 6 | 1, -2, 1 |</p></ol>
286
287<p>Type 8: | -2, 1, -2 | | 1, 4, 1 | / 6 | -2, 1, -2 |</p></ol>
288
289<p>Type 9: | 1, 1, 1 | | 1, 1, 1 | / 3 | 1, 1, 1 |</p></ol>
290
291<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>
292
cristyd2baf7d2010-03-06 04:26:44 +0000293
294<p>Boolean Kernels</p></ol>
295
cristyf0d1f5d2010-05-13 16:29:38 +0000296<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>
cristyd2baf7d2010-03-06 04:26:44 +0000297
cristyf0d1f5d2010-05-13 16:29:38 +0000298<p>Square:[{radius}[,{scale}]] Generate a square shaped kernel of size radius*2+1, and defaulting to a 3x3 (radius 1).</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000299
cristyf1310b52010-05-15 16:42:04 +0000300<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>
cristyd2baf7d2010-03-06 04:26:44 +0000301
cristyf1310b52010-05-15 16:42:04 +0000302<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>
303
304<p>Properly centered and odd sized rectangles work the best.</p></ol>
305
306<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>
cristyd2baf7d2010-03-06 04:26:44 +0000307
308<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>
309
cristyf1310b52010-05-15 16:42:04 +0000310<p>Symbol Dilation Kernels</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000311
cristyf1310b52010-05-15 16:42:04 +0000312<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>
cristy6f6c2962010-05-14 01:39:00 +0000313
314<p>For the same reasons iterating these kernels does not produce the same result as using a larger radius for the symbol.</p></ol>
315
cristyf1310b52010-05-15 16:42:04 +0000316<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>
317
318<p>NOTE: "plus:1" is equivelent to a "Diamond" kernel.</p></ol>
319
320<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>
321
cristy6f6c2962010-05-14 01:39:00 +0000322<p>Hit and Miss Kernels</p></ol>
323
cristy9aed3a22010-05-26 23:41:22 +0000324<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 Find single pixel ridges or thin lines Ridges2 Find 2 pixel thick ridges or 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 Thinning kernel, which leaves behind a skeletion of a shape</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000325
326<p>Distance Measuring Kernels</p></ol>
327
cristyd2baf7d2010-03-06 04:26:44 +0000328<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>
329
cristyf1310b52010-05-15 16:42:04 +0000330<p>See the 'Distance' Morphological Method, for information of how it is applied.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000331
cristyf1310b52010-05-15 16:42:04 +0000332<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>
cristyd2baf7d2010-03-06 04:26:44 +0000333
cristyf1310b52010-05-15 16:42:04 +0000334<p>Manhatten:[{radius}][x{scale}[!]] Manhatten 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>
335
336<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>
cristyd2baf7d2010-03-06 04:26:44 +0000337
338<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>
339
340<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 "Manhatten" 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>
341
cristyd2baf7d2010-03-06 04:26:44 +0000342 </div>
343<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
344_8c.html" target="source" name="CloneKernelInfo">CloneKernelInfo</a></h2>
345<div class="doc-section">
346
cristyf0d1f5d2010-05-13 16:29:38 +0000347<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></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000348
cristy0291e2d2010-04-04 17:50:18 +0000349<p>The format of the CloneKernelInfo method is:</p>
cristyd2baf7d2010-03-06 04:26:44 +0000350
351<pre class="code">
352 KernelInfo *CloneKernelInfo(const KernelInfo *kernel)
353</pre>
354
355<p>A description of each parameter follows:</p></ol>
356
357<h5>kernel</h5>
358<ol><p>the Morphology/Convolution kernel to be cloned</p></ol>
359
360 </div>
361<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
362_8c.html" target="source" name="DestroyKernelInfo">DestroyKernelInfo</a></h2>
363<div class="doc-section">
364
365<p>DestroyKernelInfo() frees the memory used by a Convolution/Morphology kernel.</p></ol>
366
367<p>The format of the DestroyKernelInfo method is:</p>
368
369<pre class="code">
370 KernelInfo *DestroyKernelInfo(KernelInfo *kernel)
371</pre>
372
373<p>A description of each parameter follows:</p></ol>
374
375<h5>kernel</h5>
376<ol><p>the Morphology/Convolution kernel to be destroyed</p></ol>
377
378 </div>
379<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristyf0d1f5d2010-05-13 16:29:38 +0000380_8c.html" target="source" name="ExpandKernelInfo">ExpandKernelInfo</a></h2>
381<div class="doc-section">
382
383<p>ExpandKernelInfo() takes a single kernel, and expands it into a list of kernels each incrementally rotated the angle given.</p></ol>
384
385<p>WARNING: 45 degree rotations only works for 3x3 kernels. While 90 degree roatations only works for linear and square kernels</p></ol>
386
387<p>The format of the RotateKernelInfo method is:</p>
388
389<pre class="code">
390 void ExpandKernelInfo(KernelInfo *kernel, double angle)
391</pre>
392
393<p>A description of each parameter follows:</p></ol>
394
395<h5>kernel</h5>
396<ol><p>the Morphology/Convolution kernel</p></ol>
397
398<h5>angle</h5>
399<ol><p>angle to rotate in degrees</p></ol>
400
401<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>
402 </div>
403<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristyc4960862010-05-23 22:24:24 +0000404_8c.html" target="source" name="MorphologyApply">MorphologyApply</a></h2>
405<div class="doc-section">
406
407<p>MorphologyApply() applies a morphological method, multiple times using a list of multiple kernels.</p></ol>
408
409<p>It is basically equivelent to as MorphologyImageChannel() (see below) but without user controls, that that function extracts and applies to kernels and morphology methods.</p></ol>
410
411<p>More specifically kernels are not normalized/scaled/blended by the 'convolve:scale' Image Artifact (-set setting), and the convolve bias (-bias setting or image->bias) is passed directly to this function, and not extracted from an image.</p></ol>
412
413<p>The format of the MorphologyApply method is:</p>
414
415<pre class="code">
416 Image *MorphologyApply(const Image *image,MorphologyMethod method,
417 const long iterations,const KernelInfo *kernel,
418 const CompositeMethod compose, const double bias,
419 ExceptionInfo *exception)
420</pre>
421
422<p>A description of each parameter follows:</p></ol>
423
424<h5>image</h5>
425<ol><p>the image.</p></ol>
426
427<h5>method</h5>
428<ol><p>the morphology method to be applied.</p></ol>
429
430<h5>iterations</h5>
431<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>
432
433<h5>channel</h5>
434<ol><p>the channel type.</p></ol>
435
436<h5>kernel</h5>
437<ol><p>An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.</p></ol>
438
439<h5>compose</h5>
440<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>
441
442<h5>bias</h5>
443<ol><p>Convolution Output Bias.</p></ol>
444
445<h5>exception</h5>
446<ol><p>return any errors or warnings in this structure.</p></ol>
447
448 </div>
449<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
cristyd2baf7d2010-03-06 04:26:44 +0000450_8c.html" target="source" name="MorphologyImageChannel">MorphologyImageChannel</a></h2>
451<div class="doc-section">
452
453<p>MorphologyImageChannel() applies a user supplied kernel to the image according to the given mophology method.</p></ol>
454
cristyc4960862010-05-23 22:24:24 +0000455<p>This function applies any and all user defined settings before calling the above internal function MorphologyApply().</p></ol>
456
457<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>
cristyd2baf7d2010-03-06 04:26:44 +0000458
459<p>The format of the MorphologyImage method is:</p>
460
461<pre class="code">
462 Image *MorphologyImage(const Image *image,MorphologyMethod method,
463 const long iterations,KernelInfo *kernel,ExceptionInfo *exception)
cristyd2baf7d2010-03-06 04:26:44 +0000464</pre>
465
cristyc4960862010-05-23 22:24:24 +0000466<p>Image *MorphologyImageChannel(const Image *image, const ChannelType channel,MorphologyMethod method,const long iterations, KernelInfo *kernel,ExceptionInfo *exception)</p></ol>
467
cristyd2baf7d2010-03-06 04:26:44 +0000468<p>A description of each parameter follows:</p></ol>
469
470<h5>image</h5>
471<ol><p>the image.</p></ol>
472
473<h5>method</h5>
474<ol><p>the morphology method to be applied.</p></ol>
475
476<h5>iterations</h5>
477<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>
478
479<h5>channel</h5>
480<ol><p>the channel type.</p></ol>
481
482<h5>kernel</h5>
483<ol><p>An array of double representing the morphology kernel. Warning: kernel may be normalized for the Convolve method.</p></ol>
484
485<h5>exception</h5>
486<ol><p>return any errors or warnings in this structure.</p></ol>
487
cristyc4960862010-05-23 22:24:24 +0000488 </div>
489<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
490_8c.html" target="source" name="ScaleGeometryKernelInfo">ScaleGeometryKernelInfo</a></h2>
491<div class="doc-section">
cristyd2baf7d2010-03-06 04:26:44 +0000492
cristyc4960862010-05-23 22:24:24 +0000493<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>
494
495<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>
496
497<p>The format of the ScaleKernelInfo method is:</p>
498
499<pre class="code">
500 void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
501 const MagickStatusType normalize_flags )
502</pre>
503
504<p>A description of each parameter follows:</p></ol>
505
506<h5>kernel</h5>
507<ol><p>the Morphology/Convolution kernel to modify</p></ol>
508
509<p>o geometry:</p>
510
511<pre class="text">
512 "-set option:convolve:scale {geometry}" setting.
513</pre>
cristyd2baf7d2010-03-06 04:26:44 +0000514
515 </div>
516<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
517_8c.html" target="source" name="ScaleKernelInfo">ScaleKernelInfo</a></h2>
518<div class="doc-section">
519
cristyf0d1f5d2010-05-13 16:29:38 +0000520<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>
cristyd2baf7d2010-03-06 04:26:44 +0000521
cristyf0d1f5d2010-05-13 16:29:38 +0000522<p>By default (no flags given) the values within the kernel is scaled directly using given scaling factor without change.</p></ol>
cristyd2baf7d2010-03-06 04:26:44 +0000523
cristyc4960862010-05-23 22:24:24 +0000524<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>
cristyd2baf7d2010-03-06 04:26:44 +0000525
cristyf0d1f5d2010-05-13 16:29:38 +0000526<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>
cristyd2baf7d2010-03-06 04:26:44 +0000527
cristyf0d1f5d2010-05-13 16:29:38 +0000528<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>
cristyd2baf7d2010-03-06 04:26:44 +0000529
530<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>
531
532<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>
533
534<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>
535
cristyf0d1f5d2010-05-13 16:29:38 +0000536<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>
cristyd2baf7d2010-03-06 04:26:44 +0000537
cristyc4960862010-05-23 22:24:24 +0000538<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>
cristyd2baf7d2010-03-06 04:26:44 +0000539
540<p>The format of the ScaleKernelInfo method is:</p>
541
542<pre class="code">
543 void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor,
544 const MagickStatusType normalize_flags )
545</pre>
546
547<p>A description of each parameter follows:</p></ol>
548
549<h5>kernel</h5>
550<ol><p>the Morphology/Convolution kernel</p></ol>
551
552<p>o scaling_factor:</p>
553
554<pre class="text">
555 zero. If the kernel is normalized regardless of any flags.
556</pre>
557
558<p>o normalize_flags:</p>
559
560<pre class="text">
561 specifically: NormalizeValue, CorrelateNormalizeValue,
562 and/or PercentValue
563</pre>
564
cristyc4960862010-05-23 22:24:24 +0000565 </div>
566<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
567_8c.html" target="source" name="ShowKernelInfo">ShowKernelInfo</a></h2>
568<div class="doc-section">
569
570<p>ShowKernelInfo() outputs the details of the given kernel defination to standard error, generally due to a users 'showkernel' option request.</p></ol>
571
572<p>The format of the ShowKernel method is:</p>
573
574<pre class="code">
575 void ShowKernelInfo(KernelInfo *kernel)
576</pre>
577
578<p>A description of each parameter follows:</p></ol>
579
580<h5>kernel</h5>
581<ol><p>the Morphology/Convolution kernel</p></ol>
582
583 </div>
584<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
585_8c.html" target="source" name="UnityAddKernelInfo">UnityAddKernelInfo</a></h2>
586<div class="doc-section">
587
588<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>
589
590<p>The resulting effect is to either convert a 'zero-summing' edge detection kernel (such as a "Laplacian", "DOG" or a "LOG") into a 'sharpening' kernel.</p></ol>
591
592<p>Alternativally by using a purely positive kernel, and using a negative post-normalizing scaling factor, you can convert a 'blurring' kernel (such as a "Gaussian") into a 'unsharp' kernel.</p></ol>
593
594<p>The format of the UnityAdditionKernelInfo method is:</p>
595
596<pre class="code">
597 void UnityAdditionKernelInfo(KernelInfo *kernel, const double scale )
598</pre>
599
600<p>A description of each parameter follows:</p></ol>
601
602<h5>kernel</h5>
603<ol><p>the Morphology/Convolution kernel</p></ol>
604
605<p>o scale:</p>
606
607<pre class="text">
608 the given kernel.
609</pre>
610
611 </div>
612<h2><a href="http://www.imagemagick.org/api/MagickCore/morphology
613_8c.html" target="source" name="ZeroKernelNans">ZeroKernelNans</a></h2>
614<div class="doc-section">
615
616<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>
617
618<p>The format of the ZeroKernelNans method is:</p>
619
620<pre class="code">
621 void ZeroKernelNans (KernelInfo *kernel)
622</pre>
623
624<p>A description of each parameter follows:</p></ol>
625
626<h5>kernel</h5>
627<ol><p>the Morphology/Convolution kernel</p></ol>
628
cristyd2baf7d2010-03-06 04:26:44 +0000629 </div>
cristy3eaa0ef2010-03-06 20:35:26 +0000630
631</div>
632
633<div id="linkbar">
634 <!-- <span id="linkbar-west">&nbsp;</span> -->
635 <span id="linkbar-center">
636 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristyf1310b52010-05-15 16:42:04 +0000637 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000638 </span>
639 <span id="linkbar-east">&nbsp;</span>
640 </div>
641 <div class="footer">
642 <span id="footer-west">&copy; 1999-2010 ImageMagick Studio LLC</span>
643 <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
644 </div>
645 <div style="clear: both; margin: 0; width: 100%; "></div>
646</body>
647</html>