Что некоторые методы должны проанализировать яркость изображения с помощью Python?

Какая версия PHP у вас есть? PHP 5.3.0 и более поздние версии имеют встроенный Fileinfo, но в Windows вы должны включить его вручную в php.ini. Вы можете найти дополнительную информацию в документации .

23
задан cmcginty 16 August 2010 в 05:09
поделиться

4 ответа

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

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

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

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

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

     по умолчанию яркость (im_file):
    im = Image.open (im_file)
    stat = ImageStat.Stat (im)
    r, g, b = стат. среднее
    вернуть math.sqrt (0,241 * (r ** 2) + 0,691 * (g ** 2) + 0,068 * (b ** 2))
    
  4. Среднеквадратичное значение пикселей, затем преобразование в «воспринимаемую яркость».

     по умолчанию яркость (im_file):
    im = Image.open (im_file)
    stat = ImageStat.Стат (im)
    r, g, b = стат. среднеквадр.
    вернуть math.sqrt (0,241 * (r ** 2) + 0,691 * (g ** 2) + 0,068 * (b ** 2))
    
  5. Вычислите «воспринимаемую яркость» пикселей, а затем верните среднее значение.

     яркость по умолчанию (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))
    для r, g, b в im.getdata ())
    сумма возврата (gs) /stat.count [0]
    

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

50
ответ дан 29 November 2019 в 01:22
поделиться

код ниже даст Вам, уровень яркости изображения от 0-10

1 вычисляет среднюю яркость изображения после преобразования изображения к формату HSV с помощью opencv.

2 находят, где это значение находится в списке диапазона яркости.

 import numpy as np
 import cv2
 import sys
 from collections import namedtuple

#brange brightness range
#bval brightness value
BLevel = namedtuple("BLevel", ['brange', 'bval'])

#all possible levels
_blevels = [
    BLevel(brange=range(0, 24), bval=0),
    BLevel(brange=range(23, 47), bval=1),
    BLevel(brange=range(46, 70), bval=2),
    BLevel(brange=range(69, 93), bval=3),
    BLevel(brange=range(92, 116), bval=4),
    BLevel(brange=range(115, 140), bval=5),
    BLevel(brange=range(139, 163), bval=6),
    BLevel(brange=range(162, 186), bval=7),
    BLevel(brange=range(185, 209), bval=8),
    BLevel(brange=range(208, 232), bval=9),
    BLevel(brange=range(231, 256), bval=10),
]


def detect_level(h_val):
     h_val = int(h_val)
     for blevel in _blevels:
        if h_val in blevel.brange:
            return blevel.bval
    raise ValueError("Brightness Level Out of Range")


 def get_img_avg_brightness():
     if len(sys.argv) < 2:
        print("USAGE: python3.7 brightness.py <image_path>")
        sys.exit(1)
     img = cv2.imread(sys.argv[1])
     hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
     _, _, v = cv2.split(hsv)

     return int(np.average(v.flatten()))

 if __name__ == '__main__':

     print("the image brightness level is: 
            {0}".format(detect_level(get_img_avg_brightness())))
1
ответ дан 29 November 2019 в 01:22
поделиться

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

При использовании ImageMagick (с привязками PythonMagick ) я бы предложил использовать команду identify с установленной опцией «подробный». Это предоставит вам среднее значение для каждого канала, избавляя вас от необходимости суммировать и усреднять гистограмму - вы можете просто умножить каждый канал напрямую.

2
ответ дан 29 November 2019 в 01:22
поделиться

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

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

2
ответ дан 29 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: