⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://usage.imagemagick.org/color_mods/index.html)

ImageMagick 示例 -- 颜色修改

ImageMagick 示例前言和索引
将彩色转换为灰度
图像色阶调整

在这里,我们研究一下整体修改图像中所有颜色的技术。无论是使图像变亮或变暗,还是进行更剧烈的颜色修改。 为了探索这些技术,我们需要一张测试图像......
不要担心上面我实际上是如何生成这张图像的,这对于练习来说并不重要。我确实将其设计为包含一系列颜色、透明度和其他功能,特别是为了让 IM 在使用时得到充分检验。 | [IM 输出]
---|---
如果你确实对用于生成此图像的命令感兴趣,你可以查看我用来创建它的特殊脚本“[**generate_test**](../static/img/scripts/generate_test)”。 | 警告:下面的颜色处理通常假设图像使用线性色彩空间。然而,大多数图像都是使用 sRGB 或伽马校正色彩空间保存的,因此为了使事情正确,还应该首先应用色彩空间校正。
---|---


将颜色转换为灰度

灰度图像对于许多用途都非常有用,例如进一步处理原始图像或用于背景合成。将图像转换为灰度的最佳方法是要求 IM 将图像转换为灰度色彩空间 表示形式。

  magick test.png  -colorspace Gray   gray_colorspace.png

[IM 输出] [IM 输出]

