Преобразуйте изображение в оттенки серого, используя только матрицу (без функции 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, и как я могу сделать это вручную

Спасибо за вашу помощь :)


person Mehdi    schedule 05.03.2018    source источник


Ответы (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, но это довольно стандартно.

person sacuL    schedule 05.03.2018
comment
На первый вопрос я получил, что 108/3 = 36, но как я могу узнать распределение каждой матрицы: я имею в виду, значения RGB записываются в столбцах или строках? благодарю за разъяснение - person Mehdi; 10.03.2018
comment
Обычно ваше изображение представляет собой трехмерный массив, в котором каждый канал представлен на последней оси. Например, учитывая [[[1 1 1][2 2 2][3 3 3]]], ваш R будет [1 1 1], ваш G будет [2 2 2], а ваш B будет [3 3 3]. - person sacuL; 10.03.2018
comment
если это так, то каково среднее значение приведенного выше примера (например, avg(116 115 117)=116, но в матрице серого мы имеем 150 . - person Mehdi; 12.03.2018
comment
Извините, я на самом деле перепутал свой [] в этом последнем комментарии, я хотел сказать [[[1 1 1]][[2 2 2]][[3 3 3]]], и в этом случае ваш R будет [1 1 1], ваш G будет [2 2 2], а ваш B будет [3 3]. 3]. Это имеет больше смысла? (обратите внимание, что в этом примере это будет изображение размером 1x3 пикселя) - person sacuL; 14.03.2018