как преобразовать изображение формата bayerrg8 в изображение RGB - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть камера, которая обеспечивает изображения в формате Bayer RG8.

Я использую лыжный образ для обработки изображений, но я не смог найти способ преобразовать формат Bayer RG8 в стандартный RGB (для отображенияна экране).

Есть ли способ сделать это с помощью Skimage?

Я нашел ссылку на конвертацию opencv, но я стараюсь избегать включения opencv в свое приложение (если оноабсолютно необходимо).

1 Ответ

1 голос
/ 04 ноября 2019

Поскольку вы не предоставили никаких входных данных, я взял серое изображение из здесь и преобразовал его в необработанный файл Bayer8 с упорядочением GBRG, используя ImageMagick следующим образом:

magick mandi.png -trim -depth 8 gray:bayer.bin

, что дает мне файл размером 1013x672 пикселя в 680,736 байт.

Затем я прочитал его вот так и превратил в изображение, которое лыжный маг может понять следующим образом:

#!/usr/bin/env python3

import numpy as np
from skimage.io import imsave

# Width and height of Bayer image, not original which is w/2 x h/2
w, h = 1013, 672
ow, oh = w//2, h//2

# Load in Bayer8 image, assumed raw 8-bit GBRG
bayer = np.fromfile('bayer.bin', dtype=np.uint8).reshape((h,w))

# Pick up raw uint8 samples
R  = bayer[1::2, 0::2]     # rows 1,3,5,7 columns 0,2,4,6
B  = bayer[0::2, 1::2]     # rows 0,2,4,6 columns 1,3,5,7
G0 = bayer[0::2, 0::2]     # rows 0,2,4,6 columns 0,2,4,6
G1 = bayer[1::2, 1::2]     # rows 1,3,5,7 columns 1,3,5,7

# Chop any left-over edges and average the 2 Green values
R = R[:oh,:ow]
B = B[:oh,:ow]
G = G0[:oh,:ow]//2 + G1[:oh,:ow]//2

# Formulate image by stacking R, G and B and save
out = np.dstack((R,G,B)) 
imsave('result.png',out)

И получите это:

enter image description here

Copyright Mathworks, Inc.

Конечно, существуют более сложные методы интерполяции, но этоявляется самым базовым, и вы можете взять и улучшить его!


Хорошо, у меня было некоторое время, и я попытался выполнить 2d-интерполяцию отсутствующих значений в массиве Байера. Я не уверен на 100% в своем ответе, но думаю, что он должен быть довольно близок.

По сути, я копирую исходный массив Байера с полным разрешением, перезаписываю все зеленые и синие образцы с помощью np.Nan и вызываютот красный. Затем я делаю 2d-интерполяцию для замены Nans.

То же самое для зеленого и синего, что дает это:

#!/usr/bin/env python3

import numpy as np
from skimage.io import imsave
from scipy.interpolate import griddata

def interp2d(im):
    """Interpolate in 2d array, replacing NaNs with interpolated values"""
    x, y = np.indices(im.shape)
    im[np.isnan(im)] = griddata(
       (x[~np.isnan(im)], y[~np.isnan(im)]),
       im[~np.isnan(im)],
       (x[np.isnan(im)], y[np.isnan(im)]))
    im = np.nan_to_num(im)
    return np.clip((im),0,255)

# Width and height of Bayer image
w, h = 1013, 672

# Calculate output width and height as multiples of 4
ow = (w//4) * 4
oh = (h//4) * 4

# Load in Bayer8 image, assumed raw 8-bit GBRG, reshape and make sides multiple of 4
bayer = np.fromfile('bayer.bin', dtype=np.uint8).reshape((h,w)).astype(np.float)[:oh, :ow]

# In following code you'll see "cell" which is the basic repeating 2x2 cell of a Bayer matrix
#
# cell = G B
#        R G
#

# Set everything not Red in bayer array to Nan, then replace Nans with interpolation
cell = np.array([[np.NaN, np.NaN],
                 [1.0   , np.NaN]])
R = bayer*np.tile(cell,(oh//2,ow//2))
R = interp2d(R).astype(np.uint8)

# Set everything not Green in bayer array to Nan, then replace Nans with interpolation
cell = np.array([[1.0   , np.NaN],
                 [np.NaN, 1.0   ]])
G = bayer*np.tile(cell,(oh//2,ow//2))
G = interp2d(G).astype(np.uint8)

# Set everything not Blue in bayer array to Nan, then replace Nans with interpolation
cell = np.array([[np.NaN, 1.0   ],
                 [np.NaN, np.NaN]])
B = bayer*np.tile(cell,(oh//2,ow//2))
B = interp2d(B).astype(np.uint8)

# Form image by stacking R, G and B and save
imsave('result.png',np.dstack((R,G,B)))

Ключевые слова : Python, Байер, Байер8, Дебайер, Де-Байер, Мозаика, Мозаика, изображение, сырье, CFA, Скимадж, scikit-изображение, обработка изображения.

...