Преобразование изображения в оттенки серого с использованием только матрицы (без функции BGR2GRAY) в Python
Я пытаюсь преобразовать изображение в оттенки серого без использования OpenCV или Numpy. Пример: матрица моего изображения
[[[116 116 117]
[115 115 116]
[117 115 115]
...,
[135 138 142]
[137 139 139]
[137 139 139]]
[[116 116 116]
[116 116 116]
[114 116 116]
...,
[135 139 140]
[135 137 138]
[135 137 138]]
[[115 118 114]
[115 118 114]
[112 116 115]
...,
[132 141 141]
[134 137 141]
[133 136 140]]
...,
[[ 35 44 163]
[ 31 40 159]
[ 10 33 158]
...,
[ 14 48 53]
[ 24 56 55]
[ 27 59 58]]
[[ 24 38 156]
[ 19 33 151]
[ 7 28 145]
...,
[ 25 55 66]
[ 15 59 61]
[ 17 61 63]]
[[ 0 27 131]
[ 0 26 130]
[ 0 34 113]
...,
[ 11 39 55]
[ 6 28 56]
[ 4 26 54]]]
Используя функцию cv2.COLOR_BGR2GRAY, матрица имеет вид:
[[150 150 150 ..., 150 150 150]
[150 173 175 ..., 97 91 89]
[150 176 179 ..., 95 89 82]
...,
[150 66 67 ..., 152 154 152]
[150 62 59 ..., 152 152 152]
[150 62 64 ..., 155 154 151]]
Во-первых, я не понимаю, почему он возвращает 36 целых чисел, когда я дал 108, и как я могу сделать это вручную
Спасибо за вашу помощь:)
1 ответ
Вопрос 1
Вы получаете 36 целых чисел вместо 108, потому что у вашего исходного изображения было 3 канала (красный, зеленый, синий, или RGB). Когда вы конвертируете его в оттенки серого, вы выравниваете его только по одному каналу. 108 / 3 = 36
, выглядит вполне законно!
Вопрос 2
Преобразование вручную: существует несколько способов преобразования изображения RGB в оттенки серого, но наиболее простым будет взять среднее значение трех каналов, в основном (red_values + green_values + blue values) / 3
, Итак, возьмите исходный массив изображений и запустите:
gray_image = (image[:,:,0] + image[:,:,1] + image[:,:,2]) / 3
Выше предполагается, что ваш массив изображений находится в форме image.shape = (pixel_height, pixel_width, number_of_channels)
и что первые 3 канала представляют ваши каналы R,G и B, но это довольно стандартно