Я хочу рассчитать Воспринимаемая яркость на основе формулы из этой ссылки этого изображения:
Идея состоит в том, чтобы зациклить каждый пиксель и вычислить его Воспринимаемую яркость по следующей формуле:
Pb = sqrt (0,241 R² + 0,691 G² + 0,068B²)
, затем сложите все значения и вычислите среднее значение.
Вот код, который я написал:
import cv2
from math import sqrt
img = cv2.imread('e.png')
H, W = img.shape[:2]
pr = 0.241
pg = 0.691
pb = 0.068
p = []
for h in range(0, H):
for w in range(0, W):
p.append(sqrt(pr * pow(img[h][w][2], 2) + pg * pow(img[h][w][1], 2) + pb * pow(img[h][w][0], 2)))
arr = np.reshape(p, (H, W))
cv2.imwrite('loop_img.jpg', arr)
print(np.mean(arr))
Изображение, которое я получил в конце, таково:
А среднее значение составляет 82.04557421656007
Однако, когда я повторял один и тот же процесс, используя numpy (чтобы избежать зацикливания над каждымпиксель), я получил разные значения!
Вот код, который я использовал:
import cv2
import numpy as np
img = cv2.imread('e.png')
b, g, r = cv2.split(img)
pr = 0.241
pg = 0.691
pb = 0.068
P = np.sqrt(pr * pow(r, 2) + pg * pow(g, 2) + pb * pow(b, 2))
cv2.imwrite('np_img.jpg', P)
print(np.mean(P))
Я получил следующее изображение:
А среднее значение равно 1.6438602314083277
Самое странное, что когда я применил те же методы к случайному массиву numpy, я получил похожие результаты!
import numpy as np
import cv2
from math import sqrt
pr = 0.241
pg = 0.691
pb = 0.068
arr = np.array([[[255, 127, 0],
[255, 127, 0]],
[[255, 133, 0],
[255, 133, 0]],
[[255, 138, 0],
[255, 138, 0]]])
b, g, r = cv2.split(arr)
p = []
for h in range(0, 3):
for w in range(0, 2):
print(arr[h][w])
p.append(sqrt(pr * pow(arr[h][w][2], 2) + pg * pow(arr[h][w][1], 2) + pb * pow(arr[h][w][0], 2)))
arr_p = np.reshape(p, (3, 2))
print('arr_p:', arr_p)
np_p = np.sqrt(pr * pow(r, 2) + pg * pow(g, 2) + pb * pow(b, 2))
print('np_ap:', np_p)
print('loop_mean:', np.mean(arr_p))
print('numpy_mean:', np.mean(np_p))
Полученные результаты:
arr_p: [[124.7671391 124.7671391 ]
[129.01472397 129.01472397]
[132.59375551 132.59375551]]
np_ap: [[124.7671391 124.7671391 ]
[129.01472397 129.01472397]
[132.59375551 132.59375551]]
loop_mean: 128.79187285939827
numpy_mean: 128.79187285939827
Есть ли какое-либо объяснение, почему я получил разные результаты с изображением и схожие результаты со вторым массивом?(это может быть связано с типом элементов массива?)
Примечание: Я использую
python==3.6
numpy==1.16.1
opencv-contrib-python==4.0.0.21
opencv-python==4.0.0.21