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

79

如何使用 (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

8个回答

133

convert <img_in> -set colorspace Gray -separate -average <img_out> 对我来说是处理任何图像最好的选择。


4
谢谢 egor7 :),egor7 命令即使在 imagemagick 6.5.7 上也运行良好,当仅使用 convert <infile> -colorspace Gray <outfile> 时,该版本存在返回非常暗的图像的问题。我正在Heroku上使用rails+paperclip(imagemagick 6.5.8),并且使用了很多不同变量的 convert 命令得到了非常暗的图像,但是这个命令运行得很好 ;) 再次感谢。 - Rui Castro
12
在更新的ImageMagick版本中,似乎... -set colorspace ...应更改为-colorspace - Kenny Evitt
1
我需要即使在这种情况下也要提高亮度。convert -brightness-contrast 5x0 <infile> -set colorspace Gray -separate -average <outfile> 给了我几乎相同的亮度。 - One Guy Hacking
16
虽然这个方案得票最高,但我建议不要采用。我已经在我的代码中实施了它,但导致了多种奇怪的结果。最近一次,一个原本只包含黑色和品红色文本的白色背景文档被转换成了“2位灰度”图像(?),其中品红色被转换为白色,因此难以辨认。我发现的最佳解决方案是简单地使用convert source.jpg -colorspace Gray destination.jpg(请参见此处:https://dev59.com/xmsz5IYBdhLWcg3wuKMm),无论是结果还是时间都比其他方法好。 - Marco Spinaci
我遇到了这个烦人的错误:convert: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG pos-gray.png' @ warning/png.c/MagickPNGWarningHandler/1750.` - Alexander Mills

18

使用(r+g+b)/3方法将应用灰度效果,但图像仍将保持在sRGB中(这是该方法的预期行为)。您需要在-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

16

Fish shell 中批量转换图片:

对于文件名以 .jpg 结尾的每个文件;执行 convert -colorspace Gray 命令,将该文件转换为灰度图像格式,并覆盖原文件。


10
"Mogrify"是一种更为简洁的命令,可用于转换所有特定类型的文件。 - jsta
8
这里与 Fish shell 无关。 - Filip Czaplicki
7
在Bash shell中,将所有后缀为.jpg的文件转换为灰度图像:for file in *.jpg;do convert -colorspace Gray $file $file; done - Kyeno
使用 parallel 可显著减少转换时间并提高可读性:parallel convert -colorspace Gray {} {} ::: *.jpg - Sergey

15
在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


1

看起来你是用红色通道来做这个,比如在 convert test.png -colorspace OHTA -channel r -separate +channel gray_average.png 中。我更喜欢用绿色通道(我听说这种方式在电视上使用了很久,也许是最好的)。


我尝试了绿色和蓝色通道,即-channel G-channel B,但只得到了一张灰色图片。对我而言,只有-channel R有效。 - loved.by.Jesus

1

我主要使用convert将文档的彩色图片转换为灰度PDF文件,以进行OCR识别。我的最佳结果是使用Rec709Luminance。因此我建议使用。

convert colourpicture.png -grayscale Rec709Luminance greyscalepicture.png

简短的命令,美观的输出。


1
产生了过于暗淡的灰色。 - SzieberthAdam
@SzieberthAdam 我想这是个人口味问题。 ;) - loved.by.Jesus
1
也许吧。但将此结果与其他灰度转换结果进行比较:https://github.com/SzieberthAdam/cvd-palette/blob/master/haldclut/gray/compare.png 您还可以在父目录中比较哈尔德·克鲁特。通常的目标是获得相同亮度或感知亮度的灰色。请看看GIMP和Photoshop(PSN)在这方面的表现。最好选择具有最多难以阅读文本行的那些。 - SzieberthAdam
@SzieberthAdam 感谢您详细的解释,特别是测试图片。基于事实进行讨论是一种享受!我仍然必须说,如果“目标是获得相同亮度或感知亮度的灰度”,那么我完全同意你:我在答案中提供的方法效果较差。不过,问题并没有明确任何关于灰度转换目的的内容 - 您只是提出了一个可能的目标 - 因此,对于某些任务,我的答案甚至可以是最优的(!)。举个例子,对于灰度化文本文档或书籍(就像我之前提到的)。 - loved.by.Jesus
1
同意。针对不同的目的,选择不同的转换方式最为合适。你提到通常会使用灰度转换进行OCR,我相信你在这个目标上的判断力。我只是想表明,对于其他用途,比如照片编辑等,使用GIMP 2.10或Photoshop(不是最新版本)或者在命令行中使用ImageMagick和其中一个Hald cluts进行转换可能更值得一试。 - SzieberthAdam

0

我在灰度图像上使用这个工具,效果很好(我从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 

0

我遇到了一个问题,需要将sRGB颜色空间转换为灰度颜色空间。在进行转换之前,我必须手动删除Alpha通道。否则,图像将保持sRGB。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接