<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
  <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U=" />
  <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf" />
  <style type="text/css" media="all">
    @import url("../../www/magick.css");
  </style>
  <link rel="shortcut icon" href="../../images/wand.ico"  type="images/vnd.microsoft.icon"/>
  <title>ImageMagick: MagickCore, C API for ImageMagick: Enhance an Image</title>
  <meta http-equiv="Content-Language" content="en-US"/>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
  <meta name="Generator" content="PHP"/>
  <meta name="Keywords" content="magickcore, c, api, for, imagemagick:, enhance, an, image, ImageMagick, ImageMagic, MagickCore, MagickWand, PerlMagick, Magick++, RMagick, PythonMagick, JMagick, TclMagick, Image, Magick, Magic, Wand, ImageMagickObject, Swiss, Army, Knife, Image, Processing"/>
  <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."/>
  <meta name="Rating" content="GENERAL"/>
  <meta name="Robots" content="INDEX, FOLLOW"/>
  <meta name="Generator" content="ImageMagick Studio LLC"/>
  <meta name="Author" content="ImageMagick Studio LLC"/>
  <meta name="Revisit-after" content="2 DAYS"/>
  <meta name="Resource-type" content="document"/>
  <meta name="Copyright" content="Copyright (c) 1999-2010 ImageMagick Studio LLC"/>
  <meta name="Distribution" content="Global"/>
</head>

<body id="www-imagemagick-org">
<div class="titlebar">
<a href="../../index.html">
  <img src="../../images/script.png" alt="[ImageMagick]"
  style="width: 350px; height: 60px; margin: 28px auto; float: left;" /></a>
<a href="http://www.networkredux.com">
  <img src="../../images/networkredux.png" alt="[sponsor]"
  style="margin: 45px auto; border: 0px; float: left;" /></a>
<a href="http://www.imagemagick.org/discourse-server/">
  <img src="../../images/logo.jpg" alt=""
  style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
<a href="../../index.html">
  <img src="../../images/sprite.jpg" alt=""
  style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
</div>

<div class="westbar">

<div class="menu">
  <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
</div>
<div class="sub">
    <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
</div>
<div class="sub">
    <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
</div>
<div class="sub">
    <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
</div>
<div class="menu">
  <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
</div>
<div class="sub">
    <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
</div>
<div class="sub">
    <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
</div>
<div class="sub">
    <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
</div>
<div class="sub">
    <a title="Program Interface: Magick++" href="../../Magick++/">Magick++</a>
</div>
<div class="sep"></div>
<div  class="menu">
   <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
</div>
<div class="sub">
    <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
</div>
<div class="sub">
    <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
 </div>
<div class="menu">
  <a title="Resources" href="../../www/resources.html">Resources</a>
</div>
<div class="menu">
  <a title="Architecture" href="../../www/architecture.html">Architecture</a>
</div>
<div class="menu">
  <a title="Download" href="../../www/download.html">Download</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Search" href="../http://www.imagemagick.org/script/search.php">Search</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Site Map"href="../../www/sitemap.html">Site Map</a>
</div>
<div  class="sub">
    <a title="Site Map: Links"href="../../www/links.html">Links</a>
</div>
<div class="sep"></div>
<div  class="menu">
  <a title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>

<div class="sponsbox">
<div  class="sponsor">
  <a title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
</div>
<div  class="sponsor">
  <a title="Sponsor: Webdesign Agentur" href="http://www.ventzke-partner.de">Webdesign Agentur</a><!-- 201101010480 invendio.de-->
</div>
<div  class="sponsor">
  <a title="Sponsor: LVM Versicherung" href="http://www.neu-reich.de">LVM Versicherung</a><!-- 201101010480 -->
</div>
<div  class="sponsor">
  <a title="Sponsor: Deko.net" href="http://www.deko.net">Deko.net</a><!-- 201101010600 Peterssen-->
</div>
<div  class="sponsor">
  <a title="Sponsor: Druckerei" href="http://www.print24.de/">Druckerei</a><!-- 201009010720 -->
</div>
<div  class="sponsor">
   <a title="Sponsor: Druckerei Online" href="http://www.allesdruck.de">Druckerei Online</a><!-- 201012011200 allesdruck.de-->
</div>
<div  class="sponsor">
   <a title="Sponsor: Webdesign" href="http://www.renehornig.com/">Webdesign</a><!-- 20111001000240 -->
</div>
</div>
</div>
</div>

<div class="eastbar">
  <script type="text/javascript">
  <!--
    google_ad_client = "pub-3129977114552745";
    google_ad_slot = "0574824969";
    google_ad_width = 160;
    google_ad_height = 600;
  //-->
  </script>
  <script type="text/javascript"
    src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
  </script>
</div>

<div class="main">

<p class="navigation-index">[<a href="#AutoGammaImage">AutoGammaImage</a> &bull; <a href="#AutoLevelImage">AutoLevelImage</a> &bull; <a href="#Use BrightnessContrastImage">Use BrightnessContrastImage</a> &bull; <a href="#ColorDecisionListImage">ColorDecisionListImage</a> &bull; <a href="#ClutImage">ClutImage</a> &bull; <a href="#ContrastImage">ContrastImage</a> &bull; <a href="#The ContrastStretchImage">The ContrastStretchImage</a> &bull; <a href="#EnhanceImage">EnhanceImage</a> &bull; <a href="#EqualizeImage">EqualizeImage</a> &bull; <a href="#GammaImage">GammaImage</a> &bull; <a href="#HaldClutImage">HaldClutImage</a> &bull; <a href="#LevelImage">LevelImage</a> &bull; <a href="#LevelizeImage">LevelizeImage</a> &bull; <a href="#LevelizeImageChannel">LevelizeImageChannel</a> &bull; <a href="#LevelImageColor">LevelImageColor</a> &bull; <a href="#The LinearStretchImage">The LinearStretchImage</a> &bull; <a href="#ModulateImage">ModulateImage</a> &bull; <a href="#NegateImage">NegateImage</a> &bull; <a href="#The NormalizeImage">The NormalizeImage</a> &bull; <a href="#SigmoidalContrastImage">SigmoidalContrastImage</a>]</p>

<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="AutoGammaImage">AutoGammaImage</a></h2>
<div class="doc-section">

<p>AutoGammaImage() extract the 'mean' from the image and adjust the image to try make set its gamma appropriatally.</p></ol>

<p>The format of the AutoGammaImage method is:</p>

<pre class="code">
  MagickBooleanType AutoGammaImage(Image *image)
  MagickBooleanType AutoGammaImageChannel(Image *image,
    const ChannelType channel)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>The image to auto-level</p></ol>

<h5>channel</h5>
<ol><p>The channels to auto-level.  If the special 'SyncChannels' flag is set all given channels is adjusted in the same way using the mean average of those channels.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="AutoLevelImage">AutoLevelImage</a></h2>
<div class="doc-section">

<p>AutoLevelImage() adjusts the levels of a particular image channel by scaling the minimum and maximum values to the full quantum range.</p></ol>

<p>The format of the LevelImage method is:</p>

<pre class="code">
  MagickBooleanType AutoLevelImage(Image *image)
  MagickBooleanType AutoLevelImageChannel(Image *image,
    const ChannelType channel)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>The image to auto-level</p></ol>

<h5>channel</h5>
<ol><p>The channels to auto-level.  If the special 'SyncChannels' flag is set the min/max/mean value of all given channels is used for all given channels, to all channels in the same way.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="Use BrightnessContrastImage">Use BrightnessContrastImage</a></h2>
<div class="doc-section">

<p>Use BrightnessContrastImage() to change the brightness and/or contrast of an image.  It converts the brightness and contrast parameters into slope and intercept and calls a polynomical function to apply to the image.</p></ol>

