Какая версия PHP у вас есть? PHP 5.3.0 и более поздние версии имеют встроенный Fileinfo, но в Windows вы должны включить его вручную в php.ini
. Вы можете найти дополнительную информацию в документации .
Используя методы, упомянутые в вопросе, я придумал несколько разных версий.
Каждый метод возвращает близкое значение, но не совсем такое, как другие. Кроме того, все методы работают примерно с одинаковой скоростью, за исключением последнего, который намного медленнее в зависимости от размера изображения.
Преобразование изображения в оттенки серого, возврат средней яркости пикселей.
по умолчанию яркость (im_file):
im = Image.open (im_file) .convert ('L')
stat = ImageStat.Stat (im)
вернуть stat.mean [0]
Преобразовать изображение в оттенки серого, вернуть среднеквадратичную яркость пикселей.
по умолчанию яркость (im_file):
im = Image.open (im_file) .convert ('L')
stat = ImageStat.Stat (im)
вернуть stat.rms [0]
Среднее значение пикселей, затем преобразование в «воспринимаемую яркость».
по умолчанию яркость (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))
Среднеквадратичное значение пикселей, затем преобразование в «воспринимаемую яркость».
по умолчанию яркость (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))
Вычислите «воспринимаемую яркость» пикселей, а затем верните среднее значение.
яркость по умолчанию (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 (за некоторыми исключениями).
код ниже даст Вам, уровень яркости изображения от 0-10
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())))
Учитывая, что вы просто ищете среднее значение по всему изображению, а не значения яркости по пикселям, усреднение гистограммы PIL и применение функции яркости к выходным данным кажется лучшим подходом для этой библиотеки.
При использовании ImageMagick (с привязками PythonMagick ) я бы предложил использовать команду identify с установленной опцией «подробный». Это предоставит вам среднее значение для каждого канала, избавляя вас от необходимости суммировать и усреднять гистограмму - вы можете просто умножить каждый канал напрямую.
Я думаю, ваш лучший результат был бы при преобразовании RGB в оттенки серого по вашей любимой формуле с последующим построением гистограммы этого результата. Я не уверен, что было бы более подходящим для гистограммы - среднее значение или медиана, но на большинстве изображений они, вероятно, похожи.
Я не знаю, как выполнить преобразование в оттенки серого в PIL по произвольной формуле, но предполагаю, что это возможно.