Обратный Байер Фильтр изображения

9

Почти все датчики цифровых камер организованы в виде сетки фотодатчиков. Каждый фотодатчик чувствителен к одному из основных цветов : красному, зеленому и синему. Способ организации этих фотодатчиков называется фильтром Байера , в честь его изобретателя Брайса Байера из Eastman Kodak. После съемки изображения четыре фотодатчика составляют значение RGB одного пикселя в полученном изображении. Ваша задача - обратить вспять этот процесс и раскрасить получившиеся пиксели в соответствии с их цветом фильтра. Ради простоты мы будем игнорировать гамма-коррекцию .

Например: «нормальные» шаги прямого фильтра Байера:

  • световой луч цвета пчелиного воска Pantone попадает на датчик;
  • фильтр BGGR (синий - зеленый / зеленый - красный) разбивает его на четыре луча.
  • Четыре луча попадают на датчик, который гласит: 81 - 168/168 - 235 (значения датчика в диапазоне от 0 до 255);
  • Фильтр Байера переводит это в один пиксель RGB с цветом (235, 168, 81).

Обратные шаги фильтра Байера:

  • RGB-пиксель с цветом (235, 168, 81) разбивается на четыре пикселя со значениями RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).

Вызов

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

  • Возьмите имя файла, как на входе, и выведите изображение DeBayered.
  • Вывод может быть записан в файл или отображен на экране.
  • Вывод должен быть в два раза больше ширины и в два раза больше высоты исходного изображения.
  • Каждый пиксель входного изображения должен отображаться в соответствии с шаблоном фильтра Байера BGGR (синий - зеленый / зеленый - красный), как это графически показано на следующем рисунке:

    Фильтр Байера - BGGR - графическое объяснение

  • Предположим, что оба зеленых фотодатчика получают один и тот же сигнал, поэтому оба значения G в матрице Байера равны значению G в изображении RGB.

  • Вы не можете вернуть представление массива результирующего изображения. Выходными данными должно быть изображение или файл (в любом подходящем формате изображения ), который может отображаться в виде изображения.

пример

Учитывая этот файл в качестве входных данных:

Мона Лиза

Полученное изображение должно быть:

Дебайер Мона Лиза

Реализация ссылочного Python:

from PIL import Image
import numpy
import sys

if len(sys.argv) == 1:
    print "Usage: python DeByer.py <<image_filename>>"
    sys.exit()

# Open image and put it in a numpy array
srcArray = numpy.array(Image.open(sys.argv[1]), dtype=numpy.uint8)
w, h, _ = srcArray.shape

# Create target array, twice the size of the original image
resArray = numpy.zeros((2*w, 2*h, 3), dtype=numpy.uint8)

# Map the RGB values in the original picture according to the BGGR pattern# 

# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]

# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]

# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]

# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]

# Save the imgage
Image.fromarray(resArray, "RGB").save("output.png")

Помните: это так выигрывает самый короткий код!

agtoever
источник
5
При прокрутке
чуть
1
@Fatalize прости за это! ;-) Странный эффект, не правда ли?
agtoever
Инструкции показывают ячейку с BGверхней строкой и GRснизу, а пример изображения показан RGсверху и GBснизу. Означает ли это, что любое расположение, которое ставит две зеленые ячейки по диагонали, является приемлемым? (остальные были бы GB / RG и GR / BG.)
Уровень Ривер Сент-
@LevelRiverSt Мое намерение состояло в том, чтобы придерживаться BGGR (как указано в четвертой контрольной пуле). Моя ошибка, если фактический пример изображения в RGGB. Я исправлю это, как только я на своем ноутбуке.
agtoever
Я не думаю, что ваш пример изображения правильный, для одного он имеет странный синий оттенок
orlp

Ответы:

6

Pyth, 26 байт

MXm03H@GH.wsMsgLRRR,U2tU3'

Ожидает входное имя файла с кавычками на стандартном вводе и пишет в o.png. Пример вывода:

orlp
источник
Вы отвечаете, самый короткий пока. Я склонен принять это, но было бы неплохо, если бы вы могли объяснить, как работает ваша программа.
agtoever
Я просто использовал продукт Kronecker, используя ответ на предыдущий вопрос: codegolf.stackexchange.com/questions/78797/… .
orlp
6

Матлаб, 104 92 байта

Это использует представление в виде матрицы / матрицы для изображений RGB в Matlab, а также продукт Kronecker, который является именно тем, что нам нужно для создания этого нового «метапикселя» 2x2 из каждого исходного пикселя. Выходные данные затем отображаются во всплывающем окне.

a=double(imread(input('')));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)

Изменен размер снимка экрана:

flawr
источник
Это [1:2;2:3]==nумно! Вы не можете удалить b=[a,a;a,a];?
Луис Мендо
@ LuisMendo Спасибо =) Это действительно работает, я не ожидал этого!
flawr
5

