如何识别黑白图像?

如何识别黑白图像?

我想知道是否有办法识别(并可能移动/删除)包含黑白和彩色图像的文件夹中的黑白照片?我正在使用 Ubuntu Linux。

答案1

如果您安装了 ImageMagick,您可以使用以下命令来测试某些东西是否是灰度:

$ convert bw.jpg -format "%[colorspace]" info:
Gray

安装:

sudo apt-get install imagemagick

因此,要完成所有这些操作并移动:

for i in /images/folder ; do
  if [ "$(convert $i -format "%[colorspace]" info:)" == "Gray" ]; then
      mv "$i" /images/folder/bw
  fi
done

但是,此方法仅测试图像所使用的颜色空间。图像可能使用完整的 RGB 颜色空间,但实际上仅使用灰度色调(理想情况下,这些色调应转换为灰度以达到最佳效果)。

为了仅使用灰色调,一种选择是将图像转换为 HSL 颜色,然后计算图像的平均饱和度。对于真正的灰度图像,平均饱和度将为零。对于 jpg 中的灰度图像,由于伪影,您将得到与完美灰度略有偏差的结果,并且通常它们并不完美,这取决于它们最终变成黑白的方式。

例如这张图片:

黑白漫画

如果我们将其转换为 HSL 并获得平均饱和度:

$ convert black-and-white-comics.jpg -colorspace HSL -channel g \
>         -separate +channel -format "%[fx:mean]" info:
0.00781798

图形输出范围是 0-1,因此您必须根据源文件定义一个阈值,在该阈值下您将某些东西视为灰度。

答案2

使用 Windows 10 下的 Image Magick 7.0.8 安装,我成功地使用以下批处理脚本中的 HSL 转换。它捕获了大多数黑白图片,当然除了那些棕褐色的图片:

@echo off
setlocal ENABLEDELAYEDEXPANSION
if not exist bw md bw
for %%f in (*.jpg) do (
for /f %%i in ('magick "%%f" -colorspace HSL -channel g -separate +channel -format "%%[fx:mean]" info:') do set VAR=%%i
if !VAR! LEQ 0.05 move "%%f" .\bw)

如果你想要删除而不是移动黑白图片,只需删除第 3 行,并将move "%%f" .\bw最后一行的命令替换为del /Q "%%f"

相关内容