如何使用CLUT通过ImageMagick以固定颜色重新着色灰度图像

时间:2017-09-08 12:49:54

标签: imagemagick

我对图像处理和ImageMagick都很陌生,但经过一些搜索后,我无法找到解决问题的简单方法。 我仍然不了解Color LookUp Table [CLUT]在ImageMagick中是如何工作的。

我有源图片:

enter image description here

我希望它看起来像这样:

enter image description here

我的想法是在源图像中我有灰度值,应该转换为颜色值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按我的意愿转换它。 我试图创造这样的东西:

enter image description here

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

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

我得到了这个:

enter image description here

所以,问题是,是否有可能为我的问题创建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制作它?

2 个答案:

答案 0 :(得分:3)

我能想到的几种技巧。

正常化

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

oringal将成为new

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

cult

将来

new clut

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

output

答案 1 :(得分:0)

UGGGGHHH - 您的解决方案非常难看!我无法在评论中解释它,但是如果你要做那样的事情,请注意以下几点:

  • 如果你使用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"