请注意,由于权重会匹配人眼感知到的强度,蓝色会比红色暗得多。也就是说,“red”相对于看起来较暗的“blue”来说是相当明亮的颜色。 这相当于使用“rec709luma”转换公式和专用“[-grayscale](https://imagemagick.org/command-line-options/#grayscale)”运算符(IM v6.8.3-10 添加)。 |

  magick test.png  -grayscale rec709luma  gray_grayscale.png

[IM 输出]
rec709luma”值只是已定义供“[-intensity](https://imagemagick.org/command-line-options/#intensity)”设置使用的众多灰度公式之一(见下文)。 这里例如是另一个常见的灰度公式'rec601luma' |

  magick test.png  -grayscale rec601luma  gray_grayscale_601.png

[IM 输出]
正如你所看到的,不同的红色、绿色和蓝色通道的强度级别略有不同。
然而,还有许多其他方法以及“灰度”的含义...例如,你可以使用调制运算符从图像中去掉所有颜色,将所有颜色饱和度设置为零。 |

  magick test.png  -modulate 100,0  gray_modulate.png

[IM 输出]
这本质上是将图像转换为 HSL 色彩空间,并从该色彩空间中提取灰度“Lightness”值。但是,使用“-define modulate:colorspace”,你可以指定要使用的其他色彩空间模型。请参阅下面的在其他色彩空间中进行调制。请注意,我在测试图像中用于中心彩色圆盘的 IM“green”颜色实际上并不是纯绿色(例如彩色彩虹中使用的),而是由新的 SVG -- 可缩放矢量图形 标准定义的半亮绿色。如果你需要纯 RGB 绿色,可以使用颜色“lime”代替。有关更多详细信息,请参阅颜色名称冲突。 另一种方法是使用FX DIY 运算符将三个通道一起平均,得到纯数学意义的灰度。 |

  magick test.png -fx '(r+g+b)/3' gray_fx_average.png

[IM 输出]
| sRGB 通道值的平均值也相当于“OHTA”色彩空间的强度通道(红色通道),或者 HSI 色彩空间中的“I”通道。
---|---
另一种技术是简单地将所有三个通道添加在一起(一种称为曼哈顿距离的颜色度量),虽然生成的图像不会因“量子舍入”效应而丢失信息,但你可能会丢失有关最亮颜色的信息。不幸的是,你也失去了透明度通道。 |

  magick test.png -separate \
          -background black -compose plus -flatten   gray_added.png

[IM 输出]
你可以使用相同的添加通道技术来控制各个颜色通道的权重。例如,这是一个你可以使用的 DIY 公式... |

  magick test.png -fx '0.3*r+0.6*g+0.1*b' gray_diy.png

[IM 输出]
如果你希望在“[-fx](https://imagemagick.org/command-line-options/#fx)”运算符中使用相同的含义,也可以使用“intensity”。 |

  magick test.png  -fx intensity  gray_intensity.png

[IM 输出]

然而,当FX DIY 运算符被解释时,它可能运行得非常非常慢。对于更复杂的操作,你可以使用更简单的计算运算符[-evaluate](https://imagemagick.org/command-line-options/#evaluate)”。例如,这是一个 2/5/3 比例的灰度图像,尽管我再次没有尝试保留原始图像的透明度通道。 | |

  magick test.png -channel R -evaluate multiply .2 \
                   -channel G -evaluate multiply .5 \
                   -channel B -evaluate multiply .3 \
                   -channel RGB -separate -compose add -flatten gray_253.png

[IM 输出]
| _对于在“Q8”质量级别 编译的 ImageMagick,上述内容会受到“量化”影响。这是因为“[-evaluate](https://imagemagick.org/command-line-options/#evaluate)”的结果将被保存为一个小的8位整数,用于图像值。直到后来这些值才被加在一起,从而导致准确性的损失。

使用“Q16”编译的 ImageMagick,或者更好的是 HDRI,质量编译选项将产生更精确的结果。另一个新的替代方案是 Poly -- 加权图像合并运算符,它将在一次操作中对分离的通道图像进行加权和相加,从而避免“量子舍入”效应。

_
---|---
通过直接平均三个 RGB 通道,可以使用类似的技术来生成纯数学灰度。 |

  magick test.png -separate -evaluate-sequence mean  gray_average.png

[IM 输出]
然而,正如你所看到的,我并没有尝试保留结果图像的 alpha 通道。另一种快速替代方法是使用“[-recolor](https://imagemagick.org/command-line-options/#recolor)”颜色矩阵运算符,它可以让你指定三个颜色通道的权重。 |

  magick test.png -recolor '.2 .5 .3
                             .2 .5 .3
                             .2 .5 .3'   gray_recolor.png

[IM 输出]
这不会影响透明度,但使其成为使用特定权重转换颜色的更好方法。基本上,第一行数字是生成图像红色通道的通道权重,接下来的 3 个数字是绿色通道的通道权重,最后三个数字是蓝色通道的通道权重。 你还可以使用“[-type](https://imagemagick.org/command-line-options/#type)”告诉 IM 在读取或写入图像时将图像视为灰度图像。 |

  magick test.png  -type GrayScaleAlpha  gray_type.png

[IM 输出]
| [-type](https://imagemagick.org/command-line-options/#type)”设置通常仅在读取图像或将图像写入文件时用作指导。因此,其操作被延迟到图像的最终写入。其效果还高度依赖于所涉及图像文件格式的功能,并用于覆盖 ImageMagick 在此过程中的正常确定。有关详细信息,请参阅类型 示例。
---|---
| 在 IM v6.3.5-9 之前,由于错误,上述内容将删除写入图像中的任何透明度(相当于“[-type](https://imagemagick.org/command-line-options/#type) Grayscale”)。我一注意到问题并报告就解决了这个问题。 (这里有一个教训:-)
---|---

一种更有趣的技术,是从图像的各种颜色通道色彩空间 表示中提取适当通道,从而提取“亮度”的各种不同含义。示例请参阅色彩空间表示中的灰度通道


图像色阶调整

你可以对图像进行的最基本的调整形式称为“级别”调整。这基本上意味着获取各个 RGB 颜色值(甚至 alpha 通道值)并调整它们以便拉伸或压缩这些值。由于仅调整通道值,因此最好在灰度图像而不是彩色图像上展示它们。但是,如果你将图像的所有颜色通道调整相同的量,则可以将它们与彩色图像一起使用,以增强或调整图像。不要将其与更自动的色阶调整形式相混淆,我们将在下面的示例的下一个主要部分中查看它,归一化调整。无论图像的实际内容如何,该函数都会执行完全相同的操作。图像是亮还是暗,或者是蓝色还是黄色都没有关系。这些操作对实际图像内容是盲目的。 [IM 图表] 在演示这些操作时,我将使用修改后的“[gnuplot](http://www.gnuplot.info/)”图,如右图所示,该图是我使用特殊脚本“[im_graph](../static/img/scripts/im_graph)”生成的。该图有一条红线,它将给定的原始“x”值(表示最顶部渐变的灰度值)映射到显示的“y”值。生成的颜色渐变也显示在输入线性渐变下方。右图所示的是 IM“[-noop](https://imagemagick.org/command-line-options/#noop)”运算符,它实际上对图像没有任何作用。因此,每个图像的颜色值都被映射到完全相同的值而不发生变化。因此,下部渐变与上部渐变相同。

图像取反

你可以进行的最简单、最基本的全局色阶调整,是使用“[-negate](https://imagemagick.org/command-line-options/#negate)”图像运算符对图像取反。本质上,它会把白变黑、黑变白,并相应调整所有颜色。也就是说,它会把红色变成补色青色,把蓝色变成黄色,等等。你可以通过下面的映射图看到这一点:我对“test”图像和标准 IM 内置“rose”图像都使用了“[-negate](https://imagemagick.org/command-line-options/#negate)”运算符。请注意,映射图中的下方渐变现在已经反转,黑白互换;取反后的“test”图像中也出现了同样的反转。

  magick test.png  -negate  test_negate.png
  magick rose:    -negate  rose_negate.gif

[IM 输出]
[IM 输出] | [IM 图表] | [IM 输出]
[IM 输出]
---|---|---

negate 内部其实相当简单粗暴。它独立处理三个颜色通道,默认情况下忽略 alpha 通道。如果不是这种情况,你会得到这样一个非常愚蠢的结果......

  magick test.png -channel RGBA  -negate  negate_rgba.png

[IM 输出] [IM 输出]

正如你通过半透明颜色渐变看到的那样,图像已被取反。但由于透明度通道也被取反,你会失去图像中所有不透明的颜色。这就是为什么“[-channel](https://imagemagick.org/command-line-options/#channel)”的默认设置是“RGB”。有关详细信息,请参阅颜色通道。你可以将求反限制为仅一个通道,例如绿色通道。这可能看起来不太有用,但有时非常重要。

  magick test.png -channel green  -negate  negate_green.png

[IM 输出] [IM 输出]

[-negate](https://imagemagick.org/command-line-options/#negate)”运算符实际上是它自己的逆运算符。使用相同的“[-channel](https://imagemagick.org/command-line-options/#channel)”设置进行两次求反会相互抵消。

  magick negate_green.png  -channel green  -negate  negate_restore.png

[IM 输出] [IM 输出]

取反在图像处理中非常常见,特别是在将灰度图像作为其他处理选项之前或之后的步骤进行处理时。因此,我建议你使用它并在做任何事情时牢记它,因为使用取反图像可以解决一些其他困难的问题。

直接色阶调整

[-level](https://imagemagick.org/command-line-options/#level)”运算符是更通用的色阶调整运算符。你基本上给它两个值:“black_point”和“white_point”,还可以给一个可选的第三个值(伽马调整),这个我会在后面说明。它会把图像中等于或低于“black_point”的任何颜色值映射为黑色(或 0 值)。同样,等于或亮于“white_point”的任何颜色值会被映射为白色(或最大值)。这两点之间的颜色则会被线性“拉伸”,填满完整的取值范围。这样可以提高对比度,增强图像中的颜色。例如,下面使用图中所示的相同数值,对我们的测试图像做 25% 的对比度增强。由于通常会从 0%100% 向内以相同幅度调整黑点和白点,所以只指定“black_point”即可,白点会按相同幅度向内调整。

  magick test.png  -level 25%,75%  test_level.png
  magick rose:    -level 25%      rose_level.gif

[IM 输出]
[IM 输出] | [IM 图表] | [IM 输出]
[IM 输出]
---|---|---

请注意,25% 对于任何图像来说都是巨大的对比度增强,但它清楚地显示了它的作用。你不必同时更改“黑”点和“白”点。相反,只调整颜色范围的一端是完全可以的。例如,我们可以制作非常亮或非常暗的 rose 图像。

  magick rose: -level 0,75%     rose_level_light.gif
  magick rose: -level 25%,100%  rose_level_dark.gif

[IM 图表] [IM 输出] [IM 图表] [IM 输出]

不过,我再次警告你,给定范围之外的颜色将被“剪裁”或“烧毁”,因此将不再可用于以后的图像处理。这是使用“[-level](https://imagemagick.org/command-line-options/#level)”运算符的最大问题。 [IM 图表] 通过使用负值,你可以对图像进行一些粗略的去对比度处理。这意味着,你不是为要映射到“黑色”和“白色”的值提供颜色值,从而拉伸它们之间的颜色,而是压缩颜色值,以便将假想的负颜色映射到黑色或白色。结果是图像总体变灰。 |

  magick rose: -level -25%  rose_decontrast.gif

[IM 输出]

然而,这种消除图像对比度的方法非常不准确,不建议使用,除非你的 IM 版本早于 6.4.2,并且你无法访问新的 反转级别运算符[IM 图表] 你可以使用“[-level](https://imagemagick.org/command-line-options/#level)”运算符来取反图像(如上所示,只需使用“-level 100%,0”交换给定的“黑色”和“白色”点值即可。|

  magick rose: -level 100%,0  rose_level_neg.gif

[IM 输出]

[IM 图表] 或者通过将它们设置为相同的值,可以有效地调用要阈值化的图像中的所有颜色值。使用“[-level](https://imagemagick.org/command-line-options/#level)”对图像设置阈值与使用具有该值的 阈值运算符 完全相同。右图所示的映射图显示了“-level 50%,50%”操作的结果及其对灰度渐变的影响。 |

  magick rose: -level 50%,50%  rose_level_thres.gif

[IM 输出]

请注意,与“[-threshold](https://imagemagick.org/command-line-options/#threshold)”不同,当与默认“[-channel](https://imagemagick.org/command-line-options/#channel)”设置一起使用时,图像不会自动转换为灰度图像。使用级别来线性修改图像的一般性质,使得“[-level](https://imagemagick.org/command-line-options/#level)”运算符适合一般灰度图像修改和掩模调整。添加你可以修改单个通道(使用“[-channel](https://imagemagick.org/command-line-options/#channel)”设置)而不是整个图像的事实,使其成为 IM 用户可用的最佳颜色修改运算符之一。 注意,你还可以使用求值和函数运算符 对颜色值进行更直接的数学修改,以在 - 级别 + 和 - 形式下获得相同的结果。
请注意,“[-level](https://imagemagick.org/command-line-options/#level)”运算符将透明度通道视为“遮罩”值。因此 100% 是完全透明的,0% 是不透明的。当使用具有模糊形状图像的“[-level](https://imagemagick.org/command-line-options/#level)”时,请考虑这一点。这通常是在模糊“形状”图像之后完成的,以扩展和拉伸结果。有关示例,请参阅软边缘阴影轮廓
--- ---

反向色阶调整 -- 图像去对比度

从 IM 版本 6.4.2 开始,Level Operator 已扩展为提供“反向”形式“[+level](https://imagemagick.org/command-line-options/#level)”(注意“加号”)。或者,你可以使用运算符的原始“[-level](https://imagemagick.org/command-line-options/#level)”形式,但将“!”添加到给定的级别参数(对于较旧的 API 接口)。此变体的参数完全相同,但不是拉伸值以将“black_point”和“white_point”映射到“black”和“white”,而是将“black”和“white”映射到给定点。换句话说,“[+level](https://imagemagick.org/command-line-options/#level)”与“[-level](https://imagemagick.org/command-line-options/#level)”完全相反。例如,这里我们将“黑色”映射到 25% 的灰色,将白色映射到 75% 的灰色,使用指定“反转”形式的两种方法以非常精确的方式有效地消除图像的对比度。

  magick test.png   +level 25%    test_level_plus.png
  magick rose:     -level 25%\!  rose_level_plus.gif

[IM 输出]
[IM 输出] | [IM 图表] | [IM 输出]
[IM 输出]
---|---|---

如果将上面的“+level 25%”操作与我们之前展示的负去对比度“-level -25%”运算符的使用进行比较,你会发现它们并不相同。 “加”版本会产生更强的去对比度图像(更灰),但这是通过映射到你为运算符提供的精确值而不是“减”形式使用的“虚”值来实现的。这种精确的值用法很重要,也是添加运算符“加”形式的原因之一。当然,“25%”也是一个非常大的值,不建议将其用于典型的图像工作。请注意,当给出相同的参数时,“[-level](https://imagemagick.org/command-line-options/#level)”和“[+level](https://imagemagick.org/command-line-options/#level)”实际上是彼此完全相反的。也就是说,一个将值映射到范围极值,而另一个则从范围极值映射。例如,这里我们使用“[+level](https://imagemagick.org/command-line-options/#level)”对test图像的颜色进行压缩,然后使用“[-level](https://imagemagick.org/command-line-options/#level)”再次解压,从而使图像恢复接近原始外观。

  magick test.png  +level 20%  -level 20%  test_level_undo.png

[IM 输出] [IM 图表] [IM 输出]

这两个图像看起来非常非常相似,并且由于我使用的是高质量“Q16”版本的 IM,因此你很难注意到任何差异。但是,这些值可能不完全相同,因为你已有效地将图像的颜色值压缩到较小的整数范围,然后再次恢复它们。在极端情况下,这可能会导致量子舍入效应。以相反的顺序执行这两个操作(拉伸,然后压缩颜色值)将产生量子剪切效果。 “[+level](https://imagemagick.org/command-line-options/#level)”运算符的另一个有用的方面是你可以将图像中的所有颜色值完全压缩到相同的灰度级别。

  magick test.png  +level 30%,30%  test_level_const.png

[IM 输出] [IM 图表] [IM 输出]

通过根据每个单独通道的特定颜色值指定级别,你可以有效地将灰度渐变变为特定的颜色渐变。然而,这很难计算和实现。因此,还提供了“[-level-colors](https://imagemagick.org/command-line-options/#level-colors)”运算符,它可以让你根据特定颜色而不是“级别”值来指定黑点和白点。请参阅下面的按颜色级别

级别伽马调整

上述两个“[-level](https://imagemagick.org/command-line-options/#level)”变体还允许你使用第三种设置。 “伽马”调整值。默认情况下,该值设置为 1.0' 的值,它不会对生成的图像进行任何类型的中间色调调整,从而生成从旧图像到新图像的值的纯线性映射。然而,通过增大该值,你将弯曲结果线以使图像变亮,而缩小该值将使图像变暗。例如,在这里我仅使用“伽马”设置来仅使图像的中间色调变亮和变暗。

  magick rose: -level 0%,100%,2.0   rose_level_gamma_light.gif
  magick rose: -level 0%,100%,0.5   rose_level_gamma_dark.gif

[IM 图表] [IM 输出] [IM 图表] [IM 输出]

值的范围通常为 10(表示令人目眩的明亮图像)到 0.2(表示非常暗的图像)。如前所述,1.0 的值不会对图像进行“伽马”更改。然而,“2.0”的特殊值(见上文)可用于获取图像归一化颜色的平方根。 “[-level](https://imagemagick.org/command-line-options/#level)”的两个版本都以相同的方式操作手柄“gamma”。这意味着你可以将“黑”和“白”端的色阶调整与非线性“伽马”调整结合起来。你也可以仅调整图像的单个通道。例如,在这里,我们在蓝色通道的黑色端赋予图像微妙的色调,同时使用伽马保留图像的中间色调颜色级别。

  magick test.png  -channel B +level 25%,100%,.6 test_blue_tint.png

[IM 输出] [IM 图表] [IM 输出]

这个具体的例子可以用来给气象卫星照片着色,其中只有海洋是纯黑色的,而陆地则更加灰色。下面的DIY 数学非线性调整中给出了这种蓝色通道调整的其他替代方案。

伽马操作调整

还提供了“[-gamma](https://imagemagick.org/command-line-options/#gamma)”运算符,其效果与“[-level](https://imagemagick.org/command-line-options/#level)”运算符中的“gamma”设置完全相同。然而,它也可以让你调整每个单独通道的“伽马”调整色阶。它的真正用途是在对图像执行线性操作之前调整图像的“伽马”函数。有关更多详细信息,请参阅人类色彩感知和伽马校正。我们还可以使用此功能对每个 RGB 通道的图像进行不同的增亮。 |

  magick rose: -gamma 0.8,1.3,1.0  gamma_channel.gif

[IM 输出]
正如你所看到的,这可以用于对图像进行一些微妙的着色和颜色调整,或者纠正包含过多特定颜色的图像。 | _有关为何应使用此功能的原因,请参阅伽马校正

_
---|---
该函数实际上等同于评估 POW 函数,但参数相反。因此,“-evaluate POW 2.2”实际上会执行“-gamma 0.45455”(0.45455 等于 1/2.2)操作,这与“-gamma 2.2”相反。
[-gamma](https://imagemagick.org/command-line-options/#gamma)”不太明显的用途之一是将特定图像通道归零(请参阅归零颜色通道)。或者将图像完全着色为“黑色”、“白色”或其他一些原色(请参阅原色画布)。

按颜色调整色阶

IM v6.2.4-1 中添加了“[-level-colors](https://imagemagick.org/command-line-options/#level-colors)”运算符。本质上,它与我们上面讨论的级别运算符 完全相同,但每个通道的值指定为颜色值。也就是说,“[-level-colors](https://imagemagick.org/command-line-options/#level-colors)”选项会将给定颜色映射为“黑色”和“白色”,并线性拉伸它们之间的所有其他颜色。这有效地消除了图像中给出的颜色范围。虽然这有效,但并不是特别有用,因为对于在某些通道中具有共同值的颜色,它很容易失败。例如,颜色“DodgerBlue”和“White”在蓝色通道中具有相同的颜色值。因此,“-level-colors DodgerBlue,White”可能并不总是将这些颜色顺利变成黑色和白色。在这种情况下,更好的技术是提取差异最大的通道(例如红色通道)作为灰度图像,并对该通道执行 level 或 normalize。警告:注意“透明”颜色。
另一方面,运算符“[+level-colors](https://imagemagick.org/command-line-options/#level-colors)”的加号形式非常有用,因为它将“黑色”和“白色”颜色映射到给定值,线性压缩所有其他颜色以适合你给出的两种颜色。例如,让我们将“black”和“white”映射到“green”和“gold”...

  magick test.png  +level-colors green,gold   levelc_grn-gold.png

[IM 输出] [IM 输出]

正如你所看到的,灰度渐变被重新映射为由给定颜色限制的渐变,尽管灰度范围之外的颜色也被修改,但它们也将遵循指定颜色范围的基本样式。这使得“[+level-colors](https://imagemagick.org/command-line-options/#level-colors)”运算符成为一种非常有用的运算符,尤其是在映射灰度图像时。如果你只提供一种颜色名称但包含逗号,则缺少的颜色将根据情况默认为“black”或“white”。

  magick test.png  +level-colors ,DodgerBlue   levelc_dodger.png
  magick test.png  +level-colors ,Gold         levelc_gold.png
  magick test.png  +level-colors ,Lime         levelc_lime.png
  magick test.png  +level-colors ,Red          levelc_red.png

  magick test.png  +level-colors Navy,         levelc_navy.png
  magick test.png  +level-colors DarkGreen,    levelc_darkgreen.png
  magick test.png  +level-colors Firebrick,    levelc_firebrick.png

[IM 输出] [IM 输出] [IM 输出] [IM输出]
[IM 输出] [IM 输出] [IM 输出]

这使得你可以轻松地将灰度图像变成你喜欢的任何颜色的渐变。例如,在这里我将黑白渐变重新映射为红白渐变,(注意参数中的“,”)...

  magick cow.gif   +level-colors red,   cow_red.gif

[IM 输出] [IM 输出]

这不仅用“红色”替换了“黑色”,而且还将所有抗锯齿灰色重新映射为“红色”和“白色”的适当混合,从而产生了非常平滑的结果。 [IM 输出] 如果我刚刚执行了一个简单的 直接颜色替换 将纯黑色转换为红色,我最终会得到可怕的图像(如右图所示)。有关用于生成该图像的示例,请参阅模糊因子。当然,如果你希望其中一种颜色变得透明,你最好使用 -alpha Shape 运算符,因为这需要你将渐变传输到 alpha 通道。
如果你只指定单一颜色,没有任何“逗号”分隔符,则该颜色将用于黑点和白点。这意味着图像中的所有颜色都将重置为该一种颜色。 (根据当前“[-channel](https://imagemagick.org/command-line-options/#channel)”设置限制)。 |

  magick test.png  +level-colors dodgerblue  levelc_blue.png

[IM 输出]
这与使用“-fill DodgerBlue -colorize 100%对图像进行着色 的结果相同(见下文)。如果你还想设置图像透明度设置,则需要设置“[-channel](https://imagemagick.org/command-line-options/#channel)”以包含透明度通道,或者使用“-alpha opaque”或“-alpha off”将alpha 通道设置为完全不透明。 |

  magick test.png -channel ALL +level-colors dodgerblue levelc_blue2.png

[IM 输出]
另请参阅消隐现有图像。这里还有一些使用它来调整或“着色”彩色图像而不是灰度图像的示例。

  magick rose: +level-colors             navy,lemonchiffon  levelc_faded.gif
  magick rose: +level-colors        firebrick,yellow        levelc_fire.gif
  magick rose: +level-colors 'rgb(102,75,25)',lemonchiffon  levelc_tan.gif

[IM 输出] [IM 输出] [IM 输出] [IM输出]

总而言之,“[+level-colors](https://imagemagick.org/command-line-options/#level-colors)”是渐变颜色替换、线性着色运算符,并且还可以完全重置颜色。

S形非线性对比

在关于“图像处理基础知识”(第 44 页)的 PDF 论文中,他们提出了使用线性对比度控制(级别)的替代方案,其中使用伽马校正的方法称为“sigmoidal 非线性对比度控制”。结果是在整个颜色范围内实现非线性、平滑的对比度变化(数学术语中的“S形函数”),保留白色和黑色,更适合照片颜色调整。论文中的具体公式非常复杂,甚至有错误,但本质上需要有两个调整值。对比度函数中心的阈值水平(通常以“50%”为中心)和对比度因子(“10”非常高,“0.5”非常低)。 | 对于那些感兴趣的人,“S形非线性对比度控制”的校正公式是... ( 1/(1+exp(**β** *(**α** -u))) - 1/(1+exp(**β** *(**α**)) ) / ( 1/(1+exp(**β** *(**α** -1))) - 1/(1+exp(**β** * **α**)) ) _其中α 是阈值水平,β 是要应用的对比度因子。

这是使用中间变量的公式的替代版本。 x = exp(**β** * (**α** - u)) y = exp(**β** + 1 result (x / y + 1) * (1 / (x + 1) - 1 / y) _该公式实际上是非常简单的指数曲线,上面公式的大部分内容旨在确保 0 保持为零,1 保持一。也就是说,图形总是经过点 0,0 和 1,1。变化的最高渐变是在给定的阈值处。
---|---
例如,这里是上述公式的“[-fx](https://imagemagick.org/command-line-options/#fx)”实现,由“10”的非常高的对比度值和“50%”阈值产生。这些值已被转入浮点常量中,以加快函数速度。

  magick test.png  -fx '(1/(1+exp(10*(.5-u)))-0.006693)*1.013567' \
              sigmoidal.png

[IM 输出] [IM 图表] [IM 输出]

对我们来说幸运的是,IM v6.2.1 将这个复杂的函数作为新的运算符“[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)”内置,从而可以更简单地使用。 |

    magick test.png  -sigmoidal-contrast 10,50% test_sigmoidal.png

[IM 输出]
作为奖励,IM 还提供了逆函数,即“S形对比度降低”函数(以及运算符的“+”形式),如果应用相同的参数,则可以恢复我们的原始图像(几乎完全一样)。 |

    magick test_sigmoidal.png +sigmoidal-contrast 10,50% \
                                             test_sigmoidal_inv.png

[IM 输出]
在这里我们将其应用到 rose 图像... |

    magick rose: -sigmoidal-contrast 10,50%  rose_sigmoidal.gif

[IM 输出]
我确实说过“10”是一个非常重的对比度因素。事实上,任何高于该值的值都可以被认为更像是模糊阈值操作,而不是对比度增强。有关使用此运算符的实际示例,请参阅高级 “凝胶”效果示例,其中它用于锐化添加到成形区域颜色的明亮区域。

各种对比运算符

建设中

   -contrast  and   +contrast
         Rather useless minor contrast adjustment operator

<a id="threshold"></a>-threshold
   Threshold the image, any value less than or equal to the given value is
   set to 0 and anything greater is set to the maximum value.

   Note that like level, this is a channel operator, but if the default
   'channel setting' is used only the gray-scale intensity of the image is
   thresholded producing a black and white image.

   magick rose: -threshold 45%  x:

   You can force normal channel behaviour, where each channel is thresholded
   individually buy using "-channel All"

   magick rose: -channel All -threshold 45%  x:

<a id="black-threshold"></a>-black-threshold
<a id="white-threshold"></a>-white-threshold
   This is like -threshold except that only one side of the threshold value is
   actually modified.

   For example, here anything that is darker than 30% is set to black.

   magick rose: -black-threshold 30%  x:
   magick rose: -white-threshold 50%  x:

   These operators however do not seem to be channel effected, so may only be
   suitable for gray-scale images!

使用直方图修改进行调整

_本节是Fred Weinhaus 和 Anthony Thyssen 共同努力的成果。_什么是直方图?直方图是一种特殊类型的图表。它只是将图像中像素的颜色级别分类到固定数量的“容器”中,每个容器跨越一些小范围的值。因此,每个 bin 都包含图像中属于该范围的颜色级别(像素值)数量的计数。结果是组成图像的颜色值如何分布的表示,从左侧的黑色到右侧的白色。 可以单独为每个通道生成直方图,也可以将其作为全局直方图生成,该全局直方图查看所有组合通道的值。结果通常显示为条形图的图像。在 IM 中,这是使用特殊的 Histogram: 输出格式完成的。例如... |

  magick rose: histogram:histogram.gif

[IM 输出]
但它也可以显示为线图,其中线连接条形的顶部。这将在下面的讨论中得到证明。有关此特殊输出格式的更多详细信息,请参阅直方图:。建议此时阅读本文,因为这是使用 IM 提取有关图像的直方图信息的最佳方法。直方图的实际高度没有什么实际意义,因为它通常会缩放以使最高峰接触图像的顶部。因此,每个单独“条”的高度是不相关的。更重要的是直方图在整个范围内的分布,以及整个图表上的相对高度如何相互关联。查看直方图时,你会考虑以下因素。

  • 直方图是否形成一宽范围的值?这意味着图像广泛使用了色彩空间,因此具有良好的对比度。
  • 还是全部集中在中间或一端的紧密组中?这意味着图像的对比度较低,使其看起来“模糊”或“灰色”,或者可能过亮或过暗。
  • 它是否形成两个或多个峰?由于图像中存在高度不同的区域或区域。
  • 大多数像素在哪里?在左边,这意味着图像非常暗。或者在右边,意味着它非常亮。还是从中间散开?
  • 各个条之间是否有规则的间隙或空白空间?这通常意味着图像的像素非常少,因此无法完全填充整个直方图,或者图像被减色或以某种方式修改,从而产生这些间隙。

本质上,直方图是图像的更简单表示,因此根据直方图更改或调整图像要容易得多。几乎任何应用于图像的数学颜色变换通常不仅会导致图像被修改,而且还会导致其直方图被修改。其中包括线性运算,例如 Level Operator 或非线性运算,例如 Gamma Operator(见上文)。我们上面看到的映射图表示图像中的灰度级以及图像的直方图如何变换。例如,我们制作一张低对比度图像来演示。然而,最终的结果是,它不仅修改了图像,而且通过修改图像的直方图(通过压缩)来实现。

  magick chinese_chess.jpg -contrast -contrast -contrast -contrast \
          chinese_contrast.png

  magick chinese_chess.jpg     histogram:chinese_chess_hist.gif
  magick chinese_contrast.png  histogram:chinese_contrast_hist.gif

[IM 输出] [IM 输出]
[IM 输出] [IM 输出]

在上面的例子中,“-contrast”是一个简单的 Level 类型运算符,只是给图像增加了一点对比度。结果是直方图本身被展开得更多,从而更好地覆盖整个可能的颜色范围。从处理前后的直方图中还可以看到,由于拉伸方式的缘故,颜色最终会在各个“bin”之间留下空隙和洞。具体来说,它会创建一个“直方图”,把所有颜色放入“bin”中;这些“分箱”的颜色随后作为整体被修改,于是图像颜色被成组地聚到一起。这并不是处理图像颜色的特别好方法。这个运算符是盲目工作的,并不了解图像内容或颜色分布。因此它离不开用户控制,因为它很容易让应用到的任何图像变得更糟,而不是更好。本节会看一些图像处理运算符,它们会把图像直方图纳入决策过程,然后根据分析结果修改图像,以增强图像颜色分布的某些质量。由于这些运算符使用了正在处理的图像中的实际信息,通常只需用户做较少检查,就可以更全局地用于许多图像。这类运算符包括自动线性“level”类型运算符,例如“[-normalize](https://imagemagick.org/command-line-options/#normalize)”、“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”和“[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)”,也包括非线性的“[-equalize](https://imagemagick.org/command-line-options/#equalize)”,以及一些将来可能纳入 ImageMagick 的其他方法,例如 Fred Weinhaus's 脚本“redist”。

直方图拉伸

最简单的技术就像前面的例子一样,只是把图像的直方图向外拉伸,以改善颜色范围。不过它们不会为 Level 操作盲目选择 黑点白点,而是根据图像的直方图来选择这些点。基本做法是从两端向内统计每个直方图 bin 中的颜色值数量,直到达到某个阈值。随后这些点会作为直方图(level)拉伸的 黑点白点需要图示 基本上,直方图计数给出了拉伸会强制变为黑色和白色的灰阶值。这意味着,图像中落在从纯黑到所选 black-point bin 对应灰阶这一范围内的所有像素,最终都会变成纯黑。同样,图像中落在从纯白到 white-point bin 对应灰阶这一范围内的像素,最终都会变成纯白。而这些点之外的像素会被拉伸到可能的颜色取值范围之外,因此会被直接限制到范围边界。也就是说,这些像素在转换为极端的纯黑或纯白颜色值时会被“裁剪”或“烧死”。因此,如果用于选择 黑点白点 的“阈值”限制设置得过高,图像中就会出现大量黑色和白色区域,结果直方图在两端的 bin 中会有很大的计数(很高的柱)。严重烧死示例 -- 中国象棋图像? “stretch”运算符摘要... -contrast-stretch 和 -linear-stretch 都会生成直方图(使用 1024 个 bin)来确定要拉伸的颜色位置,因此并不“精确”。另一个区别在于“零”的处理方式,以及 -linear-stretch 实际上会执行 -level 操作来完成拉伸,而 -contrast-stretch 使用直方图 bin 值进行颜色替换式拉伸(这会引入 1024 级量子舍入效应)。-normalize 在内部使用 -contrast-stretch。数学上完美的归一化拉伸运算符是 -auto-level。虽然完美的“仅白点”或“仅黑点”版本是可能的,但目前尚未实现。

自动级别 - 完美的数学归一化

[-auto-level](https://imagemagick.org/command-line-options/#auto-level)”找到图像中的最大和最小值,用于将图像拉伸到完整的量子范围。在任何时候,值都不会因直方图超出值范围而被“剪裁”或“烧毁”。 “[-channel](https://imagemagick.org/command-line-options/#channel)”设置将确定所有通道是否“同步”同等拉伸(使用所有通道的最大值和最小值)或单独拉伸(每个单独的通道作为单独的实体)。此时,全透明像素的隐藏颜色也用于确定级别,这在涉及透明度时可能会导致一些问题。这被视为一个错误。

FUTURE: We actually need three modes of operation...
  synced color channels with 'alpha' (and 'read') masking.
  synced channels (as defined by channel)       (current default)
  individual separate channels   (currently if -channel is set by user)

它是纯数学直方图拉伸,就像手动的 Level Operator 一样。也就是说,最小值将调整为零,最大值将调整至量子范围,并使用线性方程来调整图像中的所有其他值。它不使用其他方法可能用于确定要使用的级别或其他直方图调整的“直方图箱”或任何其他“值分组”。

归一化

[-normalize](https://imagemagick.org/command-line-options/#normalize)”运算符是这三个运算符中最简单的。它只是扩展灰度直方图,使其占据灰度值的完整动态范围,同时在直方图的低(黑色)端剪切或燃烧 2%,在高(白色)端剪切或烧毁 1%。也就是说,图像中 2% 的最深灰色将变成黑色,1% 的最浅灰色将变成白色。这对于大多数图像来说并不是一个很大的损失,总体结果是图像的对比度(强度范围)将自动最大化。 _这里需要一个理想化的图表!__使用中国象棋的示例?_这里我们创建一个灰度渐变,并将其扩展到完整的黑白范围。

  magick -size 150x100 gradient:gray70-gray30 gray_range.jpg
  magick gray_range.jpg  -normalize  normalize_gray.jpg

[IM 输出] [IM 输出]

| _出于 JPEG 颜色不准确(有关更多详细信息,请参阅JPEG 颜色失真)和扫描图像噪声等实际原因,“[-normalize](https://imagemagick.org/command-line-options/#normalize)”不会只扩展到最亮和最暗的颜色,而是会略微越过这些值。也就是说,它等价于一个“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”,取值为“2%,99%”(见下文)。

这意味着如果最高和最低颜色值非常接近,“[-normalize](https://imagemagick.org/command-line-options/#normalize)”将失败,不会采取任何操作。

如果你确实想将最亮和最暗的颜色值扩展到极端,请改用“[-auto-level](https://imagemagick.org/command-line-options/#auto-level)”。_
---|---
在 IM 版本 6.2.5-5 之前,“[-normalize](https://imagemagick.org/command-line-options/#normalize)”纯粹用作灰度运算符。也就是说,每个红色、绿色、蓝色和 alpha 通道根据“[-channel](https://imagemagick.org/command-line-options/#channel)”设置彼此独立地扩展。从 IM 版本 6.2.5-5 开始,如果仅给出默认的“[+channel](https://imagemagick.org/command-line-options/#channel)”设置,则“[-normalize](https://imagemagick.org/command-line-options/#normalize)”会将所有颜色通道捆绑在一起,并按相同的量对它们进行归一化。这可确保图像内的像素颜色不会发生偏移。但是,这也意味着你可能无法获得纯白色或黑色像素。例如,在这里我们向归一化测试图像添加了一些额外的颜色(蓝色到海军蓝渐变)。

  magick -size 100x100 gradient:gray70-gray30 \
          -size  50x100 gradient:blue-navy  +append  color_range.jpg
  magick color_range.jpg -normalize  normalize.jpg

[IM 输出] [IM 输出]

从上一个示例中可以看出,对于彩色图像,“[-normalize](https://imagemagick.org/command-line-options/#normalize)”将所有通道一起最大化,因此一个通道具有零值,而另一个通道具有最大值。也就是说,没有生成黑色像素,因为所有添加的蓝色在“红色”和“绿色”通道中已经包含“零”值。因此图像的下限没有扩大。 如果你想要旧的“[-normalize](https://imagemagick.org/command-line-options/#normalize)”行为(IM v6.2.5-5 之前),则需要指定任何非默认“[-channel](https://imagemagick.org/command-line-options/#channel)”设置。对于不包含 Alpha(或遮罩)通道的图像,你可以仅使用“all”通道设置。 |

  magick color_range.jpg -channel all  -normalize   normalize_all.jpg

[IM 输出]
或者,你可以使用“[-separate](https://imagemagick.org/command-line-options/#separate)”运算符将每个通道归一化为单独的图像(从 IM v6.2.9-2 开始),然后再次将它们“[-combine](https://imagemagick.org/command-line-options/#combine)”恢复为单个图像。 |

  magick color_range.jpg -separate -normalize -combine normalize_sep.jpg

[IM 输出]
在最后两个示例中,我们看到图像的灰度区域变黄,因为“red”和“green”通道变亮,而“blue”通道仅稍微变暗。这就引出了一个重要的观点

归一化和其他直方图运算符实际上是灰度运算符,
与彩色图像一起使用时需要小心。

事实上,“[-normalize](https://imagemagick.org/command-line-options/#normalize)”只是更通用的“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”的子集,默认值为黑点 2%,白点 = 1%。那么“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”是什么?

对比拉伸

[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”运算符(添加了 IM v6.2.6)与“[-normalize](https://imagemagick.org/command-line-options/#normalize)”类似,不同之处在于它允许用户指定将被剪裁或烧入的像素数量。也就是说,它为你提供了对用于直方图拉伸的“black-point”和“white-point”选择的一些控制。因此,用户指定图像中最深灰色变为黑色的计数(或百分比计数)以及最浅灰色变为白色的计数。例如,这将用极端颜色(白色和黑色)替换顶部和底部 15% 的颜色,并适当拉伸其余 70% 的颜色。最终的结果是尽量提高图像的整体对比度。

  magick gray_range.jpg  -contrast-stretch 15%  stretch_gray.jpg

[IM 输出] [IM 输出]

你还可以轻松地看到上述渐变顶部和底部的“加深”和“剪辑”效果,因为这些灰色颜色远远超出了颜色范围的限制。 在这里,我故意“烧掉”了 90% 的深灰色,只留下 10% 的最亮像素在图像顶部拉伸成紧密的线性渐变。 |

  magick gray_range.jpg  -contrast-stretch 90%x0%  stretch_black.jpg

[IM 输出]
这对于找到图像中最亮的“N”个像素非常有用,因为它们将是唯一没有“烧毁”到零值的像素。 (更好的方法是使用“[-threshold-black](https://imagemagick.org/command-line-options/#threshold-black)”)“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”的一个重要方面是_black-point_ 和_white-point_ 阈值计数使用零。在本例中,“-contast-stretch 0”将定位图像直方图中的最小和最大箱。由于计数实际上是从这些容器开始的,因此结果只是将最小和最大容器拉伸为全黑和全白。这将导致对比度拉伸具有最小或可能为零的剪切量,并且这些“容器”中的所有值都变为 0 和最大值。


| | | |
建设中

线性拉伸

在许多方面,“[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)”与之前的“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”运算符非常相似。这两个函数都可以将黑点和白点参数作为原始计数或所涉及像素总数的百分比。然而,有几个重要的区别。其中一个差异与默认黑点和白点的计算方式有关。与“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”。如果仅提供一个值(黑点),则白点将是相同的值。因此,“-contrast-stretch 1”相当于“-contrast-stretch 1x1”,“-contrast-stretch 1%”相当于“-contrast-stretch 1x1%"”。然而,对于“[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)”,如果仅提供一个值(黑点),则白点将是补值。也就是说,如果将黑点指定为原始计数,则白点将是图像中的总像素减去黑点计数。同样,如果将黑点指定为百分比计数,则白点将为 100% 减去黑点百分比计数。因此“-linear-stretch 1%”将等同于“-linear-stretch 1x99%”。第二个区别与计数开始的位置有关。考虑一个从灰度级 0 到灰度级 255 的 256 个箱(某些“箱”可能具有零计数)的直方图。在“[-contrast-stretch](https://imagemagick.org/command-line-options/#contrast-stretch)”中,计数从零开始,图像中填充的最低(最小)和最高(最大)箱(可能位于也可能不是直方图中的箱 0 或箱 255)。因此,10% 的黑点将累积最小 bin 之后的所有 bin 的计数,直到达到 10% 并从该灰度级拉伸黑色侧。因此,直方图黑色一侧的烧毁量最终将是之前较暗“箱”中已发现的烧毁量的 10%。从直方图的亮面开始计数也是如此。对于“[-linear-stretch](https://imagemagick.org/command-line-options/#linear-stretch)”,计数从直方图的末端开始,即从 bin 0 和 bin 255 开始。因此,暗侧的烧屏量将始终为黑点值,亮侧的烧屏量将始终为白点值。作为示例,我们采用 100 像素的渐变并查看其直方图。 |

  magick -size 1x100 gradient: \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

正如预期的那样,每个 bin 均等地填充有单个像素,产生的计数为 1。(要查看完整列表,请单击上面的输出文本图像)。现在让我们在使用“-contrast-stretch 10x10%”后做同样的事情

  magick -size 1x100 gradient:   -contrast-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

现在是“-linear-stretch 10x10%”。

  magick -size 1x100 gradient:   -linear-stretch 10x10%  \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

因此,我们确认对于“-contrast-stretch 10x10%”,我们在每一端得到 11 个像素。也就是说,相当于末尾 bin 中的计数加上图像像素的 10%,即等于 10 个像素。所以 10+1=11 个像素被烧毁。另一方面,在“-linear-stretch”中,末端箱最终仅包含 10 个像素或图像的 10%。上述差异的一个后果是,如果最低和/或最高填充的 bin 不是 0 和 255 处的末端 bin,则“-contrast-stretch 0x0”可能会更改图像。在这种情况下,图像将在与这些 bin 对应的灰度级之间拉伸。另一方面,“-linear-stretch 0x0”永远不会改变图像。例如,我们采用渐变并在两端将其灰度压缩 10%。也就是说,我们将黑点向上移动 10% 至灰度级 26,将白点向下移动 10% 至灰度级 230。

  magick -size 1x100 gradient:   +level 10x90%  \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

现在,让我们将“-contrast-stretch 0x0”应用于上面的去对比度渐变

  magick -size 1x100 gradient: -level 10x90%  -contrast-stretch 0x0  \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

现在是“-linear-stretch 0x0

  magick -size 1x100 gradient: -level 10x90%  -linear-stretch 10x10% \
          -depth 8 -format "%c" histogram:info:

[IM 文本]

所以我们看到原始图像的直方图没有跨越 0 到 255 的完整动态范围。它只在灰度级 26 到 230 之间。但是在应用“-contrast-stretch 0x0”之后,它被拉伸到完整动态范围。另一方面,“-linear-stretch 0x0”对生成的直方图没有变化。第三个区别是“-contrast-stretch”是通道敏感的,而“-linear-stretch”不是。这意味着使用“-contrast-stretch”可以更改任何一个或多个通道,而不会影响其他通道。因此,如果未指定通道,则所有通道的整体直方图将用于以相同的方式修改所有通道,从而不会产生颜色偏移。但是,如果指定“-channel RGB”,则每个通道将单独拉伸,结果将取决于每个通道中的结束 bin。如果它们不同,则结果图像中各个通道之间将产生颜色偏移。对于“-linear-stretch”,所有通道都将以通用方式进行处理,从而确保不会产生通道相对于彼此的颜色偏移。因此,让我们获取真实图像的 verbose identify 信息和直方图。

  magick port.png  -verbose -identify +verbose  histogram:port_hist.gif

[IM 文本] | [IM 输出]
[IM 输出]
---|---

我们看到上图中没有一个通道跨越整个动态范围。另请注意,每个通道都跨越独特的不同值范围。现在让我们应用“-contrast-stretch 1x1%”而不使用“[-channel](https://imagemagick.org/command-line-options/#channel)”设置。

  magick port.png -contrast-stretch 1x1% \
          -write histogram:port_cs1_hist.gif   port_cs1.png

[IM 输出] [IM 输出]

在上面的结果中,图像在所有通道上一致拉伸。因此,通道之间不存在颜色变化。现在让我们用“-channel RGB”做同样的事情。

  magick port.png  -channel RGB  -contrast-stretch 1x1% \
          -write histogram:port_cs1rgb_hist.gif    port_cs1rgb.png

[IM 输出] [IM 输出]

在上面的结果中,因为我们设置了“-channel RGB”,而不是使用默认通道设置,所以每个通道的图像拉伸不同。这会导致通道之间出现颜色偏移。现在让我们应用“-linear-stretch”而不使用“-channel”设置。

  magick port.png   -linear-stretch 1x1% \
          -write histogram:port_ls1_hist.gif \
          port_ls1.png

[IM 输出] [IM 输出]

在上面的结果中,图像在所有通道上一致拉伸。因此通道之间不存在色移。现在让我们做同样的事情,但是使用“-channel RGB”。

  magick port.png  -channel RGB  -linear-stretch 1x1% \
          -write histogram:port_ls1rgb_hist.gif    port_ls1rgb.png

[IM 输出] [IM 输出]

在上面的“-linear-stretch”结果中,图像在所有通道上一致拉伸,并且“-channel RGB”被忽略。因此,通道之间不存在色移,并且结果与上面没有“-channel RGB”的结果相同。

直方图重新分布

直方图再分布是一种非线性技术,它再分布直方图中的箱以实现某种特定的形状。两种最常见的形状是均匀分布(平坦)和高斯分布(钟形),尽管也使用了双曲分布和瑞利分布等其他类型的分布。

均衡化 - 均匀直方图再分布

对于均匀分布的情况,直方图箱被移动、间隔和组合,使得直方图平均在整个范围内具有平坦或恒定的高度。这称为直方图均衡化。 IM 函数“[-equalize](https://imagemagick.org/command-line-options/#equalize)”执行此操作。不幸的是,它单独对每个通道进行操作,而不是对所有通道应用相同的操作。因此,当应用于 RGB 色彩空间时,颜色偏移是可能的。下面是使用 IM 函数 -equalize 进行直方图均衡化的示例。请注意,由于各通道独立均衡化,色彩平衡会发生偏移。

  magick zelda.png  -write histogram:zelda_hist.gif \
          -equalize  -write histogram:zelda_equal_hist.gif \
          zelda_equal.png

[IM 输出] [IM 输出]
[IM 输出] [IM 输出]

你可能会注意到,直方图看起来不太均匀。但是,如果我们将结果图像转换为灰度并显示其直方图,与原始图像的灰度直方图相比,其直方图看起来更均匀一些

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_equal.png  -colorspace gray \
          histogram:zelda_equal_ghist.gif

[IM 输出] [IM 输出]

重新分配箱的另一种方法是使用变换查找表,该表是根据每个通道的单独累积直方图和所需的集成分布曲线生成的。如果不希望通道之间出现任何颜色偏移,则可以使用图像所有通道的组合直方图。一种近似方法是将图像转换为灰度后使用其直方图。 Fred Weinhaus 开发了一个名为“redist”的脚本来执行此操作。它将图像的直方图再分布为均匀分布,同时对所有颜色通道均等地应用相同的变化。

  redist -s uniform zelda.png  zelda_uniform.png

  magick zelda_uniform.png   histogram:zelda_uniform_hist.gif

[IM 输出] [IM 输出]
[IM 输出] [IM 输出]

请注意结果与 IM 内置“[-equalize](https://imagemagick.org/command-line-options/#equalize)”运算符的不同。具体来说,所有颜色都被保留,没有你之前看到的颜色变化。该脚本所做的是处理灰度直方图,然后将其应用于所有颜色通道,以便所有颜色保持在一起。为了与 IM“[-equalize](https://imagemagick.org/command-line-options/#equalize)”直方图进行比较,我们在这里也显示灰度直方图结果。请注意,再分布的直方图看起来比 IM 均衡化后的直方图更加平坦(平坦或均匀)。

  magick zelda.png  -colorspace gray   histogram:zelda_ghist.gif

  magick zelda_uniform.png  -colorspace gray \
          histogram:zelda_uniform_ghist.gif

[IM 输出] [IM 输出]

FUTURE:添加其他色彩空间中的均衡化示例!即 HSL、HSB 和 CMYK 色彩空间中的灰度通道。

高斯再分布

均衡化直方图并不是改变图像直方图分布的唯一方法。实际上,除了在计算机视觉应用中之外,它通常不是很有用。这是同一张图像,但进行了变换,因此其直方图具有高斯(钟形)分布。这里使用的值是 60% 的灰色平均值,并在该平均值的两侧进行 60 sigma 滚降。

  redist -s gaussian 60,60,60  zelda.png \
         zelda_gaussian.png

  magick zelda_gaussian.png -colorspace gray \
          histogram:zelda_gaussian_ghist.gif

[IM 输出] [IM 输出]
[IM 输出] [IM 输出]

从生成的灰度直方图中,你可以看到图像已被修改,因此其颜色遵循高斯钟形曲线类型的分布。对于照片来说,这会产生更“自然”的效果。图像不仅会进行对比度优化,还会调整亮度,因此图像中的大多数像素的灰度亮度约为 60%。

直方图重新分布方法

那么这种直接直方图调整是如何工作的呢?基本上它计算当前图像的直方图和所需分布的直方图。然后,它计算出需要如何更改每个“箱”的灰度值,以便箱中的计数最好遵循所需的分布。一些 bin 可能会向暗部移动,而另一些 bin 可能会向亮部移动。这实际上是一个相当复杂的过程,所以让我们一步一步来。
首先,我们需要从ImageMagick中获取实际的直方图数据,而不是直方图的图形图像。请注意,数据来自所有颜色值,组合成灰度。这样做是为了将所有通道分配在一起,并调整图像整体亮度以遵循所需的曲线。

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# collect the histogram data.
           { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   print bin[i]+0;
                 }
               } ' > zelda_hist_data.txt

  # get the maximum count for any one histogram 'bin'
  max_count=`sort -n zelda_hist_data.txt | tail -n 1`

  # magick histogram into a profile graph of the data
  echo "P2 256 1 $max_count" | cat - zelda_hist_data.txt |\
    im_profile -s - zelda_hist_graph.gif

[IM 输出] [IM 输出]

为了收集数据,我从直方图图像中获取“注释”元数据,IM 正是为此目的而包含该数据。然后清理数据,只留下原始数字(使用名为“tr”的程序,“翻译”的缩写)。然后将该原始数据提供给另一个名为“awk”的实用程序,该程序用于收集每个箱的实际直方图计数。为了查看结果,我还将直方图计数处理为渐变图像(通过 NetPBM,PGM 文本灰度 图像文件格式,并使用“[im_profile](../static/img/scripts/im_profile)”脚本将其显示为折线图。本质上,这只是生成直方图图像的不同方式,不过这次是直接从数值数据文件生成。既然我们在文本文件中拥有直方图数据,我们还需要“希望再分布后的数据所要匹配的那个函数”的直方图。在本例中,它是平均值为 153(60% 灰度)且西格玛宽度为 60 的高斯分布。这两个值均以直方图“bins”的 256 范围表示。

  awk '# AWK to generate gaussian distribution graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  print int(65535*expo^(-(((i-mean)/256)^2)*fact));
                }
              }' /dev/null  > gaussian_hist_data.txt

   # magick gaussian data into a profile graph
   echo "P2 256 1 65535" | cat - gaussian_hist_data.txt |\
     im_profile -s -b - gaussian_hist_graph.gif

[IM 输出]

上面的直方图很有趣,反映了图像的原始直方图分布和直方图的期望状态。但出于转换目的,这种形式的直方图虽然有利于我们理解,但对于我们的目的来说并不是很有用。实际上,我们真正需要的是累积直方图。这些直方图与普通直方图非常相似,不同之处在于直方图中的每个“bin”都是其“bin”加上之前的所有“bin”的计数,从 0 开始。也就是说,每个“bin”是所有较暗“bin”的“累加”或计数。这些实际上更容易直接从原始图像生成。因此,让我们重复该过程,但计算并保存“累积”计数。

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# Collect the cumulative histogram for an image
               { bin[$2] += $1; }
           END { for ( i=0; i<256; i++ ) {
                   cum += bin[i];
                   print cum;
                 }
               } ' > zelda_cumhist_data.txt

  total_count=`tail -n 1 zelda_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - zelda_cumhist_data.txt |\
    im_profile -s - zelda_cumhist_graph.gif

  awk '# AWK to generate gaussian distribution cumulative graph
        BEGIN { mean = 153;   sigma = 60;
                fact = 1/(2*(sigma/256)^2);
                expo = exp(1);
                for ( i=0; i<256; i++ ) {
                  gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  total += gas[i]
                }
                for ( i=0; i<256; i++ ) {
                  cum += gas[i];
                  print int(65535*cum/total);
                }
              }' /dev/null  > gaussian_cumhist_data.txt

  total_count=`tail -n 1 gaussian_cumhist_data.txt`
  echo "P2 256 1 $total_count" | cat - gaussian_cumhist_data.txt |\
    im_profile -s -b - gaussian_cumhist_graph.gif

[IM 输出]
图像累积
直方图| [IM 输出]
高斯累积
直方图
---|---

现在我们需要做的就是将图像的累积直方图转换为高斯累积直方图。为此,输入图像中的每个灰度值用于查找其“归一化”累积值。然后将其映射到高斯分布中的相同累积值,再找到其对应的灰度值。该图应该使映射过程更加清晰......

[图]

以下命令查找每个可能的 8 位颜色值,以生成颜色查找表或 CLUT。然后可以使用该特殊图像将原始图像中的颜色值映射到再分布图像直方图所需的新值。

  # Generate a CLUT to Redistribute the Histogram
  paste  zelda_cumhist_data.txt   gaussian_cumhist_data.txt |\
    awk '# AWK to generate gaussian distribution graph
              { bin[NR] = $1;   gas[NR] = $2;  }
          END { k=0;  # number of pixels less than this value
                print "P2 256 1 65535";
                for ( j=0; j<256; j++ ) {
                  while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                    k++;
                  }
                  print 65535*k/255;
                }
              }' |\
      magick pgm:- gaussian_clut.png

  magick zelda.png   gaussian_clut.png -clut   zelda_redist.png

[IM 输出] [IM 输出]
[IM 输出] [IM 输出]

正如你所看到的,转换图像的直方图以尝试遵循特定的分布函数(例如高斯钟形曲线)是一个相当复杂且高度数值化的过程。在这里,这一切都在一个相当长且复杂的命令中......

  magick zelda.png -colorspace gray \
         -depth 8 -format "%c" histogram:info:- |\
    tr -cs '0-9\012' ' ' |\
      awk '# AWK to generate gaussian distribution graph
            { # just read in image histogram into a 'bin' table
                  bin[$2] += $1;
                }
            END { # Generate Gaussian Histogram
                  mean = 153;   sigma = 60;
                  fact = 1/(2*(sigma/256)^2);
                  expo = exp(1);
                  for ( i=0; i<256; i++ ) {
                    gas[i] = expo^(-(((i-mean)/256)^2)*fact);
                  }
                  # Convert normal histograms to cumulative histograms
                  for ( i=0; i<256; i++ ) {
                    gas[i] += gas[i-1];
                    bin[i] += bin[i-1];
                  }
                 # Generate Redistributed Histogram
                 k=0;  # number of pixels less than this value
                 print "P2 256 1 65535";
                 for ( j=0; j<256; j++ ) {
                   while ( k<255 &&
                            gas[k]/gas[255] <= bin[j]/bin[255] ) {
                     k++;
                   }
                   print 65535*k/255;
                 }
                }' |\
        magick zelda.png   pgm:-  -clut   zelda_gaussian_redist.png

[IM 输出] [IM 输出]

最后对上述技术说几句。

  • 使用“awk”进行计算以加速 Fred Weinhaus 的“[redist](http://www.fmwconcepts.com/imagemagick/redist/)”脚本是由 Anthony Thyssen 建议和贡献的。
  • 要应用上述再分布技术来生成“均匀”或“均衡化”分布,函数直方图只是一个常数。这反过来会产生一个积分分布,即简单的公式 y = x,或者简单的对角直线。应用相同的转换技术会产生与输入图像的累积直方图相同的 CLUT 图像。换句话说,为了直方图均衡化,你可以简单地将图像的累积直方图转换为 CLUT 并将其直接应用于图像。
  • 大多数图像处理包(包括此时的 ImageMagick)将变换公式直接应用于图像本身的值,而不是生成中间 CLUT。然而,由于直方图和累积直方图的大小有限(通常为 256 个“箱”),因此可能会导致严重错误,因为在此过程中图像颜色值可能会被四舍五入。然而,使用 ImageMagick,我们生成一个中间 CLUT(包含相同的舍入误差),然后使用值的线性插值通过准备好的 CLUT 来改变原始的未舍入图像值。由于这种插值,新图像的颜色值更加准确,因为它们在处理过程中没有被四舍五入或“分箱化”。

上述内容有望最终内置到 ImageMagick 中。同时,Fred Weinhaus 的“redist”脚本可用于执行该任务。你可能还对 Fred 的“retinex”脚本感兴趣,该脚本尝试在图像的局部区域中对图像进行类似的自动增强,而不是像该技术那样进行全局增强。


DIY 色阶调整

数学线性直方图调整

上面显示的色阶调整的各种基本形式对图像的颜色进行线性调整。这些变化也可以在数学上应用。例如,通过将图像与特定颜色相乘,我们将所有纯白色区域设置为该颜色。因此,让我们读取我们的图像,创建一个包含我们想要的颜色的图像,然后使用 IM 自由格式“[-fx](https://imagemagick.org/command-line-options/#fx)”或 DIY 运算符 将原始图像与该颜色相乘。

  magick test.png  -size 1x1 xc:Yellow \
          -fx 'u*v.p{0,0}'    fx_linear_white.png

[IM 输出] [IM 输出]

通过使用“[-fx](https://imagemagick.org/command-line-options/#fx)”从第二个“v”图像中读取颜色,可以轻松更改颜色,而无需将颜色手动转换为 RGB 值以供数学使用。如果你使用的是“[Gimp](http://www.gimp.org/)”和“[Photoshop](http://www.adobe.com/products/photoshopfamily.html)”等精美的图形图像处理包,则上述操作将通过调整图像颜色直方图“曲线”来应用于图像。 [IM 输出] 例如,右侧是“[gnuplot](http://www.gnuplot.info/)”生成的数学公式图(请参阅脚本“[**im_histogram**](../static/img/scripts/im_histogram)”),显示三个 RGB 通道之一所发生的情况。原始颜色(绿线)线性重新映射为较深的颜色(红线)。线性着色黑色也非常简单。例如,要将“black”线性映射为类似金色的颜色“rgb(204,153,51)”(同时将“white”保留为“white”),需要一个数学公式,例如...

          result = 1-(1-color)*(1-intensity)

此公式对颜色求反,将图像与所需的求反颜色相乘,然后再次对图像求反。结果是灰度级的黑色一侧着色,而白色保持不变。

  magick test.png  -size 1x1 xc:'rgb(204,153,51)'  \
          -fx '1-(1-v.p{0,0})*(1-u)'   fx_linear_black.png

[IM 输出] [IM 输出] [IM 输出]

上面还显示了重映射公式的“gnuplot”直方图,供你参考。使用稍微复杂的公式,你可以将灰度的“black”和“white”端线性替换为特定颜色。

  magick test.png  -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,0}*u+v.p{0,1}*(1-u)'   fx_linear_color.png

[IM 输出] [IM 输出] [IM 输出]

上面的“-size 1x2 gradient:color1-color2”仅用于生成二色像素图像,供“[-fx](https://imagemagick.org/command-line-options/#fx)”公式参考。第一种颜色替换白色,第二种颜色替换黑色,而所有其他颜色都在白色和黑色之间插入。正如典型的灰度运算符一样,每个 RGB 通道都被视为单独的灰度通道,尽管每个通道的线性插值不同。顺便说一句,这与 按颜色调整色阶 运算符“[+level-colors](https://imagemagick.org/command-line-options/#level-colors)”完全等效,但是与“[+level-colors](https://imagemagick.org/command-line-options/#colors)”不同,要使用的颜色当然可以来自任何图像源,而不仅仅是作为参数提供的颜色名称。然而,甚至直接使用颜色名称也是可能的。 |

  magick test.png   -fx "yellow*u+green*(1-u)"  fx_linear.png

[IM 输出]

数学非线性直方图调整

虽然线性颜色调整很重要,并且可以使用更快的方法,但在许多情况下,线性“级别”调整并不是我们想要的,这就是“[-fx](https://imagemagick.org/command-line-options/#fx)DIY Operator 变得更有用的地方。线性调整的另一种公式是“-fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u'”,其优点是“u”可以用单个任意函数“f(u)”代替,以产生非线性颜色变化。这可以让你做更多有趣的事情。例如,如果在上一个示例中你想将所有颜色推向“black”一侧,从而导致图像的颜色更加“firebrick”,该怎么办?

  magick test.png -size 1x2  gradient:gold-firebrick \
          -fx 'v.p{0,1}+(v.p{0,0}-v.p{0,1})*u^4'  fx_non-linear.png

[IM 输出] [IM 输出] [IM 输出]

在一个更实际的示例中,Adelmo Gomes 需要对他正在开发的自动天气图重新着色 脚本进行颜色调整。在本例中,他希望将图像的纯黑色部分着色为 0.25 的蓝色,但保留其余灰度,尤其是图像的白色和中间色调灰色。只有蓝色需要这样的调整,他目前正在图像编辑器中手动进行调整。例如,你可以使用“u^2”等二次公式将直方图的黑色端着色为“.25”蓝色。只需要修改蓝色通道,因此将值直接插入到公式中。

  magick test.png  -channel B  -fx '.25+(1-.25)*u^2'  fx_quadratic.png

[IM 输出] [IM 输出] [IM 输出]

然而,虽然这产生了合理的结果,但它确实使中间色调的灰色稍微变暗,产生病态的灰黄色。为了避免这种情况,可以使用“指数”函数来代替,以更好地控制着色过程。

  magick test.png  -channel B  -fx '.3*exp(-u*4.9)+u'  fx_expotential.png

[IM 输出] [IM 输出] [IM 输出]

该图再次显示了如何修改蓝色通道以赋予黑色独特的深蓝色色调。第二个值(“4.9”)是返回到线性“+u”图的衰减。该值越小,下降越慢,调整变得越线性。值越大,“下降”越剧烈。该值可能需要针对不同的颜色值进行调整,因此这对于一般黑色着色来说不是一个好的通用公式,但对于天气图着色来说是完美的。一般来说,如果你可以用数学方式表达你想要的颜色调整,则可以使用“[-fx](https://imagemagick.org/command-line-options/#fx)”运算符来实现你想要的结果。

“曲线”调整

[图表] 通常在图形照片编辑器中,你会看到一个直方图“曲线”图表,如左侧所示。然后,用户可以通过移动四个(或更多)控制点来编辑“曲线”,直方图调整函数会跟随这些点。控制点通常表示第一个灰阶值在调整后会变成第二个灰阶值。因此,像 0.0,0.2 这样的点基本上表示 0% 灰度(黑色)在调整后应成为 20% 灰阶。现在 IM 不允许你直接指定“控制点”来生成“曲线”调整,它需要的是生成该“曲线”的数学公式。好在有一些程序可以从控制点生成曲线公式,包括“[gnuplot](http://www.go.dlr.de/pdinfo_dv/gnuplot.html)”、“[fudgit](http://www.go.dlr.de/pdinfo_dv/fudgit.html)”、“mathematica”和“[matlab](http://www.mathworks.com/)”,以及更多数学软件包。下面是一种方法,使用大多数 Linux 发行版以及 Windows 上都可以安装的标准附加软件包“gnuplot”,从四个控制点生成公式。

  ( echo "0.0 0.2";  echo "1.0 0.9"; \
    echo "0.2 0.8";  echo "0.7 0.5"; )   > fx_control.txt

  ( echo 'f(x) = a*x**3 + b*x**2 + c*x + d'; \
    echo 'fit f(x) "fx_control.txt" via a, b, c, d'; \
    echo 'print a,"*u^3 + ",b,"*u^2 + ",c,"*u + ",d'; \
  ) | gnuplot 2>&1 | tail -1             > fx_funct.txt

| [数据]

控制点 [Gnuplot]
[Gnuplot]
Gnuplot 拟合 FX 函数

| _请注意,曲线拟合所需的参数数量(上面的“a”到“d”)必须等于你提供的控制点的数量。因此,如果你想要五个控制点,则需要在函数中包含另一个“e”项。

如果你的直方图曲线经过固定控制点 0,01,1,你实际上只需要两个参数,因为“d”将等于“0”,“c”将等于“1-a-b”。

_
---|---
上述内容的更详细使用指南专门针对 Windows 用户,但也适用于 Linux 用户,已发布在 StackOverflow:在 Windows 上使用 Gnuplot 进行 IM 曲线。正如你从上面生成的额外“gnuplot”图像中看到的,生成的函数完美地拟合了控制点。此外,由于它生成了“-fx”样式公式,因此可以按原样用作 IM 参数。 例如... |

  magick test.png    -fx "`cat fx_funct.txt`"     fx_funct_curve.png

[IM 输出]
为了让用户更容易把控制点转换成直方图调整函数,我创建了一个名为“[**im_fx_curves**](../static/img/scripts/im_fx_curves)”的 shell 脚本来调用“gnuplot”,并根据给定控制点输出更好看的多项式方程。Gabe Schaffer 还提供了一个 perl 版本,使用下载的“Math::Polynomial”库模块,名为“[**im_fx_curves.pl**](../static/img/scripts/im_fx_curves.pl)”,用于完成同样的工作。可以使用任一脚本。例如,这是一条有 5 个控制点的不同曲线......

    im_fx_curves  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > fx_curve.txt

[Gnuplot] | | | [Gnuplot]

然而 FX 函数非常慢。但从 IM 6.4.8-9 开始,你现在可以直接将发现的拟合多项式表达式的系数直接传递到 Polynomial 函数方法 中。你可以使用“[**im_fx_curves**](../static/img/scripts/im_fx_curves)”和特殊的“-c”选项生成逗号分隔的系数列表...

    im_fx_curves -c  0,0.2  0.3,0.7  0.6,0.5  0.8,0.8  1,0.6  > coefficients.txt

[Gnuplot] | | | [Gnuplot]

例如,让我们将这些曲线应用到我们的 测试图像... |

  magick test.png  -function Polynomial `cat coefficients.txt`  test_curves.png

[IM 输出]
高级 “Aqua”效果 示例中详细介绍了此方法的更实际示例。 IM 论坛讨论任意色调再现曲线 中介绍了另一种生成“曲线”的方法。


给图像着色

均匀着色图像

通常,通过将图像与颜色混合一定量来实现图像着色。这可以使用评估运算符混合图像 技术来完成,但这些技术使用起来并不简单。幸运的是,我们可以通过使用“[-colorize](https://imagemagick.org/command-line-options/#colorize)”图像运算符来使用更简单的方法将均匀的颜色渗透到图像中。该运算符将当前的“[-fill](https://imagemagick.org/command-line-options/#fill)”颜色混合到当前图像序列中的所有图像中。保留原始图像的 alpha 通道,仅修改颜色通道。例如,使图像变亮(灰度或其他),我们使用“[-colorize](https://imagemagick.org/command-line-options/#colorize)”将一定量的白色混合到图像中,使其更亮,而不会使图像完全饱和。

  magick test.png  -fill white -colorize 50%  colorize_lighten.png

[IM 输出] [IM 输出]

同样,我们可以使用“black”填充颜色来使图像变暗。

  magick test.png  -fill black -colorize 50%  colorize_darken.png

[IM 输出] [IM 输出]

要将图像的两端灰化为中间色调,你可以使用特定的灰色填充颜色。颜色“gray50”是 RGB 色谱的确切中间颜色。

  magick test.png  -fill gray50 -colorize 40%  colorize_grayer.png

[IM 输出] [IM 输出]

这也经常被用作“去对比度”的方法,例如反向色阶调整运算符 提供的方法,尽管控制较少。 “[-colorize](https://imagemagick.org/command-line-options/#colorize)”运算符还允许你分别指定三个颜色通道中每个通道的溶解百分比。这对于以特殊方式线性变暗(或变亮)图像非常有用。 在 IM v6.7.9 之前,“[-colorize](https://imagemagick.org/command-line-options/#colorize)”运算符根本不修改 alpha 通道。从该版本开始,如你在上面看到的,它现在对所有像素(包括完全透明的像素)进行统一着色。
[-colorize](https://imagemagick.org/command-line-options/#colorize)”运算符的一种常见用途是简单地替换现有图像中的所有颜色(对“100%”着色),但保留图像的透明度(alpha)形状,以便生成彩色蒙版。然而,从 IM v6.7.9 开始,你将需要通过禁用它然后重新启用 alpha 通道来保护 alpha 通道免受此操作的影响。 (有关更多详细信息,请参阅Alpha 打开)。例如...
  magick test.png -alpha off \
          -fill blue -colorize 100% \
          -alpha on  colorize_shape.png

[IM 输出]
如果没有这种保护,着色会将画布完全消隐为给定的颜色... |

  magick test.png -fill blue -colorize 100% colorize_blank.png

[IM 输出]
但是,如果有可能使用早于 IM v6.7.9 的 IM 版本,我建议你在上面包含“-alpha opaque”或“-alpha off”操作,以确保生成的图像是你期望的完全空白图像。请注意,你可以使用单一颜色(而不是一系列颜色)的按颜色色阶调整 运算符更快地清空画布。另请参见空白画布

中间色调调色

着色运算符 应用“[-fill](https://imagemagick.org/command-line-options/#fill)”颜色对图像中的所有颜色进行线性着色,而“[-tint](https://imagemagick.org/command-line-options/#tint)”运算符则应用“[-fill](https://imagemagick.org/command-line-options/#fill)”颜色,以便仅对图像的中间色调颜色进行着色。该运算符是灰度运算符,颜色按给定的百分比(0 到 200)进行调节或增强。为了限制其影响,还使用数学公式进行调整,使其不会影响黑白。但对每个颜色通道的中间色调颜色影响最大。“-tint 100”本质上会将完美的灰色着色,使其成为填充颜色强度的一半。较低的值会将其着色为较深的颜色,而较高的值会将其着色为与该颜色完美匹配。

  magick test.png  -fill red  -tint 40 tint_red.png

[IM 输出] [IM 输出]

测试图像中的绿色不是真正的 RGB 绿色,而是缩放矢量图形“green”,其亮度只有真正绿色的一半。因此,它也是中间色调颜色,因此受到“[-tint](https://imagemagick.org/command-line-options/#tint)”运算符的影响,变得更暗,与 测试图像的红色和蓝色斑点不同。你还可以使用逗号分隔的百分比列表为各个颜色分量着色。例如“-tint 30,40,20,10”。然而,这使用起来可能很棘手,并且可能需要一些实验才能正确使用。最好指定你想要的完美 50% 灰色的颜色。 | _[IM 输出][-tint](https://imagemagick.org/command-line-options/#tint)”运算符的工作原理是,以某种方式获取给定的颜色和百分比,然后根据“[-fill](https://imagemagick.org/command-line-options/#fill)”颜色强度调整图像中的各个颜色,如下式所示。 (见右图)

_ _f(x)=(1-(4.0*((x-0.5)*(x-0.5))))__ 二次函数,其结果用作图像中现有颜色的矢量。正如你所看到的,颜色完全替换为纯中灰色,没有对白色或黑色进行调整。

或者你可以使用 DIY 此类操作的较低级别运算符,请参阅FX 运算符,以及求值和函数运算符

_
---|---
着色运算符非常适合调整“[-shade](https://imagemagick.org/command-line-options/#shade)”的输出结果(请参见Shade 叠加高光图像),例如3d 子弹图像 中的示例。你还可以使用“[-tint](https://imagemagick.org/command-line-options/#tint)”使图像的中间色调变亮或变暗。这有点像图像的“伽马调整”,但不完全一样。例如,使用大于 100 的色调值和“white”颜色将使中间色调变亮。

  magick test.png  -fill white  -tint 130 tint_lighter.png

[IM 输出] [IM 输出]

而小于 100 的值会使颜色变暗。

  magick test.png  -fill white  -tint 70 tint_darker.png

[IM 输出] [IM 输出]

| _此时,纯中调灰色将不会映射到“[-fill](https://imagemagick.org/command-line-options/#fill)”颜色。

百分比参数不是“混合百分比”,而是更多的“亮度百分比”。例如,它对于“黑色”填充颜色根本不起作用。

我不知道为什么要这样设计,也不知道其背后的历史。然而,在对灰度图像着色时,这确实会让最终颜色的精确控制变得很别扭。

使用下面的叠加合成着色 将提供更精确(虽然非常线性,而不是抛物线)的中间色调灰色着色。

_
---|---

棕褐色调

[-sepia-tone](https://imagemagick.org/command-line-options/#sepia-tone)”是一种特殊的摄影重新着色技术,基本上是将图像转换为灰度,并将所有中间色调着色为特殊的棕色。 |

  magick rose:  -sepia-tone 65%     sepia-tone.jpg

[IM 输出]
给出的参数是灰度“中点”,它会成为最接近棕褐色调的颜色,类似于“Goldenrod”。它最常见的用途是生成双色调效果,以得到“旧照片”般的效果(参见维基百科上的棕褐色调)。例如,这里我使用各种颜色对增强了对比度的灰度 rose 图像进行 Tint,以获得类似棕褐色调的效果。具体该使用哪种颜色,取决于你想要的实际效果。

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      goldenrod  gold  khaki  wheat
  do
    magick rose_grey.jpg  -fill $color   -tint 100    sepia_$color.jpg
  done

[IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出]

我自己发现,将棕褐色调图像与原始图像混合或混合以减少其效果也可以产生更好的“褪色”效果。 |

  magick rose: \( +clone -sepia-tone 60% \) -evaluate-sequence mean  sepia-tone_blended.jpg

[IM 输出]
另请参阅 Hald 颜色查找表,了解可以保存更复杂的颜色变化变化的方法,例如上面的最后一个示例。

双色调效果

“双色调”是一种打印方法,你可以使用有限的预算或打印设备将图像的灰度(黑色墨水)与其他颜色混合以产生更好的结果。例如,你今天看到的所有旧照片都具有棕褐色调的外观,是因为棕褐色调墨水得以幸存并且不会随着时间的推移而变质或褪色。其他“黑白”图像格式逐渐变得无用。请参阅上面的棕褐色调运算符。另一种双色调技术称为“蓝晒法”(通常称为“蓝图”),被广泛用作制作原始黑白建筑师图纸的大规模副本的方法。请记住,这种技术早在激光和复印(和施乐)发明之前就已经使用了。有关更多信息,请参阅 双色调 的 Wikipedia 条目,以及 假双色调与真实双色调。然而,上面的 Tint Operator 会产生合理的双色调效果,就像上面的棕褐色调效果一样。

  magick rose: -colorspace gray -sigmoidal-contrast 10,40%  rose_grey.jpg
  for color in      blue  darkcyan  goldenrod  firebrick
  do
    magick rose_grey.jpg   -fill $color   -tint 100    duotone_$color.jpg
  done

[IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出]

请注意,我通常选择较暗版本的“双色调”颜色,但你也可以使用 Tint Operator 的参数来调整它。亮度和对比度也可以使用 Sigmoidal Contrast Operator 的参数进行调整。从三种颜色(黑点颜色、中点颜色和白点颜色)生成双色调的另一种更精确的方法是使用颜色查找表(见下文)。这只是一个简单的示例,其中我使用双色调颜色“Black”、“Chocolate”和“LemonChiffon”创建了一个非常不寻常的双色调。是的,黑点颜色通常为黑色,这就是为什么它通常被称为 duo 色调。

  magick -size 1x1 xc:Black xc:Chocolate xc:LemonChiffon \
                                   +append     duotone_clut.gif
  magick -size 20x256 gradient: -rotate 90   duotone_clut.gif \
          -interpolate Bicubic -clut       duotone_gradient.gif
  magick rose_grey.jpg   duotone_clut.gif \
          -interpolate Bicubic -clut       rose_duotone.jpg

[IM 输出] [IM 输出]
[IM 输出] [IM 输出] [IM 输出]

上述的优点是可以精确控制中点颜色(与不精确的 Tint 不同)。你还可以直接使用你喜欢的任何三种颜色,就像上面的示例一样,或者使用颜色的扩展渐变来更好地控制三个(或更多)控制点之间的颜色。该技术还为你提供了一种非常紧凑的方式来存储特定的双色调效果,以供重复和将来使用。另请参阅 Hald 颜色查找表,了解保存颜色更改的更复杂方法,这超出了对灰度图像进行着色的范围。

调色,DIY

[-tint](https://imagemagick.org/command-line-options/#tint)”最大的问题之一是它是一个灰度(或矢量)运算符。也就是说,它完全独立地处理每个红色、绿色、蓝色通道。这反过来意味着“blue”或“yellow”等原色和间色不会受到“[-tint](https://imagemagick.org/command-line-options/#tint)”的影响,即使所有灰度级都会受到影响。然而,借助各种通道数学变换,例如 FX 运算符 和更快的 评估和函数运算符,你可以生成自己的颜色叠加层来修改图像。也就是说,对图像进行色调 的操作与着色运算符 的操作类似。例如,在这里,我将图像的灰度亮度级别转换为所需特定颜色的半透明叠加层。 |

  magick test.png  \( +clone -colorspace gray \
               -function polynomial -4,4,0 -background Gold -alpha shape \) \
          -composite   tint_diy_compose.png

[IM 输出]
警告,这不能正确保留图像透明度,但对于完全不透明的图像来说它可以正常工作。请注意,与色调不同,可以使用任何颜色,包括“black”,因为颜色不被视为矢量加法,而是被视为 alpha 合成。结果与正常色调所得到的结果不太一样。

色彩叠加

特殊的 Alpha 合成 方法“[Overlay](compose.html#overlay)”和“[Hardlight](compose.html#hardlight)”实际上是在设计时考虑了颜色(和图案)着色。这些合成方法还将取代中间色调灰色,仅在图像中留下黑白高光。 例如,在这里我快速生成一个彩色叠加图像,并将其合成以对原始图像进行着色。 |

  magick test.png \( +clone -alpha off -fill gold -colorize 100% \) \
          -compose overlay -composite  tint_overlay.png

[IM 输出]
正如你所看到的,Alpha 合成不会保留原始图像的任何透明度,需要使用第二个 Alpha 合成操作来解决此问题。 |

  magick test.png \
          \( +clone -alpha off -fill gold -colorize 100% \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_fixed.png

[IM 输出]
使用“[Overlay](compose.html#overlay)”是比上面使用的二次函数更加线性的着色形式,并且像“[-tint](https://imagemagick.org/command-line-options/#tint)”一样,单独应用于图像的每个通道,使得原色和次色也保持不变。此外,此 alpha 合成方法不提供调整控制,因此如果你想控制着色级别,则需要在应用着色之前调整覆盖图像透明度。当然,与我迄今为止展示的其他着色方法不同,你不仅限于对简单的颜色进行着色,还可以使用图像或平铺图案应用色调。 |

  magick test.png \
          \( -size 150x100 tile:tile_disks.jpg \
             +clone +swap -compose overlay -composite \) \
          -compose SrcIn -composite  tint_overlay_pattern.png

[IM 输出]
然而,这超出了基本颜色处理的范围,因此我将保留图像着色。 | _alpha 合成方法“[HardLight](compose.html#hardlight)”将产生与“[Overlay](compose.html#overlay)”相同的结果,但交换了源图像和目标图像。

这可以用来代替最后几个示例中的“+swap”。_
---|---


全局颜色修改

调节亮度、饱和度和色相

[-modulate](https://imagemagick.org/command-line-options/#modulate)”运算符的特殊之处在于它修改特殊 HSL(色相-饱和度-亮度)色彩空间 中的图像。它将每个颜色像素转换到该色彩空间中并对其进行修改,然后将其转换回其原始色彩空间。它采用三个值(尽管后面的值是可选的)作为百分比,例如 100 不会对图像进行任何更改。例如.. |

  magick rose: -modulate 100,100,100  mod_noop.gif

[IM 输出]
第一个值_brightness_ 是图像整体亮度的乘数。

  magick rose:  -modulate 0     mod_bright_0.gif
  magick rose:  -modulate 50    mod_bright_50.gif
  magick rose:  -modulate 80    mod_bright_80.gif
  magick rose:  -modulate 100   mod_bright_100.gif
  magick rose:  -modulate 150   mod_bright_150.gif
  magick rose:  -modulate 200   mod_bright_200.gif

[IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出]

请注意,虽然“0”的亮度参数将生成纯黑色图像,但你无法单独使用此运算符生成纯白色图像。第二个值_饱和度_也是一个乘数,用于调整图像中存在的颜色总量。

  magick rose:  -modulate 100,0     mod_sat_0.gif
  magick rose:  -modulate 100,20    mod_sat_20.gif
  magick rose:  -modulate 100,70    mod_sat_70.gif
  magick rose:  -modulate 100,100   mod_sat_100.gif
  magick rose:  -modulate 100,150   mod_sat_150.gif
  magick rose:  -modulate 100,200   mod_sat_200.gif

[IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出] [IM 输出]

饱和度为“0”将产生灰度图像,如上面的将颜色转换为灰度中所示。然而,灰色均匀地混合了所有三个颜色通道,如 HSL 色彩空间所定义,因此不会产生真正的“强度”灰度。本质上,较小的值会产生更多“柔和”的颜色,而大于“100”的值将产生更多卡通般的彩色图像。请注意,由于_亮度_和_饱和度_是百分比乘数,因此你需要乘以一个非常大的数字才能将几乎所有图像颜色值更改为接近最大值。也就是说,你需要使用接近一百万的_亮度_系数,才能使除纯黑以外的所有颜色变为白色。

色相调制

最终值 Hue 实际上更有用。它以循环方式旋转图像的颜色。为了实现这一点,给定的 Hue 值会产生“模加法”,而不是乘法。但请注意,色相是按百分比旋转的,而不是按角度旋转的。这可能看起来很奇怪,但“[-modulate](https://imagemagick.org/command-line-options/#modulate)”一直都是这样。角度和调制参数之间的转换公式是...

_hue_angle_ = ( _modulate_arg - 100_ ) * 180/100
_modulate_arg_ = ( _hue_angle * 100/180_ ) + 100

这意味着“100”(对于所有三个参数)不会产生任何变化。而“0”或“200”的值将有效地取反图像中的颜色(但不是强度)。例如...

  magick rose:  -modulate 100,100,0      mod_hue_0.gif
  magick rose:  -modulate 100,100,33.3   mod_hue_33.gif
  magick rose:  -modulate 100,100,66.6   mod_hue_66.gif
  magick rose:  -modulate 100,100,100    mod_hue_100.gif
  magick rose:  -modulate 100,100,133.3  mod_hue_133.gif
  magick rose:  -modulate 100,100,166.6  mod_hue_166.gif
  magick rose:  -modulate 100,100,200    mod_hue_200.gif

[IM 输出]
0
(红<->青色)| [IM 输出]
33.3
(红色 -> 蓝色)| [IM 输出]
66.6 | [IM 输出]
100%
无操作| [IM 输出]
133.3 | [IM 输出]
166.6
(红色 -> 绿色)| [IM 输出]
200
(与0相同)
---|---|---|---|---|---|---

正如你所看到的,“33.3”值会使所有颜色产生负向旋转,也就是逆时针旋转大约 60 度,有效地将红色映射到蓝色,蓝色映射到绿色,绿色映射到红色。使用“0”或“200”的值会产生完全 180 度的颜色取反,而不取反图像的亮度。请注意,色相是循环的,因此使用“300”值将产生 360 度颜色旋转,并且不会导致图像发生任何变化。有关使用“色相调制”修改图像颜色的示例,请参阅色度键遮蔽地图中的图钉
这些类型的操作和更多操作也可以使用高级的色彩空间技术来应用,例如在重新着色矩阵运算符(如下)中使用,但对于图像的基本“调制”,该运算符大大简化了事情。对于原色交换,重新着色矩阵运算符 或通道交换(请参阅分离/组合运算符)可能是更准确的技术。尽管它的通用性要差得多。另请参阅 Hald 颜色查找表,了解保存颜色变化变化(尤其是色相变化)以供以后重复使用的方法。

DIY 调制

如果真的想“自己动手”,你也可以。基本上,你可以将图像转换到适当的色彩空间,修改值,然后再转换回来。请记住,在 HSL 色彩空间 中,绿色通道保存饱和度值,蓝色通道保存亮度值。例如,这里相当于“-modulate 80,120”(稍微变暗,增加颜色饱和度),使用默认的 HSL 色彩空间...

  magick rose: -colorspace HSL \
          -channel B -evaluate multiply 0.80 \
          -channel G -evaluate multiply 1.20 \
          +channel -colorspace sRGB   modulate_channel.png

[IM 输出] [IM 输出]

当然,如果你使用此方法修改色调(红色通道),你将需要确保最终值“环绕”(模数),而不是简单地将值剪裁为最大值或最小值(两者都是“红色”色调)。因此,直接使用 调制运算符 进行色调修改可能更容易。

在其他色彩空间中进行调制

[-modulate](https://imagemagick.org/command-line-options/#modulate)”的最大问题是处理包含大量“近白色”颜色的图像时。当它在 HSL 色彩空间中工作时,随着亮度的降低,灰白色的颜色将变得更加“饱和”。你可以在上面的 rose 图像的白色叶子中看到这一点,该图像在 50% 变暗时显示出大量颜色伪影。在处理 JPEG 图像格式时,这尤其是一个问题,因为由于其有损压缩算法,它往往会生成灰白色(实际上 JPEG 中的所有颜色通常都会略有偏差)。例如...

  magick wedding_party_sm.jpg  -modulate 85  modulate_off-white.png

[IM 输出] [IM 输出]

这里的问题是,在 HSL 中,所有灰白色都被打包到所使用的色彩空间的一个小的“白点”区域(双锥体)中。当亮度随后降低时,灰白色会随着颜色锥体的扩大而扩大,导致灰白色产生一组色彩更丰富(饱和)的灰白色。也就是说,颜色的微小变化被夸大了。解决方案是在 HSB 色彩空间中使用“[-modulate](https://imagemagick.org/command-line-options/#modulate)”,而不是 HSL 色彩空间。 | _HSB 中的“B”表示亮度,但通常也称为 HSV,使用“V”表示值。它们具有相同的色彩空间,但“V”是一个令人困惑的术语,因为值通常意味着“存储的数字”。

还有一个 HSI 色彩空间(使用强度“I”),但它并不常见,并且由于添加了 HCL(其中“L”表示亮度)循环色彩空间(见下文)而不需要。

_
---|---
在 HSB 色彩空间中,“白色”不是单个点,而是一个大的“圆盘”,因此灰白色彼此并不“接近”。因此,当你降低亮度时,灰白色会均匀收缩,减少而不是扩大任何轻微的颜色变化。因此,白色只是变成灰色,而不是变得更加多彩。要在 HSB 色彩空间 中调制图像,你可以在该色彩空间中使用 DIY 技术(见上文)。或者使用 IM v6.5.3-7 及更高版本,你可以使用“色调”色彩空间之一定义“modulate:colorspace”的操作控制。 |

  magick wedding_party_sm.jpg \
          -define modulate:colorspace=HSB -modulate 85 \
          modulate_HSB.png

[IM 输出]
其他“色调”色彩空间是 HWB 和 HCL(请参阅下一节)。当然,如果你将图像调整到这么小的尺寸,更好的解决方案不是将图像保存到 JPEG,这就是灰白色值的原因。最好在完成之前根本不要保存图像,这样你就可以将所有颜色值保持在内存中的最佳质量 设置。默认情况下不使用 HSB 色彩空间进行调制的原因是,如果在此色彩空间中调亮图像,颜色会变得更饱和、更大胆,而不是图像变得更明亮、更白。例如,这里将默认 HSL 中的“rose”图像的 150% 亮度与指定的 HSB 色彩空间进行比较。

  magick rose:         -modulate 150        mod_bright_HSL.gif
  magick rose: -define modulate:colorspace=HSB \
                         -modulate 150        mod_bright_HSB.gif

[IM 输出]
HSL | [IM 输出]
HSB
---|---

| _在 IM v6.4.0-10 之前,“[-modulate](https://imagemagick.org/command-line-options/#modulate)”运算符实际上使用 HSB 色彩空间而不是 HSL 色彩空间。由于用户报告了有关上述情况的错误,因此对此进行了更改。

重点是,对于某些图像,使用 HSL 可能不合适;对于另一些图像,使用 HSB 色彩空间也可能不合适。这完全取决于你想要做什么!

_
---|---

在 LCHab 和其他色彩空间中进行调制

色相调制(在HSL或HSB 色彩空间中)实际上被认为是相当粗糙的。这些色彩空间没有考虑更真实的颜色强度。因此,“蓝色”和“黄色”色相之间的旋转也会产生非常大的亮度变化。请参阅维基百科:HSL 色彩空间的缺点。一种替代方法是按照“矩阵运算”论文中的 Grafica Obscura 中的描述进行亮度保留旋转。这很复杂,因为颜色修改是作为操作的一部分完成的,作为单个计算的矩阵运算,根据需要的旋转量而有所不同。从 IM v6.8.4-7 开始,调制运算符 还可以处理特殊的色彩空间“LCHab”和“LCHuv”,它们是圆柱形(色相-色度)形式的各自的“Luv”和“Lab”色彩空间。有关详细信息,请参阅维基百科、圆柱 LUV 或 LCHuv 色彩空间HCL 色彩空间 LCHab”和“LCHuv”色彩空间的等效通道与“HCL”和“HCB”色彩空间的通道相反。也就是说,“灰度”强度等效位于图像的第一个(“红色”)通道中,而色相位于图像的第三个(“蓝色”)通道中。
例如,我们使用“LCHab”色彩空间对红色 rose 进行一些色相旋转。将它们与上面的“HSL”色彩空间的先前设置进行比较。
  for i in   0 25 50 75 100 125 150 175;  do
    magick rose: -define modulate:colorspace=LCHab \
                            -modulate 100,100,$i     mod_lch_$i.gif
  done

[IM 输出]
0% 和 200% | [IM 输出]
25%
(红色->蓝色)| [IM 输出]
50% | [IM 输出]
75% | [IM 输出]
100%
无操作| [IM 输出]
125% | [IM 输出]
150% | [IM 输出]
175%
---|---|---|---|---|---|---|---

请注意,色相的分布方式与更传统的色相色彩空间不同。但更重要的是,原始图像的强度得以保留。因此,你永远不会从一种纯原色/间色循环到另一种纯原色/间色,因为这些颜色都不具有相同的强度。然而,颜色在色相上的进展确实更加流畅,原色和间色处的“峰值”不那么尖锐。以下是“LCHab”的红色到蓝色的简单色相旋转与正常的“HSL”色彩空间(使用适当的旋转百分比)的比较。

[IM 输出]
原图| | [IM 输出]
LCHab
25% | [IM 输出]
HSL/HSB
33.3%
---|---|---|---

请注意,蓝色远没有那么暗,而是与原始图像的阴影更匹配的阴影。有关 HCL 色彩空间色相的更多信息,请参阅 LCH 色轮 上的示例。 | _在 IM v6.8.4-7 之前,你将使用色彩空间“HCL”(引入了 IM v6.7.9-1)。此色彩空间与“LCHuv”完全相同,但通道顺序相反(色相存储在图像的红色通道中,这只是定义色彩空间的方式)。这意味着你还必须交换各个通道才能使 Modulate Operator 正常工作。

LCHab”和“LCHuv”色彩空间以与“HSL”相同的方式对通道进行排序,以便允许调制正常工作,并且直接在色彩空间上而不需要通道重新排序。

_
---|---
| _请注意,对于非常暗的颜色,“LCHuv”可以生成不连续的颜色值。然而,对于真实图像来说,这种情况不应该发生,只有直接在圆柱空间中生成的图像才应该发生。

_
---|---

颜色矩阵运算符

[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)”运算符将使用矩阵技术对图像重新着色。也就是说,你给它一个值矩阵,表示如何线性混合图像的各种颜色通道值以产生新的颜色值。典型用法是为运算符提供 9 个值,这些值形成三个函数(行)或三个乘数(列)。因此,前三个数字用于红色通道的颜色公式,接下来的三个用于绿色通道,依此类推。例如... |

  magick rose: -color-matrix ' 1 0 0
                                0 1 0
                                0 0 1 '   matrix_noop.png

[IM 输出]
相当于应用方程...

red' = 1 * red + 0 * green + 0 * blue
green' = 0 * red + 1 * green + 0 * blue
blue' = 0 * red + 0 * green + 1 * blue

在这种特殊情况下,不会对图像进行任何更改。该矩阵形成一个特殊的数组,称为“单位矩阵”。通过混合行,你可以用来交换各个通道。例如,在这里我交换红色和蓝色通道值。 |

  magick rose: -color-matrix ' 0 0 1
                                0 1 0
                                1 0 0 '  matrix_red_blue_swap.png

[IM 输出]
或者简单地将红色通道复制到其他两个通道,以提取或分离出“红色通道”(另请参阅分离通道图像)... |

  magick rose: -color-matrix ' 1 0 0
                                1 0 0
                                1 0 0 '  matrix_red_channel.png

[IM 输出]
或使用 2/5/3 灰度比例转换为灰度图像(请参阅将颜色转换为灰度)... |

  magick rose: -color-matrix ' .2 .5 .3
                                .2 .5 .3
                                .2 .5 .3 '  matrix_grayscale.png

[IM 输出]

你可以使用最多包含 6 行和 6 列的更大矩阵。这些对应于通道:“Red”、“Green”、“Blue”、“Black”(如果设置)、“Alpha”(如果设置)和一个常量。注意通道:“Black”和“Alpha”;如果矩阵那么大,即使该值本身可能不存在或不使用,仍然必须提供。最后一个常数列只是对公式的简单加法(如果为负则减法)。第 6 行(如果给出)将被简单地忽略,并且不会被使用。默认情况下,“矩阵”定义遵循与用户定义的形态/卷积内核 相同的结构,并且如果未指定大小几何形状,则被视为“方形”内核。目前未使用内核的偏移量。然后将给定的“值数组”覆盖在更大的“6x6 单位矩阵”(1 的对角线)上,然后再应用于图像。这种内部处理意味着你实际上可以仅用几行数字而不是全部数字来简单地表示矩阵值。当你需要在颜色计算中包含“常数”或只想修改一个通道时,这一点特别有用。例如反转(取反)图像。 |

  magick rose: -color-matrix '6x3: -1  0  0 0 0 1
                                     0 -1  0 0 0 1
                                     0  0 -1 0 0 1'  matrix_negate.png

[IM 输出]
将所有红色通道值设置为最大值(使用“常量”)... |

  magick rose: -color-matrix '6x1: 0,0,0,0,0,1'  matrix_red_max.png

[IM 输出]
由于单位矩阵上的覆盖,其他通道值不会受到影响,尽管它们仍然在内部重新计算。 | 在IM v6.6.1-0之前,“[-color-matrix](https://imagemagick.org/command-line-options/#color-matrix)”被命名为“-recolor
---|---

颜色矩阵示例

棕褐色 ,或至少是该操作的线性形式 |

  magick rose: -color-matrix ' 0.393 0.769 0.189
                                0.349 0.686 0.168
                                0.272 0.534 0.131  ' matrix_sepia.png

[IM 输出]
鲜艳的色彩,采用一种名为 Digital Velvia 的技术... |

  magick rose: -color-matrix '  1.2 -0.1 -0.1
                                -0.1  1.2 -0.1
                                -0.1 -0.1  1.2 ' matrix_vivid.png

[IM 输出]
该矩阵使每个颜色通道变亮,同时减去其他通道的颜色,使 RGB 图像中的颜色更加鲜艳。这与使用调制将图像色彩饱和度增加20%不太一样,但也类似。 宝丽来颜色... |

  magick rose: -color-matrix \
            '6x3:  1.438 -0.122 -0.016  0 0 -0.03
                  -0.062  1.378 -0.016  0 0  0.05
                  -0.062 -0.122 1.483   0 0 -0.02 ' matrix_polaroid.png

[IM 输出]
未来:使用颜色矩阵进行色调旋转...
Grafica Obscura网页上所述。
有关使用颜色矩阵的更多信息,请参阅...

但请注意,大多数这些实现都使用对角转置 形式的矩阵,其中列构成方程,而不是行。或者涉及更少的通道(更少的行/列)。

Solarize 着色

对于“[-solarize](https://imagemagick.org/command-line-options/#solarize)”,图像基本上是将最亮的颜色“烧”成黑色。颜色越亮,solarize 后的颜色越深。当化学胶片曝光过度时,摄影中就会发生这种情况。 |

  magick rose:  -solarize 90%     solarize.jpg

[IM 输出]
基本上,任何高于给定灰度级别的内容都会被取反。因此,如果你给出“0%”参数,基本上就得到了一个简陋版的取反运算符。例如,下面是一个伪造的“[-solarize](https://imagemagick.org/command-line-options/#solarize)”,它使用“[-fx](https://imagemagick.org/command-line-options/#fx)”数学公式实现。 |

  magick rose:  -fx  '.9>u ? u : 1-u'     solarize_fx.jpg

[IM 输出]
该运算符特别适合从图像中提取中间色调灰色。例如,这里我使用非常强的 Sigmoidal Contrast 操作来产生一种 70% 灰度的“模糊”阈值。然后我 Solarize 结果生成模糊尖峰而不是模糊阈值。然后进行最终的色阶调整,使尖峰亮度达到最大,以产生“灯丝”效果。

  magick -size 10x300 gradient: -rotate 90 \
                         -sigmoidal-contrast 50x70%   fuzzy_thres.png
  magick fuzzy_thres.png  -solarize 50%   fuzzy_spike.png
  magick fuzzy_spike.png  -level 0,50%    filament.png

[IM 输出] [IM 输出] [IM 输出]

ASIDE: 上面的图像显示了渐变的“轮廓”图,是使用 IM 示例中的“[im_profile](../static/img/scripts/im_profile)”生成的,脚本 目录。请注意任何白色的东西如何变成黑色,而中心尖峰周围的中间色调灰色被保留。尖峰的模糊性和位置由“[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)”运算符确定。我称其为“灯丝”,因为通常结果看起来非常像发光的电线或闪电放电。有关此效果的另一个示例,请参阅随机通量。这种中间色调灰度的提取也可以很好地用于生成位图形状的边缘轮廓两个偏置渐变的乘法 的技术。此操作的另一个新颖用途是确定图像是否基本上是纯黑白草图或绘图(例如来自书籍),而不是阴影灰度或彩色图像,请参阅确定图像是:纯黑白还是灰度


使用查找表重新着色图像

虽然你可以使用如上所示的各种直方图颜色调整对图像重新着色,但还有另一种对图像重新着色的技术,只需从预先准备的颜色渐变或“颜色查找表”(颜色 LUT 或 CLUT)中“查找”修改后的值即可。颜色 LUT 有两种类型:简单的一维或“每通道”LUT 和 3d 彩色 LUT。 LUT 的一个通道具有三个独立的查找表:R、G 和 B 通道各一个。通道 LUT 中的每个条目将输入通道值映射到输出通道值。输出图像的红色通道仅受输入图像的原始红色值的影响。然而,3D 颜色 LUT 允许根据整个输入颜色来替换整个颜色。也就是说,红色通道的输出值可以取决于输入红色、绿色和蓝色值中的任何一个或全部。这有时称为通道串扰。

颜色(通道)查找表

图像处理工具的一个常见要求是能够从预先准备的颜色表中替换整个颜色范围。这使你可以将一组颜色(通常是灰度)的图像转换为完全不同的颜色组,只需从特殊图像中查找其替换颜色即可。当然,你确实需要一个“查找表”图像来读取替换颜色。对于前几个示例,我选择对 LUT 使用垂直颜色渐变,以便可以使用 IM“[gradient:](canvas.html#gradient)”生成器来简化“颜色查找表”的生成。好了,理论就讲这么多。让我们尝试一下,对一个简单的灰度等离子 图像重新着色,用深蓝色到灰白色的渐变颜色替换灰度。

  magick -size 100x100 plasma:fractal -virtual-pixel edge -blur 0x5 \
          -shade 140x45  -normalize \
          -size 1x100 xc:black -size 9x100 gradient: \
          +append  gray_image.jpg
  magick -size 10x100  gradient:navy-snow       gradient_ice-sea.png
  magick gray_image.jpg  gradient_ice-sea.png -clut  gray_recolored.jpg

[IM 输出] [IM 输出] [IM 输出]

[-clut](https://imagemagick.org/command-line-options/#clut)”运算符接受两个图像作为输入。第一个是要替换其中颜色值的图像,第二个是单行或单列的渐变图像。 IM v6.3.5-8 中添加了“[-clut](https://imagemagick.org/command-line-options/#clut)”运算符。
如果你的 IM 太旧而无法理解“[-clut](https://imagemagick.org/command-line-options/#clut)”运算符,或者你想要做一些不寻常的事情,例如二维颜色查找表,那么你可以使用 通用 DIY 运算符,FX 来创建自己的。例如,这是一个缓慢但与上面等效的命令。
  magick gray_image.jpg  gradient_ice-sea.png \
          -fx 'v.p{0,u*v.h}'  gray_recolored_fx.jpg

[IM 输出]
问题是,即使对于像上面这样的简单过程,“[-fx](https://imagemagick.org/command-line-options/#fx)”运算符也非常慢,并且必须专门针对行或列 LUT 进行设计。但它确实有效。 LUT 不必很大。例如,这里我们使用非常小的LUT,颜色数量非常有限。

  magick -size 1x6 gradient:navy-snow  gradient_levels.png
  magick gray_image.jpg  gradient_levels.png  -clut  gray_levels.jpg

[IM 输出] [IM 输出] [IM 输出]

上面网页显示的渐变图片我放大了,不然会太小看不清。 LUT 实际上只有 6 像素大小。然而,如果你查看结果,你会发现颜色查找运算符将这 6 种颜色平滑为平滑渐变。发生的情况是 IM 正在对 LUT 图像进行插值查找。也就是说,它不是仅仅选择找到的颜色,而是对所有附近颜色进行加权平均,以更好地代表 LUT。在这种特殊情况下,它使用默认的“[Bilinear](misc.html#bilinear)”设置,仅将每个彩色像素与线性线段链接在一起。当使用非常小的颜色 LUT 时,不同的“[-interpolate](https://imagemagick.org/command-line-options/#interpolate)”设置会生成不同级别的颜色平滑度。例如,我在这里展示了 LUT 颜色的各种类型的插值平滑。

  magick gray_image.jpg  gradient_levels.png \
          -interpolate Integer         -clut  gray_levels_integer.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate NearestNeighbor -clut  gray_levels_nearest.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Average         -clut  gray_levels_average.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Blend           -clut  gray_levels_blend.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate BiLinear        -clut  gray_levels_bilinear.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Catrom          -clut  gray_levels_catrom.jpg
  magick gray_image.jpg  gradient_levels.png \
          -interpolate Spline          -clut  gray_levels_spline.jpg

[IM 输出]
整数| [IM 输出]
最近的| [IM 输出]
平均 | [IM 输出]
混合| [IM 输出]
BiLinear | [IM 输出]
Catrom | [IM 输出]
Spline
---|---|---|---|---|---|---

[Integer](misc.html#integer)”和“[Nearest](misc.html#nearest)”设置的特殊之处在于它们根本不平滑颜色。也就是说,不会添加新的“混合颜色”,仅使用当前的确切颜色值来为灰度图像着色。但请注意两者之间颜色查找的不同。这是一个微妙的差异,但可能非常重要。另一方面,“[Average](misc.html#average)”设置也生成色带,但仅使用颜色的混合,导致比颜色查找表图像的大小少一个颜色。然而,“[Blend](misc.html#blend)”将“[Average](misc.html#average)”和“[Nearest](misc.html#nearest)”混合在一起,以添加更多像素。这种类型的颜色“条带”(或 Blocking Artefacts)实际上对于地理地图和温度图相当常见,因为它可以更好地表示地图的确切形状。尖锐的边界边缘称为等值线。向最终图像添加轻微的一个像素 模糊 可以改善这些边缘的外观,使其看起来更平滑,而不会破坏色带。当颜色急剧变化时(本例中没有),“[BiLinear](misc.html#bilinear)”设置也会生成条带,但只会以急剧渐变变化的形式产生。而“[Catrom](misc.html#catrom)”会平滑颜色变化。最后“[Spline](misc.html#spline)”将使颜色模糊,并且可能不会生成给定 CLUT 中的任何颜色。为了避免插值问题或更好地定义颜色渐变,最好的想法是使用更长的 LUT。理想情况下,这应该涵盖所有可能的强度值范围。对于 ImageMagick Q16(以 16 位质量编译),需要 LUT 的高度为 65536 像素。但像素插值可以让你使用更合理的500像素的LUT渐变图像,适合大多数图像重新着色任务。请注意,上述示例中使用的垂直渐变 LUT 在我们看来是上下颠倒的,因为黑色或“0”索引位于图像的顶部。通常,我们人类更喜欢看到底部黑色水平的渐变(这要归功于我们的进化历史)。如果你希望以“正确的方式”保存渐变图像,则可以在读取图像时将其“[-flip](https://imagemagick.org/command-line-options/#flip)”。例如,让我们尝试更复杂的 LUT,在图像上使用之前翻转垂直渐变。

  magick -size 1x33 gradient:wheat-brown gradient:Brown-LawnGreen \
          gradient:DodgerBlue-Navy   -append  gradient_planet.png
  magick gray_image.jpg \
          \( gradient_planet.png -flip \) -clut   gray_planet.jpg

[IM 输出] [IM 输出] [IM 输出]

正如你所看到的垂直渐变,在使用之前翻转它很有意义。有关生成渐变的更多示例,请参阅颜色渐变。你可能还对使用每个灰度级的图像来平铺灰度图像的方法感兴趣,这可以生成更好的“地图”状图像。请参见使用图案进行抖动

函数到颜色 LUT 转换

这些预先准备好的“查找表图像”(或 LUT)还可用于大大提高非常复杂且因此缓慢的“[-fx](https://imagemagick.org/command-line-options/#fx)”操作的速度,因此 IM 无需将每个像素解释函数字符串 3 或 4 次,而是可以更快地查找替换颜色。执行此操作的过程非常简单,要么将该函数应用于未修改的线性渐变,要么将函数中的“u”替换为值“(i/w)”或“(j/h)”,以根据其位置计算替换值。例如,在高级 'Aqua' 效果 示例中,我使用了复杂的“[-fx](https://imagemagick.org/command-line-options/#fx)”函数来调整 Shade 运算符 的灰度输出。此外,由于此灰度调整也覆盖在“DodgerBlue”形状上,因此没有理由不能将这两个运算符的结果合并到单个渐变查找中也就是说,我们根据“[-fx](https://imagemagick.org/command-line-options/#fx)”公式和颜色叠加生成 LUT。另外,对于这些示例,我决定生成单行像素,而不是像之前那样生成一列。

  magick -size 1x512 gradient: -rotate 90 -alpha off \
          -fx '3.5u^3 - 5.05u^2 + 2.05u + 0.3' \
          -size 512x1 xc:DodgerBlue -compose Overlay -composite \
          aqua_gradient.png

[IM 输出]

| 上面的多项式“[-fx](https://imagemagick.org/command-line-options/#fx)”现在可以使用 Polynomial 函数 更直接、更快速地生成。例如

_"[-function](https://imagemagick.org/command-line-options/#function) Polynomial 3.5,-5.05,2.05,0.3"_

---|---
现在可以以最小的存储非常小的图像的成本,更快地将这种预先生成的 LUT 应用于阴影形状。

  magick -font Candice -pointsize 72 -background None label:A \
          -trim +repage  aqua_mask.png
  magick aqua_mask.png -alpha Extract -blur 0x6 -shade 120x21 \
          -alpha On -normalize  aqua_shade.png
  magick aqua_shade.png  aqua_gradient.png -clut aqua_font.png

[IM 输出] [IM 输出] [IM 输出]
警告:以上内容不完整(边缘尚未变暗)

正如你所看到的,结果非常有效,一旦生成了适当的 LUT 渐变,你就可以多次重复使用相同的渐变,次数不限。

CLUT 和透明度处理

[-clut](https://imagemagick.org/command-line-options/#clut)”运算符由“[-channel](https://imagemagick.org/command-line-options/#channel)”设置控制,但实际上,它仅替换图像中的各个通道值。这意味着通常源图像的每个单独通道都用于从颜色查找表中“查找”该通道的替换值。其中包括通常非常不方便且难以应用的 alpha 通道。通常,“[-clut](https://imagemagick.org/command-line-options/#clut)”运算符用于对灰度源图像进行着色(请参阅前面的示例),或者用于使用灰度 CLUT(颜色查找表)对彩色图像进行直方图调整。换句话说,通常其中一幅图像通常是灰度的。从 IM v6.4.9-8 开始,如果“[-channel](https://imagemagick.org/command-line-options/#channel)”设置指定你要替换/调整图像的 alpha 通道(存在“A”),并且“源”图像或“CLUT”图像没有定义 alpha 通道,则 IM 将假定该图像是灰度图像,并采取相应的操作。例如,这里我生成一个简单的模糊三角形,作为灰度图像。然后,我可以使用包含透明度的颜色查找表进行着色。这次我没有翻转 CLUT 图像,因此黑色替换将在顶部,白色替换将在底部。

  magick -size 100x100 xc:  -draw 'polygon 50,10 10,80 90,80' \
          -blur 0x10  blurred_shape.jpg
  magick -size 1x5 xc:none \
          -draw 'fill red    point 0,2' \
          -draw 'fill yellow rectangle 0,0 0,1'   gradient_border.png
  magick blurred_shape.jpg -alpha off    gradient_border.png \
          -channel RGBA  -interpolate integer -clut  clut_shape.png

[IM 输出] [IM 输出] [IM 输出]

请记住,只有当灰度图像没有 alpha 通道(使用“[-alpha](https://imagemagick.org/command-line-options/#alpha) off”或“[-alpha off](https://imagemagick.org/command-line-options/#matte)”关闭)并且你指定还想要查找 alpha 通道值(使用“[-channel](https://imagemagick.org/command-line-options/#channel) RGBA”)时,上述内容才会按预期工作。这是另一种特殊情况,我们有一个具有透明度(和 alpha 通道)的图像,需要使用灰度直方图调整渐变(未启用 alpha 通道)进行调整。

  magick -size 100x100 xc:none -draw 'polygon 50,10 10,80 90,80' \
          tile_disks.jpg -compose In -composite shape_triangle.gif
  magick shape_triangle.gif -channel A -blur 0x10 +channel shape_blurred.png
  magick -size 1x50 gradient: xc:black -append -flip \
          -sigmoidal-contrast 6x0%  feather_histogram.jpg
  magick shape_blurred.png \( feather_histogram.jpg -alpha off \) \
          -channel A    -clut    shape_feathered.png

[IM 输出] [IM 输出] [IM 输出] [IM输出]

以上是一个典型的图像羽化问题。中间图像中的“黑色”光晕是由“[-blur](https://imagemagick.org/command-line-options/#blur)”操作引起的,使三角形周围的完全透明区域可见。由于完全透明的颜色未定义,IM 默认为黑色。 CLUT 图像本身的设计是为了确保任何透明度低于 50% 的像素都将变为完全透明,从而有效地使图像先前完全透明的部分再次透明。对于此示例,我过度执行了初始“模糊”,然后过度校正了 alpha 通道调整。结果是三角形的点被严重舍入。对于正常图像羽化,通常会对“[-blur](https://imagemagick.org/command-line-options/#blur)”和“[-sigmoidal-contrast](https://imagemagick.org/command-line-options/#sigmoidal-contrast)”alpha 调整使用更小的值。 Fred Weinhaus,在他的“feather”脚本中实现了模糊羽化技术,以使其更易于使用。

Hald 3D 颜色查找表

从 IM v6.5.3-4 开始,你也可以使用完整的 3D 颜色查找表,用它直接替换多张图像中的所有颜色。也就是说,它不是像上面的 CLUT 那样把每个颜色通道的值作为单独实体来查找,而是使用整个颜色来查找新颜色。不过,3D 颜色表通常需要特殊文件格式,才能正确存储颜色值的 3D 数组。通过一种特殊的颜色值排列方式,3D 表可以存入称为 Hald 颜色 LUT 的 2D 图像中。这只是一张普通图像,因此任何良好的图像文件格式都可以用来保存 Hald 3D 颜色 LUT。有关 HALD Images 的更多细节和示例,请参见官方网站 Hald Images, Clut Technology。要生成 Hald 3D 颜色表,请使用“HALD:{_level_}”图像生成器。例如,下面是一个小型表,我把它放大了,以便你看到其中的单个像素......

  magick  hald:3    hald_3.png

[IM 输出]

该表保存一个颜色立方体,其一侧为“{_level_}2”颜色或 9 种颜色。全色立方体包含“9 × 9 × 9”颜色,总共 729 种颜色,存储在该数字平方根或 27x27 像素的图像中。颜色被存储,因此前 9 种颜色(位于左上角)形成从“纯黑”到“纯红”的渐变。然后,每 9 种颜色形成“绿色”渐变,每 81 种颜色形成“蓝色”渐变。右下角的最后一种颜色是“纯白色”。如果可以帮助你想象的话,你可以将图像视为更简单的 1D 像素阵列,这些像素被引用为 3D 颜色立方体。现在这只是一个小的 HALD CLUT 图像。更典型的是,你至少会使用 8 级 Hald(默认值),它将容纳每边 64 种颜色(即 64^3 = 262144 种颜色)的颜色立方体,并生成大小为 512x512 像素的图像。并保存到大约 10Kbyte PNG 图像中。这不是全部 8 位颜色,但相当不错。对于每 8 位颜色的 HALD 图像,你需要 16 级版本,生成 4096x4096 图像。这只是证明即使是普通的数码相机图像通常也无法容纳所有可能的 8 位颜色。然而,可以使用较小的 Hald 图像,因为 IM 将从 Hald 中插入相邻的 8 种颜色,以计算出查找替换的最终颜色。它根本不如更大的版本那么好。不建议使用大于 8 的 Hald 图像,并且需要非常大的图像,每个值深度至少有 16 位才能容纳它。现在这些生成的 hald 图像是“恒等”或“无操作”CLUT 图像。也就是说,它们是形成 3D 颜色立方体的正常颜色值,因此不会对图像产生任何变化。例如,让我们使用“[-hald-clut](https://imagemagick.org/command-line-options/#hald-clut)”运算符应用“无操作”Hald 图像...

  magick rose:  hald_3.png -hald-clut   rose_hald_noop.png

[IM 输出] [IM 输出] [IM 输出]

该图像与原始图像完全相同,Hald 图像没有任何变化。但是,通过手动修改 Hald 图像或使用颜色修改,你可以用原始颜色替换修改后的颜色。例如,在这里我创建了一个混合棕褐色调的配色方案......

  magick hald_3.png \( +clone -sepia-tone 60% \) -evaluate-sequence mean hald_sepia.png
  magick rose.png   hald_sepia.png -hald-clut   rose_hald_sepia.png

[IM 输出] [IM 输出] [IM 输出]

当然,如果你可以对 Hald 图像应用特定的颜色修改,你也可以将其直接应用于实际图像。但你现在可以保存颜色修改以重复使用它们,然后可以多次应用。这意味着你可以把精力花在 Hald 图像上,并保存下来供以后使用。你还可以向其他人甚至其他应用程序发送或下载 Hald CLUT 图像。你甚至可以使用“Gimp”或“Photoshop”等图像编辑器直接编辑 Hald 中的颜色,或者如果保存在枚举像素文本图像 中,则使用纯文本编辑器!所有这一切对于非常复杂的颜色修改尤其如此_请将你发现有趣或有用的任何 Hald CLUT 图像邮寄给我,我将在这里举例说明。你也会在这里获得积分!_

Hald CLUT 限制

与使用 CLUT 运算符 的更简单的一维渐变查找不同,你可以使用 Hald CLUT 来旋转颜色。例如交换红色和蓝色。这是一种更加通用的 CLUT 方法。但是,它不适合做更简单的事情,例如为灰度图像着色或对颜色值进行直方图调整。它还可以通过将替换颜色保存在 Hald CLUT 图像中,用透明或半透明值替换颜色。但是,此替换查找仅按颜色进行。你不能使用它以特定方式替换透明颜色。它毕竟不是 4D 颜色查找超立方体!

使用 Hald CLUT 进行颜色替换

现在,由于整个颜色值用于查找颜色替换,因此你还可以使用此方法将图像中的所有颜色直接替换为其他颜色。然而,由于 IM 目前对 Hald 进行线性插值查找,因此你需要在 3D 颜色立方体的所有 8 个相邻颜色单元中设置替换颜色。

建设中

这需要更多工作,并且可能需要“最近邻”Hald 查找设置(例如使用 -interpolate),而不是 3D 线性插值查找,以便更好地进行特定颜色替换。另外,在 Hald(最近邻,或 8 个邻居)中定位特定颜色的一些简单方法将使这变得容易得多。 _如果你有想法、建议或更好的小示例,请通过将它们邮寄给我或 IM 讨论论坛来贡献_另一个想法是,如果你有两个图像,原始图像和转换后的图像,那么应该可以根据这两幅图像的比较来填充 Hald CLUT 图像。在直接对应的颜色填好之后,颜色立方体其余部分至少应该能够通过对已有颜色进行曲线拟合粗略推导出来。也就是说,根据发现的颜色变化创建 4-D 颜色表面。完成后,你可以将 Hald CLUT 应用于任何其他图像,以便对任何其他图像进行相同的颜色变换(在任一方向)。

完整颜色映射替换

未来:用另一个颜色图中的颜色替换一个颜色图中的所有颜色。欢迎就如何最好地做到这一点提出建议,或者程序员实现一些图像颜色映射功能。一种方法可能是使用使用符号进行抖动 中提出的想法。目前最知名的解决方案(但不太理想)是由 Fred Weinhaus 在“[mapcolors](http://www.fmwconcepts.com/imagemagick/mapcolors/index.php)”脚本中提供的。该脚本本质上一次映射一种颜色,将一张图像中涉及的像素屏蔽到一张新的最初空白图像中。另一个想法是以某种方式将 3 维颜色替换映射到 HALD 颜色表。这不仅会映射指定的颜色,还会以逻辑方式重新映射指定颜色之间的颜色。 需要 HALD 生成器。


建设中

More color options yet to be looked at in detail...

  -contrast
  -brightness-contrast

Color Cycling?
    -cycle     shift colormap (for animations of fractals???)

Chromaticity Color Points???
   –white-point x,y
   –red-primary x,y
   –green-primary x,y
   –blue-primary x,y


Thresholds  (after negation)
  Specifically  -white-threshold and -black-threshold