2

具体来说,对于给定的图像,我试图将每个像素的 RGB 值减少 100。

例如,如果一个像素有 R: 232, G: 40, B: 120,那么我希望新的 RGB 值是 R: 132, G: 0, B: 20。

我已经尝试过在 ImageMagick 论坛上找到的解决方案:

convert input.jpg -channel R -evaluate subtract 25700 \
-channel G -evaluate subtract 25700 \
-channel B -evaluate subtract 25700 output.jpg

编辑:我使用 25700 的原因是因为显然您需要将 rgb 值乘以 257。100 * 257 = 25700。

虽然它一开始似乎可以工作(显然使图像变暗),但某些像素似乎不会改变,对于我正在做的事情来说,它们所做的至关重要(我正在对生成的图像进行修剪,试图修剪掉像素值为 0 的边框)。

一个常见的问题是我最终会得到一个 RGB 值为 3、0、0 的像素,但我希望该像素的 RGB 值为 0 并增加我减去的常数 - 但它没有似乎不起作用。

有任何想法吗?谢谢!

4

2 回答 2

4

老实说,我真的不明白25700你的命令行中的价值应该达到什么。

但是,我建议您使用更强大的-fx运算符来使用不同的命令行。看起来有点复杂,但希望更直观地理解......

但首先,我正在查看您的描述,发现您想120从当前的 R、G 和 B 颜色值中减去固定数量的 。所以这是一个灰色像素颜色......你可以在 ImageMagick 的颜色内置颜色列表中查找,它的名称是gray47

convert -list color | grep '(120,120,120)'
  gray47                srgb(120,120,120)                             X11 XPM 
  grey47                srgb(120,120,120)                             SVG X11 

这导致我执行以下命令:

   convert \
       input.jpg \
      -channel red   -fx 'r - gray47' \
      -channel green -fx 'g - gray47' \
      -channel blue  -fx 'b - gray47' \
       output.jpg

这种方式或编写命令可能会让您看到一些容易衍生的修改,如果您将来需要这些修改......

要立即弹出结果的预览窗口(不将其写入文件),您还可以将-show:其用作输出,如下所示:

   convert \
       input.jpg \
      -channel red   -fx 'r - gray47' \
      -channel green -fx 'g - gray47' \
      -channel blue  -fx 'b - gray47' \
      -show:

更新

如果要检查每个像素的真实差异,可以让 ImageMagick 打印出每个像素的颜色值:

convert  input.jpg   input.txt
convert  output.jpg  output.txt

.txt 文件的格式很容易理解,一旦您知道第一列给出了从零开始的像素坐标:123,456:表示:第 124 (!) 列,第 457 () 行。

现在,即使是自动化的脚本版本,您也可以将这两个 .txt 文件与您心中的内容进行比较,而无需求助于 Gimp。:-)

您甚至可以使用input.txtPerl-、Ruby-、Python- 或 Shellscript 并将其应用于每个像素值,以分散120每个通道的值,将其保存为 output2.txt,然后将其转换回 JPEG:

convert  output2.txt  output2.jpg

然后寻找两个输出图像之间的像素差异:

compare  output.jpg  output2.jpg  delta.jpg
compare  output.jpg  output2.jpg  view:

全白平面意味着“没有差异”,任何红色像素都会暗示某种增量。

现在,如果这个答案没有为我赢得投票,我不知道哪个会...... :-)

于 2012-08-07T19:00:01.033 回答
1

肯,不,你不需要写一个大的解析器。使用一些 shell 命令很容易完成。首先测试它们,然后将它们放入 Shell 或 Batch 脚本中。像这样的东西(作为 Bash 脚本):

#!/bin/bash

echo " 注意:这个脚本可能需要很长时间才能完成......"
echo " (此脚本用于转换带有 Alpha 通道的 PNG 文件。"
echo " 对于其他类型的图片,需要稍微修改一下。)"
回声
echo " 此脚本采用 8 位 RGBA 输入图像并创建更暗的输出图像。"
echo " 它的方法是:每个颜色通道的数值减去 100 的值。"
回声

输入="${1}"

_im_header=$(identify -format "%W,%H" "${input}")

echo "# ImageMagick 像素枚举:${_im_header},255,rgba" > input-minus-120.txt

转换 "${input}" input.txt

猫输入.txt \
   | \
     sed 's#) .*$#)#; s###g; s#:#:#; s#(##; s#)##; s#,##g; s##,#'\
   | \
     同时读取坐标红绿蓝阿尔法;做
        回声 -n "${坐标}";
        回声-n“(”;
        echo -n "$(($red - 100)),";
        echo -n "$(($green - 100)),";
        echo -n "$(($blue - 100)),";
        回声 -n "$(($alpha))";
        回声-n“)”;
        回声;
     完毕 \
   | sed 's#-[0-9]*#0#g' \
>> 输入-减-120.txt

转换 input-minus-120.txt output-minus-120.jpg

该脚本需要 153 秒才能在 MacBook Pro 上运行,处理 750 kByte 的 1080x889 像素 PNG 文件。

生成的 input.txt 有 960120 行(PNG 中的像素数)。

所以这个蛮力 shell 脚本的性能大约是 6275 像素/秒。

于 2012-08-08T20:32:49.917 回答