<p>The format of the BrightnessContrastImage method is:</p>

<pre class="code">
  MagickBooleanType BrightnessContrastImage(Image *image,
    const double brightness,const double contrast)
  MagickBooleanType BrightnessContrastImageChannel(Image *image,
    const ChannelType channel,const double brightness,
    const double contrast)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>brightness</h5>
<ol><p>the brightness percent (-100 .. 100).</p></ol>

<h5>contrast</h5>
<ol><p>the contrast percent (-100 .. 100).</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="ColorDecisionListImage">ColorDecisionListImage</a></h2>
<div class="doc-section">

<p>ColorDecisionListImage() accepts a lightweight Color Correction Collection (CCC) file which solely contains one or more color corrections and applies the correction to the image.  Here is a sample CCC file:</p>

<pre class="text">
      <ColorCorrectionCollection xmlns="urn:ASC:CDL:v1.2">
      <ColorCorrection id="cc03345">
            <SOPNode>
                 <Slope> 0.9 1.2 0.5 </Slope>
                 <Offset> 0.4 -0.5 0.6 </Offset>
                 <Power> 1.0 0.8 1.5 </Power>
            </SOPNode>
            <SATNode>
                 <Saturation> 0.85 </Saturation>
            </SATNode>
      </ColorCorrection>
      </ColorCorrectionCollection>
</pre>

<p>which includes the slop, offset, and power for each of the RGB channels as well as the saturation.</p></ol>

<p>The format of the ColorDecisionListImage method is:</p>

<pre class="code">
  MagickBooleanType ColorDecisionListImage(Image *image,
    const char *color_correction_collection)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>color_correction_collection</h5>
<ol><p>the color correction collection in XML.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="ClutImage">ClutImage</a></h2>
<div class="doc-section">

<p>ClutImage() replaces each color value in the given image, by using it as an index to lookup a replacement color value in a Color Look UP Table in the form of an image.  The values are extracted along a diagonal of the CLUT image so either a horizontal or vertial gradient image can be used.</p></ol>

<p>Typically this is used to either re-color a gray-scale image according to a color gradient in the CLUT image, or to perform a freeform histogram (level) adjustment according to the (typically gray-scale) gradient in the CLUT image.</p></ol>

<p>When the 'channel' mask includes the matte/alpha transparency channel but one image has no such channel it is assumed that that image is a simple gray-scale image that will effect the alpha channel values, either for gray-scale coloring (with transparent or semi-transparent colors), or a histogram adjustment of existing alpha channel values.   If both images have matte channels, direct and normal indexing is applied, which is rarely used.</p></ol>

<p>The format of the ClutImage method is:</p>

<pre class="code">
  MagickBooleanType ClutImage(Image *image,Image *clut_image)
  MagickBooleanType ClutImageChannel(Image *image,
    const ChannelType channel,Image *clut_image)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image, which is replaced by indexed CLUT values</p></ol>

<h5>clut_image</h5>
<ol><p>the color lookup table image for replacement color values.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="ContrastImage">ContrastImage</a></h2>
<div class="doc-section">

<p>ContrastImage() enhances the intensity differences between the lighter and darker elements of the image.  Set sharpen to a MagickTrue to increase the image contrast otherwise the contrast is reduced.</p></ol>

<p>The format of the ContrastImage method is:</p>

<pre class="code">
  MagickBooleanType ContrastImage(Image *image,
    const MagickBooleanType sharpen)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>sharpen</h5>
<ol><p>Increase or decrease image contrast.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="The ContrastStretchImage">The ContrastStretchImage</a></h2>
<div class="doc-section">

<p>The ContrastStretchImage() is a simple image enhancement technique that attempts to improve the contrast in an image by `stretching' the range of intensity values it contains to span a desired range of values. It differs from the more sophisticated histogram equalization in that it can only apply   a linear scaling function to the image pixel values.  As a result the `enhancement' is less harsh.</p></ol>

<p>The format of the ContrastStretchImage method is:</p>

<pre class="code">
  MagickBooleanType ContrastStretchImage(Image *image,
    const char *levels)
  MagickBooleanType ContrastStretchImageChannel(Image *image,
    const size_t channel,const double black_point,
    const double white_point)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>black_point</h5>
<ol><p>the black point.</p></ol>

<h5>white_point</h5>
<ol><p>the white point.</p></ol>

<h5>levels</h5>
<ol><p>Specify the levels where the black and white points have the range of 0 to number-of-pixels (e.g. 1, 10x90, etc.).</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="EnhanceImage">EnhanceImage</a></h2>
<div class="doc-section">

<p>EnhanceImage() applies a digital filter that improves the quality of a noisy image.</p></ol>

<p>The format of the EnhanceImage method is:</p>

<pre class="code">
  Image *EnhanceImage(const Image *image,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>exception</h5>
<ol><p>return any errors or warnings in this structure.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="EqualizeImage">EqualizeImage</a></h2>
<div class="doc-section">

<p>EqualizeImage() applies a histogram equalization to the image.</p></ol>

<p>The format of the EqualizeImage method is:</p>

<pre class="code">
  MagickBooleanType EqualizeImage(Image *image)
  MagickBooleanType EqualizeImageChannel(Image *image,
    const ChannelType channel)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="GammaImage">GammaImage</a></h2>
<div class="doc-section">

<p>GammaImage() gamma-corrects a particular image channel.  The same image viewed on different devices will have perceptual differences in the way the image's intensities are represented on the screen.  Specify individual gamma levels for the red, green, and blue channels, or adjust all three with the gamma parameter.  Values typically range from 0.8 to 2.3.</p></ol>

<p>You can also reduce the influence of a particular channel with a gamma value of 0.</p></ol>

<p>The format of the GammaImage method is:</p>

<pre class="code">
  MagickBooleanType GammaImage(Image *image,const double gamma)
  MagickBooleanType GammaImageChannel(Image *image,
    const ChannelType channel,const double gamma)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>gamma</h5>
<ol><p>the image gamma.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="HaldClutImage">HaldClutImage</a></h2>
<div class="doc-section">

<p>HaldClutImage() applies a Hald color lookup table to the image.  A Hald color lookup table is a 3-dimensional color cube mapped to 2 dimensions. Create it with the HALD coder.  You can apply any color transformation to the Hald image and then use this method to apply the transform to the image.</p></ol>

<p>The format of the HaldClutImage method is:</p>

<pre class="code">
  MagickBooleanType HaldClutImage(Image *image,Image *hald_image)
  MagickBooleanType HaldClutImageChannel(Image *image,
    const ChannelType channel,Image *hald_image)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image, which is replaced by indexed CLUT values</p></ol>

<h5>hald_image</h5>
<ol><p>the color lookup table image for replacement color values.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="LevelImage">LevelImage</a></h2>
<div class="doc-section">

<p>LevelImage() adjusts the levels of a particular image channel by scaling the colors falling between specified white and black points to the full available quantum range.</p></ol>

<p>The parameters provided represent the black, and white points.  The black point specifies the darkest color in the image. Colors darker than the black point are set to zero.  White point specifies the lightest color in the image.  Colors brighter than the white point are set to the maximum quantum value.</p></ol>

<p>If a '!' flag is given, map black and white colors to the given levels rather than mapping those levels to black and white.  See LevelizeImageChannel() and LevelizeImageChannel(), below.</p></ol>

<p>Gamma specifies a gamma correction to apply to the image.</p></ol>

<p>The format of the LevelImage method is:</p>

<pre class="code">
  MagickBooleanType LevelImage(Image *image,const char *levels)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>levels</h5>
<ol><p>Specify the levels where the black and white points have the range of 0-QuantumRange, and gamma has the range 0-10 (e.g. 10x90+2). A '!' flag inverts the re-mapping.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="LevelizeImage">LevelizeImage</a></h2>
<div class="doc-section">

<p>LevelizeImage() applies the normal level operation to the image, spreading out the values between the black and white points over the entire range of values.  Gamma correction is also applied after the values has been mapped.</p></ol>

<p>It is typically used to improve image contrast, or to provide a controlled linear threshold for the image. If the black and white points are set to the minimum and maximum values found in the image, the image can be normalized.  or by swapping black and white values, negate the image.</p></ol>

<p>The format of the LevelizeImage method is:</p>

<pre class="code">
  MagickBooleanType LevelizeImage(Image *image,const double black_point,
    const double white_point,const double gamma)
  MagickBooleanType LevelizeImageChannel(Image *image,
    const ChannelType channel,const double black_point,
    const double white_point,const double gamma)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>black_point</h5>
<ol><p>The level which is to be mapped to zero (black)</p></ol>

<h5>white_point</h5>
<ol><p>The level which is to be mapped to QuantiumRange (white)</p></ol>

<h5>gamma</h5>
<ol><p>adjust gamma by this factor before mapping values. use 1.0 for purely linear stretching of image color values</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="LevelizeImageChannel">LevelizeImageChannel</a></h2>
<div class="doc-section">

<p>LevelizeImageChannel() applies the reversed LevelImage() operation to just the specific channels specified.  It compresses the full range of color values, so that they lie between the given black and white points. Gamma is applied before the values are mapped.</p></ol>

<p>LevelizeImageChannel() can be called with by using a +level command line API option, or using a '!' on a -level or LevelImage() geometry string.</p></ol>

<p>It can be used for example de-contrast a greyscale image to the exact levels specified.  Or by using specific levels for each channel of an image you can convert a gray-scale image to any linear color gradient, according to those levels.</p></ol>

<p>The format of the LevelizeImageChannel method is:</p>

<pre class="code">
  MagickBooleanType LevelizeImageChannel(Image *image,
    const ChannelType channel,const char *levels)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>black_point</h5>
<ol><p>The level to map zero (black) to.</p></ol>

<h5>white_point</h5>
<ol><p>The level to map QuantiumRange (white) to.</p></ol>

<h5>gamma</h5>
<ol><p>adjust gamma by this factor before mapping values.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="LevelImageColor">LevelImageColor</a></h2>
<div class="doc-section">

<p>LevelImageColor() maps the given color to "black" and "white" values, linearly spreading out the colors, and level values on a channel by channel bases, as per LevelImage().  The given colors allows you to specify different level ranges for each of the color channels seperatally.</p></ol>

<p>If the boolean 'invert' is set true the image values will modifyed in the reverse direction. That is any existing "black" and "white" colors in the image will become the color values given, with all other values compressed appropriatally.  This effectivally maps a greyscale gradient into the given color gradient.</p></ol>

<p>The format of the LevelColorsImageChannel method is:</p>

<pre class="code">
      MagickBooleanType LevelColorsImage(Image *image,
  const MagickPixelPacket *black_color,
  const MagickPixelPacket *white_color,const MagickBooleanType invert)
      MagickBooleanType LevelColorsImageChannel(Image *image,
  const ChannelType channel,const MagickPixelPacket *black_color,
  const MagickPixelPacket *white_color,const MagickBooleanType invert)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>black_color</h5>
<ol><p>The color to map black to/from</p></ol>

<h5>white_point</h5>
<ol><p>The color to map white to/from</p></ol>

<h5>invert</h5>
<ol><p>if true map the colors (levelize), rather than from (level)</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="The LinearStretchImage">The LinearStretchImage</a></h2>
<div class="doc-section">

<p>The LinearStretchImage() discards any pixels below the black point and above the white point and levels the remaining pixels.</p></ol>

<p>The format of the LinearStretchImage method is:</p>

<pre class="code">
  MagickBooleanType LinearStretchImage(Image *image,
    const double black_point,const double white_point)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>black_point</h5>
<ol><p>the black point.</p></ol>

<h5>white_point</h5>
<ol><p>the white point.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="ModulateImage">ModulateImage</a></h2>
<div class="doc-section">

<p>ModulateImage() lets you control the brightness, saturation, and hue of an image.  Modulate represents the brightness, saturation, and hue as one parameter (e.g. 90,150,100).  If the image colorspace is HSL, the modulation is lightness, saturation, and hue.  And if the colorspace is HWB, use blackness, whiteness, and hue.</p></ol>

<p>The format of the ModulateImage method is:</p>

<pre class="code">
  MagickBooleanType ModulateImage(Image *image,const char *modulate)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>modulate</h5>
<ol><p>Define the percent change in brightness, saturation, and hue.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="NegateImage">NegateImage</a></h2>
<div class="doc-section">

<p>NegateImage() negates the colors in the reference image.  The grayscale option means that only grayscale values within the image are negated.</p></ol>

<p>The format of the NegateImageChannel method is:</p>

<pre class="code">
  MagickBooleanType NegateImage(Image *image,
    const MagickBooleanType grayscale)
  MagickBooleanType NegateImageChannel(Image *image,
    const ChannelType channel,const MagickBooleanType grayscale)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>grayscale</h5>
<ol><p>If MagickTrue, only negate grayscale pixels within the image.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="The NormalizeImage">The NormalizeImage</a></h2>
<div class="doc-section">

<p>The NormalizeImage() method enhances the contrast of a color image by mapping the darkest 2 percent of all pixel to black and the brightest 1 percent to white.</p></ol>

<p>The format of the NormalizeImage method is:</p>

<pre class="code">
  MagickBooleanType NormalizeImage(Image *image)
  MagickBooleanType NormalizeImageChannel(Image *image,
    const ChannelType channel)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/enhance
_8c.html" target="source" name="SigmoidalContrastImage">SigmoidalContrastImage</a></h2>
<div class="doc-section">

<p>SigmoidalContrastImage() adjusts the contrast of an image with a non-linear sigmoidal contrast algorithm.  Increase the contrast of the image using a sigmoidal transfer function without saturating highlights or shadows. Contrast indicates how much to increase the contrast (0 is none; 3 is typical; 20 is pushing it); mid-point indicates where midtones fall in the resultant image (0 is white; 50 is middle-gray; 100 is black).  Set sharpen to MagickTrue to increase the image contrast otherwise the contrast is reduced.</p></ol>

<p>The format of the SigmoidalContrastImage method is:</p>

<pre class="code">
  MagickBooleanType SigmoidalContrastImage(Image *image,
    const MagickBooleanType sharpen,const char *levels)
  MagickBooleanType SigmoidalContrastImageChannel(Image *image,
    const ChannelType channel,const MagickBooleanType sharpen,
    const double contrast,const double midpoint)
</pre>

<p>A description of each parameter follows:</p></ol>

<h5>image</h5>
<ol><p>the image.</p></ol>

<h5>channel</h5>
<ol><p>the channel.</p></ol>

<h5>sharpen</h5>
<ol><p>Increase or decrease image contrast.</p></ol>

<h5>contrast</h5>
<ol><p>control the "shoulder" of the contast curve.</p></ol>

<h5>midpoint</h5>
<ol><p>control the "toe" of the contast curve.</p></ol>

 </div>

</div>

<div id="linkbar">
    <span id="linkbar-west">&nbsp;</span>
    <span id="linkbar-center">
      <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
      <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
    </span>
    <span id="linkbar-east">&nbsp;</span>
  </div>
  <div class="footer">
    <span id="footer-west">&copy; 1999-2010 ImageMagick Studio LLC</span>
    <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
  </div>
  <div style="clear: both; margin: 0; width: 100%; "></div>
  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-17690367-1']);
    _gaq.push(['_trackPageview']);

    (function() {
      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
  </script>
</body>
</html>
