Как определить, является ли изображение темным? (высокая контрастность, низкая яркость)

#image #graphics #image-processing #imagemagick

#изображение #графика #обработка изображений #imagemagick ( магия изображений)

Вопрос:

В рамках проекта, над которым я работаю, мне нужно просто проанализировать изображение с помощью приложения CLI Linux и определить, является ли его темное изображение (высокая контрастность, низкая яркость).

Пока что я понял, что могу использовать ImageMagick для получения подробной информации об изображении, но не уверен, как использовать эти данные … или есть более простое решение?

Комментарии:

1. Что означает «темный»? Вам нужно это определить. Например, это может означать, что вы усредняете все пиксели и классифицируете изображение как «темное», если результат ниже заданного порога. Получив свое определение, вы можете работать с пиксельными данными и начинать придумывать некоторый код.

Ответ №1:

Вы можете масштабировать изображение до очень маленького размера — размера 1×1 пиксель и представляющего «средний цвет» вашего исходного изображения:

  convert  original.jpeg  -resize 1x1  1pixel-original.jpeg
 

Затем сначала исследуйте цвет этого отдельного пикселя

 convert  1pixel-original.jpeg  1pixel-jpeg.txt 
 

затем

 cat 1pixel-jpeg.txt

  # ImageMagick pixel enumeration: 1,1,255,srgb
  0,0: (130,113,108)  #82716C  srgb(130,113,108)
 

Вы также можете получить тот же результат за один раз:

 convert  original.jpeg  -resize 1x1  txt:-

  # ImageMagick pixel enumeration: 1,1,255,srgb
  0,0: (130,113,108)  #82716C  srgb(130,113,108)
 

Таким образом, вы получаете значения для вашего «среднего пикселя» в исходном цветовом пространстве вашего входного изображения, которое вы можете оценить по его «яркости» (как бы вы это ни определяли).

Вы можете преобразовать свое изображение в оттенки серого, а затем изменить его размер. Таким образом, вы получите значение серого как показатель «яркости»:

 convert  original.jpeg  -colorspace gray  -resize 1x1  txt:-

  # ImageMagick pixel enumeration: 1,1,255,gray
  0,0: (117,117,117)  #757575  gray(117,117,117)
 

Вы также можете преобразовать свое изображение в пространство HSB (оттенок, насыщенность, яркость) и проделать то же самое:

 convert  original.jpeg  -colorspace hsb  -resize 1x1  txt:-

  # ImageMagick pixel enumeration: 1,1,255,hsb
  0,0: ( 61, 62,134)  #3D3E86  hsb(24.1138%,24.1764%,52.4941%)
 

Значения «яркости», которые вы видите здесь (либо 134 , #86 либо 52.4941% ), вероятно, являются тем, что вы хотите знать.

Комментарии:

1. Работает ли это с воспринимаемой яркостью? Мне нужно объединить изображение в экранном режиме с несколькими изображениями, но некоторые из них должны быть темнее, чтобы результат выглядел нормально. Я подумал взять яркость известных мне «хороших изображений», а затем сделать темнее те, которые имеют меньшую яркость. Но я получаю аналогичные результаты с хорошими и плохими изображениями, любая помощь?

2. Это отличная идея; Я рассматривал сценарий автоматической смены обоев, который учитывал бы время суток; темные обои для ночного времени и яркие для дня. @y2josei вы можете сделать его более умным, применив какой-либо статистический анализ распределения к миниатюре большего размера, а не к 1×1; тем не менее, больше для написания сценария.