Если ваша камера поддерживает свойство CAP_PROP_CONVERT_RGB
, вы можете получить необработанные данные RCCC из VideoCapture. Установив для этого свойства значение False
, вы можете отключить преобразование в RGB. Таким образом, вы можете захватывать необработанные кадры, используя такой код (без проверки ошибок для простоты):
cap = cv2.VideoCapture(0)
# disable converting images to RGB
cap.set(cv2.CAP_PROP_CONVERT_RGB, False)
while(True):
ret, frame = cap.read()
# other processing ...
cap.release()
Я не знаю, работает ли это для вашей камеры.
Если вы можете каким-то образом получить необработанные изображения, вы можете применить метод удаления мозаики, описанный в приложении ANALOG DEVICES.
с оптимальным фильтром
Я написал следующий код на python, как описано в приложении, для проверки преобразования RCCC -> GREY.
import cv2
import numpy as np
rgb = cv2.cvtColor(cv2.imread('RGB.png'), cv2.COLOR_BGR2RGB)
c = cv2.cvtColor(rgb, cv2.COLOR_RGB2GRAY)
r = rgb[:, :, 0]
# no error checking. c shape must be a multiple of 2
rmask = np.tile([[1, 0], [0, 0]], [c.shape[0]//2, c.shape[1]//2])
cmask = np.tile([[0, 1], [1, 1]], [c.shape[0]//2, c.shape[1]//2])
# create RCCC image by replacing 1 pixel out of 2x2 pixel region
# in the monochrome image (c) with a red pixel
rccc = (rmask*r + cmask*c).astype(np.uint8)
# RCCC -> GRAY conversion
def rccc_demosaic(rccc, rmask, cmask, filt):
# RCCC -> GRAY
# use border type REFLECT_101 to give correct results for border pixels
filtered = cv2.filter2D(src=rccc, ddepth=-1, kernel=filt,
anchor=(-1, -1), borderType=cv2.BORDER_REFLECT_101)
demos = (rmask*filtered + cmask*rccc).astype(np.uint8)
return demos
# demo of the optimal filter
zeta = 0.5
kernel_4neighbor = np.array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 1, 0, 0],
[0, 0, 0, 0, 0]])/4.0
kernel_optimal = np.array([[0, 0, -1, 0, 0],
[0, 0, 2, 0, 0],
[-1, 2, 4, 2, -1],
[0, 0, 2, 0, 0],
[0, 0, -1, 0, 0]])/8.0
kernel_param = np.array([[0, 0, -1./4, 0, 0],
[0, 0, 0, 0, 0],
[-1./4, 0, 1., 0, -1./4],
[0, 0, 0, 0, 0],
[0, 0, -1./4, 0, 0]])
# apply optimal filter (Figure 7)
opt1 = rccc_demosaic(rccc, rmask, cmask, kernel_optimal)
# parametric filter with zeta = 0.5 (Figure 5)
opt2 = rccc_demosaic(rccc, rmask, cmask, kernel_4neighbor + zeta * kernel_param)
# PSNR
print(10 * np.log10(255**2/((c - opt1)**2).mean()))
print(10 * np.log10(255**2/((c - opt2)**2).mean()))
Входной RGB image :
Имитированное изображение RCCC:
Серое изображение из алгоритма удаления мозаики:
Еще одна вещь:
Если поставщик вашей камеры предоставляет SDK для Linux, он может иметь API для преобразования RCCC -> GREY или, по крайней мере, для получения необработанного изображения. Если преобразование RCCC -> GREY отсутствует в SDK, образец кода C # должен иметь его, поэтому я предлагаю вам взглянуть на их код.