【问题标题】:How to recolor grayscale image with fixed colors by ImageMagick using CLUT如何使用 CLUT 通过 ImageMagick 为具有固定颜色的灰度图像重新着色
【发布时间】:2017-09-08 12:49:53
【问题描述】:

我对图像处理和 ImageMagick 还很陌生,但经过一番搜索后,我找不到直接解决问题的方法。 我仍然不了解 Color LookUp Table [CLUT] 在 ImageMagick 中的工作原理。

我有源图片:

我希望它看起来像这样:

这个想法是在源图像中我有灰度值,应该将其转换为颜色值 1:1

rgb(0, 0, 0)  -> transparent
rgb(1, 1, 1)  -> rgb(253,0,252)
rgb(2, 2, 2)  -> rgb(252,0,23)
rgb(3, 3, 3)  -> rgb(253,125,33)
rgb(4, 4, 4)  -> rgb(254,217,48)
rgb(5, 5, 5)  -> rgb(219, 255, 51)
rgb(6, 6, 6)  -> rgb(59, 255, 46)
rgb(7, 7, 7)  -> rgb(110, 165, 58)
rgb(8, 8, 8)  -> rgb(18, 139, 54)
rgb(9, 9, 9)  -> rgb(44, 255, 254)
rgb(10,10,10) -> rgb(18, 129, 252)
rgb(11,11,11) -> rgb(39, 19, 251)
rgb(12,12,12) -> rgb(115, 115, 115)
rgb(13,13,13) -> rgb(179,179,179)

但我不知道如何创建 CLUT 图像以使 ImageMagick 按我的意愿转换它。 我试图创建这样的东西:

...但是当我这样做时:

$> convert region_128x128.png color_lookup_table.png -clut region_128x128_clut.png

我明白了:

所以,问题是,是否可以为我的问题创建 CLUT?如果是这样,有人可以向我解释一下吗?

更新: 我找到了使用 ImageMagick 做我想做的事情的方法,我使用这个脚本:

#!/bin/bash

INPUT_FILE=$1
OUTPUT_FILE=$2

convert $INPUT_FILE -fill 'rgba(0,0,0,0.0)' -opaque 'rgb(0, 0, 0)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(253,0,252)' -opaque 'rgb(1, 1, 1)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(252,0,23)' -opaque 'rgb(2, 2, 2)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(253, 125, 33)' -opaque 'rgb(3,3,3)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(254, 217, 48)' -opaque 'rgb(4,4,4)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(219, 255, 51)' -opaque 'rgb(5,5,5)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(59, 255, 46)' -opaque 'rgb(6,6,6)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(110, 165, 58)' -opaque 'rgb(7,7,7)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(18, 139, 54)' -opaque 'rgb(8,8,8)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(44, 255, 254)' -opaque 'rgb(9,9,9)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(18, 129, 252, 1)' -opaque 'rgb(10,10,10,)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(39, 19, 251)' -opaque 'rgb(11,11,11,)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(115, 115, 115)' -opaque 'rgb(12,12,12)' $OUTPUT_FILE
convert $OUTPUT_FILE -fill 'rgb(179,179,179)' -opaque 'rgb(13,13,13)' $OUTPUT_FILE

但这肯定不是最佳解决方案。有什么办法可以用 CLUT 做到这一点?

【问题讨论】:

  • @Zindarod,clut 图片发布在.. but when I do:上方

标签: imagemagick


【解决方案1】:

我能想到的几个技巧。

标准化

拉伸入站图像,以便正确映射色谱。

将变为

convert region_128x128.png -normalize color_lookup_table.png -clut region_128x128_clut.png

但这可能并不理想,因为您无法精确控制这将如何影响图像。

填充查找表。

增加 CLUT 以覆盖整个颜色光谱(即使它们未被使用)。

convert -size 1x255 gradient: -flip  color_lookup_table.png -composite new_color_lookup_table.png

会来

convert region_128x128.png new_color_lookup_table.png -clut region_128x128_clut.png

或者只是用-extent填充。

convert region_128x128.png \( color_lookup_table.png -extent 1x255 \) -clut region_128x128_clut.png

【讨论】:

  • 感谢@emcconville 的建议!看起来这个填充物有效,但我需要检查它。完成后,我会将您的答案标记为有用。但我仍然不明白 CLUT 概念背后的想法。 :(
  • 嘿@emcconville!我刚刚仔细检查了两张图片,看起来它们是不同的。检查this!颜色不匹配。
  • 这绝对是最好的解决方案——你可能只需要在加载输入文件后设置-colorspace RGB
  • 请记住,-clut 将在源图像上使用interpolations,四舍五入 + 加权平均值可能会影响结果。您可以定义行为 (see examples here)。但我认为马克是对的,你应该确保色彩空间是RGB 而不是sRGB
  • 感谢您的帮助! CLUT 方法似乎对我不起作用。我总是在预期结果和实际结果之间存在颜色不一致。
【解决方案2】:

UGGGGHHH - 您的解决方案非常丑陋!我无法在 cmets 中解释它,但如果您要这样做,请注意以下几点:

  • 如果您使用 shell 变量,则必须引用它们,否则您总会遇到很多问题,尤其是名称中带有空格的文件

  • 不要多次运行 magick 一次就够了,它会严重减慢速度,还会降低 JPEG 等图像的质量

所以,尽可能地坚持您的解决方案:

#!/bin/bash

INPUT_FILE=$1
OUTPUT_FILE=$2

convert "$INPUT_FILE" \
   -fill 'rgba(0,0,0,0.0)'   -opaque 'rgb(0, 0, 0)' \
   -fill 'rgb(253,0,252)'    -opaque 'rgb(1, 1, 1)' \
   -fill 'rgb(252,0,23)'     -opaque 'rgb(2, 2, 2)' \
   ...
   ...
   -fill 'rgb(253, 125, 33)' -opaque 'rgb(3,3,3)' "$OUTPUT_FILE"

【讨论】:

  • 谢谢@Mark Setchell!好吧,我知道我的解决方案很丑陋,否则我不会在这里寻求帮助 ;) 你知道如何用 CLUT 制作它吗?
  • Eric (@emcconville) 的解决方案是可行的方法 - 当他完成了艰苦的工作时,我不喜欢踩他的脚趾。他可能会在大约 3 小时后上线,并且非常熟练且反应迅速,现在您已经发现了一个小问题 - 可能只是色彩空间。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2017-01-03
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多