5

Мне интересно, есть ли способ распознать (и, возможно, переместить / удалить) черно-белые фотографии в папке, содержащей черно-белые и цветные изображения? Я использую Ubuntu Linux.

2 ответа2

7

Если вы устанавливаете 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, поэтому вам нужно будет определить порог, при котором вы считаете что-то серым в зависимости от ваших исходных файлов.

1

Используя установку Image Magick 7.0.8 под Windows 10, я добился успеха, используя преобразование 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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .