Каковы некоторые методы анализа яркости изображения с помощью Python? - PullRequest
19 голосов
/ 16 августа 2010

Я хотел бы получить несколько советов по выполнению простого анализа изображений в python. Мне нужно рассчитать значение для «яркости» изображения. Я знаю, PIL - это библиотека goto для выполнения чего-то подобного. Есть встроенная функция гистограммы.

Что мне нужно, это «воспринимаемая яркость» значений, которые я могу решить, если необходимы дальнейшие корректировки изображения. Итак, каковы основные методы, которые будут работать в этой ситуации? Должен ли я просто работать со значениями RGB, или гистограмма даст мне что-то достаточно близкое?

Одним из возможных решений может быть объединение этих двух значений и генерирование средних значений R, G и B с использованием гистограммы, а затем применение формулы «воспринимаемой яркости».

Ответы [ 3 ]

45 голосов
/ 17 августа 2010

Используя методы, упомянутые в вопросе, я придумал несколько разных версий.

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

  1. Преобразование изображения в оттенки серого, возврат средней яркости пикселей.

    def brightness( im_file ):
       im = Image.open(im_file).convert('L')
       stat = ImageStat.Stat(im)
       return stat.mean[0]
    
  2. Преобразовать изображение в оттенки серого, вернуть среднеквадратическую яркость пикселей.

    def brightness( im_file ):
       im = Image.open(im_file).convert('L')
       stat = ImageStat.Stat(im)
       return stat.rms[0]
    
  3. Средние пиксели, а затем преобразовать в "воспринимаемую яркость".

    def brightness( im_file ):
       im = Image.open(im_file)
       stat = ImageStat.Stat(im)
       r,g,b = stat.mean
       return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))
    
  4. RMS пикселей, затем преобразуйте в «воспринимаемую яркость».

    def brightness( im_file ):
       im = Image.open(im_file)
       stat = ImageStat.Stat(im)
       r,g,b = stat.rms
       return math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2))
    
  5. Рассчитайте «воспринимаемую яркость» пикселей, затем вернитесреднее.

    def brightness( im_file ):
       im = Image.open(im_file)
       stat = ImageStat.Stat(im)
       gs = (math.sqrt(0.241*(r**2) + 0.691*(g**2) + 0.068*(b**2)) 
             for r,g,b in im.getdata())
       return sum(gs)/stat.count[0]
    

Обновить результаты теста Я запустил симуляцию на 200 изображениях.Я обнаружил, что методы № 2, № 4 дали почти идентичные результаты.Также методы № 3, № 5 также были почти идентичны.Метод № 1 внимательно следовал № 3, № 5 (за некоторыми исключениями).

2 голосов
/ 16 августа 2010

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

Если используется ImageMagick (с привязками PythonMagick ), я бы предложил использовать команду identifier с установленным параметром "verbose". Это предоставит вам среднее значение для каждого канала, избавив вас от необходимости суммировать и усреднять гистограмму & mdash; Вы можете просто умножить каждый канал напрямую.

1 голос
/ 17 августа 2010

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

Я не уверен, как выполнить преобразование в оттенки серого в PIL с помощьюпроизвольная формула, но я предполагаю, что это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...