Как я могу определить, является ли фотография черно-белой, используя такой инструмент, как GraphicsMagick? - Фотопедия
3 голосов
/ 26 июня 2015

У меня есть несколько файлов JPG, и я хочу автоматически определить, какие из них черно-белые. Все они закодированы в RGB.

Как мне это сделать с помощью инструментов командной строки?

Ответы [ 3 ]

3 голосов
/ 26 июня 2015

Опираясь на ответ Ромео:

Вы можете использовать imagemagick для преобразования в цветовое пространство HSV и получения статистики о распределении цветов.

HSV означает оттенок, насыщенность, значение

color space

Для истинного изображения в градациях серого насыщенность должна быть постоянно равна нулю.

Вы можете использовать следующую команду:

identify -colorspace HSL -verbose <infile>

и получите что-то вроде следующего для истинного изображения в оттенках серого (среди других выходных данных)

Red:
  min: 0 (0)
  max: 0 (0)
  mean: 0 (0)
  standard deviation: 0 (0)
  kurtosis: 0
  skewness: 0
Green:
  min: 0 (0)
  max: 0 (0)
  mean: 0 (0)
  standard deviation: 0 (0)
  kurtosis: 0
  skewness: 0
Blue:
  min: 1 (0.00392157)
  max: 255 (1)
  mean: 116.501 (0.456867)
  standard deviation: 102.305 (0.401195)
  kurtosis: -1.82316
  skewness: 0.0719237

Очевидно, Imagemagick не хочет менять название компонентов с красный, зеленый, синий на HSV, но сопоставление соответствует. Обратите внимание на канал Green / Saturation, он должен иметь максимум 0, тогда у вас есть оттенки серого.

Сканы, сепия и прочее

Для неидеальных входных изображений и для монохроматических изображений, похожих на сепию, я бы, вероятно, просто рассмотрел небольшую дисперсию оттенка. Кроме того, это все равно может не сработать, поскольку ненасыщенные цвета могут иметь любое значение оттенка без значительных изменений.

3 голосов
/ 26 июня 2015

Вы можете начать с convert, превратив изображение в оттенки серого и compare, превратив его в исходное изображение. Если изображение уже черно-белое, можно ожидать, что эти два изображения будут очень похожими; если он полноцветный, можно ожидать, что они будут другими.

Пояснение: Учитывая два комментария ниже, я думаю, что я не был достаточно ясен здесь. Конечно, черно-белая версия черно-белого изображения, хранящегося в формате RGB, скорее всего, не будет точно такой же, как исходное изображение, но оно должно быть довольно близко. Вычитание версии в оттенках серого из оригинала приведет к темной рамке со слабым призраком исходного изображения. Вы можете пороговое изображение, чтобы получить полностью черную рамку. С другой стороны, полноцветное изображение будет значительно отличаться от его аналога в градациях серого, а вычитание последнего из первого даст изображение, которое все еще имеет много цветов даже после определения порога (какие именно цвета зависят от того, как выполняется преобразование в градациях серого). сделано).

Другой вариант: Еще раз подумав о проблеме, другой вариант - преобразовать изображение в нейтральную белую точку и затем сравнить красный, зеленый и синий каналы. В цветном изображении они будут иметь значительные различия; на черно-белом изображении они должны быть очень похожими. Опять же, они могут не совпадать, в зависимости от того, как изображение было получено в первую очередь, но различия должны быть достаточно малы, чтобы их можно было легко отфильтровать. По сути, это та же идея, что и выше, но этот подход, возможно, более прост.

1 голос
/ 26 июня 2015

С imagemagic вы можете использовать команду идентификатора, чтобы получить информацию об изображении

identify -verbose image.jpg

На выходе вы можете проверить стандартное отклонение красного, синего и зеленого. Для изображений в градациях серого они должны иметь очень близкие значения (теоретически эквивалентные значения)
Постскриптум Вы также можете проверить на этом сайте некоторые скрипты для таких тестов

...