Во-первых, спасибо, что прочитали мой вопрос.
Я хочу сделать черно-белое изображение шаблона Байера цветным изображением шаблона Байера.
Я получил изображение выше с шаблоном Байера с кодом ниже.
import numpy as np
im = cv2.imread('/content/drive/MyDrive/Colab Notebooks/Resources/lena.bmp')
im = cv2.resize(im,None,fx=1/3,fy=1/3,interpolation=cv2.INTER_NEAREST)
(height, width) = im.shape[:2]
(B,G,R) = cv2.split(im)
bayer = np.empty((height, width), np.uint8)
# strided slicing for this pattern:
# G R
# B G
bayer[0::2, 0::2] = G[0::2, 0::2] # top left
bayer[0::2, 1::2] = R[0::2, 1::2] # top right
bayer[1::2, 0::2] = B[1::2, 0::2] # bottom left
bayer[1::2, 1::2] = G[1::2, 1::2] # bottom right
bayer = cv2.resize(bayer,None,fx=3,fy=3,interpolation=cv2.INTER_NEAREST)
cv2.imwrite('/content/drive/MyDrive/Colab Notebooks/Resources/bayer.png',bayer
Я ничего не кодировал без цвета, но мой результат не имеет цвета. Я не понимаю, почему. Может кто-нибудь сказать мне, как я могу получить цвет с моего изображения, но с фильтром Байера?
Я хочу сделать изображение 2 как изображение 3.






Похоже, вы в правильном направлении...
Мы не можем получить цветной вывод, когда массив NumPy bayer является двумерным массивом.
Для получения цветного изображения мы хотим, чтобы это был 3D-массив (с применением формата пикселей BGR).
Мы также должны учитывать, что пиксель в градациях серого применяет r=g=b, а результат, который мы хотим, применяет r!=g!=b.
Для получения желаемого результата мы можем использовать следующие этапы перед использованием cv2.resize:
Преобразование bayer из оттенков серого в BGR (преобразование просто делает r=g=b для каждого пикселя):
bayer = cv2.cvtColor(bayer, cv2.COLOR_GRAY2BGR)
"Сложная часть":
Для всех «зеленых пикселей Байера» установите значения красного и синего на ноль.
Для всех «красных байеровских пикселей» установите значения зеленого и синего на ноль.
Для всех «синих пикселей Байера» установите значения зеленого и красного цвета на ноль.
bayer[0::2, 0::2, 0::2] = 0 # Green pixels - set the blue and the red planes to zero (and keep the green)
bayer[0::2, 1::2, 0:2] = 0 # Red pixels - set the blue and the green planes to zero (and keep the red)
bayer[1::2, 0::2, 1:] = 0 # Blue pixels - set the red and the green planes to zero (and keep the blue)
bayer[1::2, 1::2, 0::2] = 0 # Green pixels - set the blue and the red planes to zero (and keep the green)
Измените размер цветного bayer изображения после установки соответствующих цветовых каналов на нули.
Примечание:
Установка цветовых каналов на нули используется только в демонстрационных целях.
Размещение нулей математически неверно, потому что делает пиксели намного темнее.
Пример кода:
import numpy as np
import cv2
im = cv2.imread('lena.bmp')
im = cv2.resize(im,None,fx=1/3,fy=1/3,interpolation=cv2.INTER_NEAREST)
(height, width) = im.shape[:2]
(B,G,R) = cv2.split(im)
bayer = np.empty((height, width), np.uint8)
# strided slicing for this pattern:
# G R
# B G
bayer[0::2, 0::2] = G[0::2, 0::2] # top left
bayer[0::2, 1::2] = R[0::2, 1::2] # top right
bayer[1::2, 0::2] = B[1::2, 0::2] # bottom left
bayer[1::2, 1::2] = G[1::2, 1::2] # bottom right
#bayer = cv2.resize(bayer, None, fx=3, fy=3, interpolation=cv2.INTER_NEAREST)
bayer = cv2.cvtColor(bayer, cv2.COLOR_GRAY2BGR) # Convert from Grayscale to BGR (r=g=b for each pixel).
bayer[0::2, 0::2, 0::2] = 0 # Green pixels - set the blue and the red planes to zero (and keep the green)
bayer[0::2, 1::2, 0:2] = 0 # Red pixels - set the blue and the green planes to zero (and keep the red)
bayer[1::2, 0::2, 1:] = 0 # Blue pixels - set the red and the green planes to zero (and keep the blue)
bayer[1::2, 1::2, 0::2] = 0 # Green pixels - set the blue and the red planes to zero (and keep the green)
bayer = cv2.resize(bayer, None, fx=3, fy=3, interpolation=cv2.INTER_NEAREST)
cv2.imwrite('bayer.png', bayer)
Примечание:
Мы можем получить тот же эффект, установив каналы im на нули, но это как бы упускает суть, потому что входные данные должны быть в формате Байера.
Результат:
Вы знаете математические операции, которые вам нужно сделать? покажите какой-нибудь код, который вы пытались перевести на python.