在 ImageMagick 命令行中将 RGB 转换为灰度

Posted

技术标签:

【中文标题】在 ImageMagick 命令行中将 RGB 转换为灰度【英文标题】:Convert RGB to Grayscale in ImageMagick command-line 【发布时间】:2012-10-30 08:15:48 【问题描述】:

如何使用 (r+g+b)/3 方法将 RGB 图像(3 通道)转换为灰度图像? 我浏览了一个示例页面:http://www.imagemagick.org/Usage/color_mods/#grayscale 但所需的方法:

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

给了我一个错误的结果 - 结果图像仍然有 3 个通道。

您可以通过运行命令来检查这一点:identify -format "%[colorspace] <== %f\n" *.png

【问题讨论】:

【参考方案1】:

convert <img_in> -set colorspace Gray -separate -average <img_out> 为我提供任何图像的最佳结果。

【讨论】:

感谢 egor7 :) egor7 命令即使在仅使用 convert <infile> -colorspace Gray <outfile> 时会出现返回非常暗图像的问题的 imagemagick 6.5.7 上也能正常工作。我在heroku(imagemagick 6.5.8)上使用rails+paperclip,并且得到了非常暗的图像,其中包含convert命令的许多不同变体。这个效果很好;)再次感谢。 至少在较新版本的 ImageMagick 中,... -set colorspace ... 似乎应该是 -colorspace 即便如此,我也需要提高亮度。 convert -brightness-contrast 5x0 <infile> -set colorspace Gray -separate -average <outfile> 给了我几乎相同的亮度。 我建议不要使用此解决方案,即使它是投票最多的解决方案。我已经在我的代码中实现了它,它给我带来了多个奇怪的结果,最近一次将最初仅包含白色背景上的黑色和洋红色文本的文档制作为“2 位灰度”图像(?),洋红色正在被转换变成白色 - 因此难以辨认。在结果和时间方面,我发现的最佳解决方案只是 convert source.jpg -colorspace Gray destination.jpg(请参见此处:***.com/questions/7708368/…)。【参考方案2】:

使用(r+g+b)/3 方法将应用灰度效果,但图像将保持为 sRGB(这是此方法的预期行为)。您需要指定所需的colorspace 以及-fx 命令。

convert test.png -fx '(r+g+b)/3' -colorspace Gray gray_fx_average.png

通过identify -format "%[colorspace] <== %f\n" gray_fx_average.png验证

Gray <== gray_fx_average.png

【讨论】:

【参考方案3】:

在Fish shell 中批量转换图片:

for file in *.jpg; convert -colorspace Gray $file $file; end;

【讨论】:

mogrify 是一个更紧凑的命令,用于转换一种类型的所有文件 这里没有特定于 Fish shell 的内容。 或在 Bash shell 中:for file in *.jpg;do convert -colorspace Gray $file $file; done 使用parallel 可以显着减少转换时间并提高可读性:parallel convert -colorspace Gray ::: *.jpg【参考方案4】:

Imagemagick 命令行中的几种方法是:

convert test.png -grayscale average gray_average.png

or

convert test.png -colorspace OHTA -channel r -separate +channel gray_average.png

or

convert test.png -intensity average -colorspace gray gray_average.png

or

convert test.png -colorspace HSI -channel blue -separate +channel gray_average.png

https://imagemagick.org/script/command-line-options.php#grayscale https://imagemagick.org/script/command-line-options.php#intensity https://imagemagick.org/script/command-line-options.php#colorspace

【讨论】:

【参考方案5】:

看来您正在使用红色频道来执行此操作,在 转换 test.png -colorspace OHTA -channel r -separate +channel gray_average.png 我更喜欢绿色频道(我听说这种方式在古代电视上很有效,也许是最好的)

【讨论】:

我尝试了绿色和蓝色通道,即-channel G-channel B,得到的只是一张灰色的图片。对我来说只有-channel R 有效。【参考方案6】:

我用它来处理灰度图像(我从 PNG 转换):

ls ./*.png | xargs -L1 -I  convert  -strip -interlace JPEG -sampling-factor 4:2:0 -gaussian-blur 0.05 -colorspace Gray -quality 20  .jpg

我将它用于扫描的黑白页面,将它们变成灰度图像(额外的参数会清除前一页的阴影):

ls ./*.png | xargs -L1 -I  convert  -strip -interlace JPEG -sampling-factor 4:2:0 -gaussian-blur 0.05 -colorspace Gray -quality 20 -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 .jpg 

【讨论】:

【参考方案7】:

我主要使用 convert 将文档的彩色图片转换为灰度 pdf 文档以执行 OCR。我最好的结果是使用Rec709Luminance。所以我推荐

convert colourpicture.png -grayscale Rec709Luminance greyscalepicture.png

简短的命令,漂亮的输出。

【讨论】:

产生太深的灰色。 @SzieberthAdam 我想这是一个品味问题。 ;) 也许吧。但是将此结果与其他灰度转换进行比较。:github.com/SzieberthAdam/cvd-palette/blob/master/haldclut/gray/… 您也可以在父目录中比较 hald cluts。通常目标是获得相同亮度或感知亮度的灰度。看看 gimp 和 Photoshop (psN) 在这个意义上的表现如何。最好的是那些难以阅读的文本行数最多的那些。 @SzieberthAdam 感谢您的详细解释,尤其是测试图片。很高兴根据事实进行讨论!我仍然不得不说,如果“目标是获得相同亮度或感知亮度的灰色”,那么我完全同意你的看法:我在回答中提供的方法表现不佳。 然而,这个问题没有具体说明灰度转换的目标——你只是争论了一个可能的目标——因此,对于某些任务,我的答案甚至可能是最佳的(!)。举个例子,用于灰度文本文档或书籍(正如我已经提到的)。 同意。对于不同的目标,不同的转换效果最好。您提到您通常为 OCR 进行灰度转换,我相信您对该目标的转换判断。我只是想表明,对于照片编辑等其他用途,可能值得使用 GIMP 2.10 或 photoshop(不是最新版本)或在命令行中使用 imagemagick 和一个 hald cluts 进行转换。【参考方案8】:

我在将 sRGB 颜色空间转换为 灰色 颜色空间时遇到了问题。我必须在转换前手动删除 Alpha 频道。在其他情况下,图像将保持 sRGB。

convert image_original.tga -alpha off -set colorspace Gray image_converted.tga

【讨论】:

以上是关于在 ImageMagick 命令行中将 RGB 转换为灰度的主要内容,如果未能解决你的问题,请参考以下文章

imagemagick 将 RGB PNG 转换为 CMYK PDF

将 ImageMagick 命令转换为 GraphicsMagick

ImageMagick 将PDF转图片命令

ImageMagick 命令行:将 PDF 转换为高清图像

图片处理命令行工具ImageMagick介绍

在命令行中快速调整图像大小(需要ImageMagick)