Python 3, 259 254 байта

from PIL.Image import*
o=open(input())
w,h=o.size
n=new('RGB',(2*w,2*h))
P=Image.putpixel
for b in range(w*h):x=b//h;y=b%h;r,g,b=o.getpixel((x,y));c=2*x;d=2*y;G=0,g,0;P(n,(c,d),(0,0,b));P(n,(c+1,d),G);P(n,(c,d+1),G);P(n,(c+1,d+1),(r,0,0))
n.save('o.png')

Имя входного файла задается в стандартном вводе. Выходы в o.png.

Пример использования:

$ echo mona-lisa.jpg | python bayer.py

Мона Лиза с применением обратного фильтра Байера

медь
источник
2
Добро пожаловать в PPCG, хороший первый ответ!
Дрянная Монахиня
4

Mathematica 118 127 байтов

Исходное представление использовало фактическое изображение в качестве входных данных. Вместо этого используется имя файла.

Он применяет два правила замены к данным изображения указанного файла:

  1. Для каждой строки матрицы данных изображения замените каждый пиксель {r, b, g} синим пикселем, {0,0, b}, за которым следует зеленый пиксель, {0, g, 0};
  2. Отдельно для каждой строки матрицы данных изображения замените каждый пиксель {r, b, g} зеленым пикселем {0, g, 0}, за которым следует красный пиксель {r, 0,0};

Затем Riffle(то есть чередование) матриц, полученных из 1 и 2.

Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]&

Image[Riffle[#/.{{_,g_,b_}:>(s=Sequence)[{0,0,b},{0,g,0}]}&/@(m=Import[#,"Data"]/255),#/.{{r_,g_,_}:>s[{0,g,0},{r,0,0}]}&/@m]]&["mona.jpg"]

обратный байер

DavidC
источник
Не уверен, но это, кажется, не удовлетворяет " Возьмите имя файла как во вводе "
всяком случае
Кроме того, теперь он использует в качестве входных данных имя файла вместо изображения.
DavidC
3

J 100 96 90 байт

load'bmp'
'o'writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin''

Это скрипт в J, который читает имя файла входного изображения из stdin и выводит результат в файл с именем o. Входные и выходные изображения будут оба вbmp формате. Также ожидается, что будет введено только имя файла, что означает отсутствие начальных и конечных пробелов.

Образец использования

$ echo -n mona.bmp | jconsole reversebayer.ijs

Образец

объяснение

A=:readbmp]stdin''  Store the image in A as a 2d array of 24-bit rgb ints
,                   Flatten it into a list
(3#256) #:          Convert each 24-bit int to a tuple of 8-bit r/g/b ints
2 1 1 0 {"1         Select each column in BGGR order
(2^0 8 8 16) *      Shift each color to make it a 24-bit rgb value
_2 ]\               Convert each row from dimensions 1x4 to 2x2
($A) $              Reshape the list of 2x2 matrices into a matrix of
                    2x2 matrices with dimensions matching A
,./                 Append the 2x2 matrices by column
,./                 Append the 2x2 matrices by row - This is now a matrix of
                     24-bit rgb values with twice the dimensions of A
'o'writebmp~        Write the image array to a bmp file named 'o'
миль
источник
0

Python 2, 256 275 байт

Сначала я упростил оригинальный код:

from PIL import Image
from numpy import*
import sys

# Open image and put it in a numpy array
srcArray = array(Image.open(sys.argv[1]), dtype=uint8)
w, h, _ = srcArray.shape

# Create target array, twice the size of the original image
resArray = zeros((2*w, 2*h, 3), dtype=uint8)

# Map the RGB values in the original picture according to the BGGR pattern# 

# Blue
resArray[::2, ::2, 2] = srcArray[:, :, 2]

# Green (top row of the Bayer matrix)
resArray[1::2, ::2, 1] = srcArray[:, :, 1]

# Green (bottom row of the Bayer matrix)
resArray[::2, 1::2, 1] = srcArray[:, :, 1]

# Red
resArray[1::2, 1::2, 0] = srcArray[:, :, 0]

# Save the imgage
Image.fromarray(resArray, "RGB").save("o.png")

Затем уменьшите до:

from PIL import Image
from numpy import*
import sys
a=array(Image.open(sys.argv[1]),dtype=uint8)
w,h,_=a.shape
b=zeros((2*w,2*h,3),dtype=uint8)
b[::2,::2,2]=a[:,:,2]
b[1::2,::2,1]=a[:,:,1]
b[::2,1::2,1]=a[:,:,1]
b[1::2,1::2,0]=a[:,:,0]
Image.fromarray(b,"RGB").save("o.png")

В результате на изображении o.png:

o.png изображение после обработки

Логика Найт
источник