Фільтр зворотного баєра зображення


9

Майже всі датчики цифрової камери організовані в сітку фотосенсорів. Кожен фотодатчик чутливий до одного з основних кольорів : червоного, зеленого та синього. Те, як організовані фотосенсори, називається фільтром Байєра , після його винахідника Брайса Байєра з Істмена Кодака. Після зйомки зображення чотири фотосенсори складають значення RGB одного пікселя в отриманому зображенні. Ваше завдання - повернути цей процес і розфарбувати отримані пікселі відповідно до їх кольору фільтра. Заради простоти ми будемо ігнорувати корекцію гамми .

Наприклад: "нормальні" кроки фільтра вперед Bayer:

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

Етапи зворотного фільтра Байєра:

  • Піксель RGB з кольором (235, 168, 81) розділений на чотири пікселі зі значеннями RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).

Виклик

Вам слід написати найкоротшу можливу функцію чи програму, яка виконує такі дії:

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

    Bayer Filter - BGGR - графічне пояснення

  • Будемо вважати, що обидва зелені фотосенсори отримують однаковий сигнал, тому обидва значення G у матриці Байєра рівні значенню G у зображенні RGB.

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

Приклад

Даний файл як вхідний:

Мона Ліза

Отримане зображення має бути таким:

DeBayered Mona Lisa

Реалізація опорного пітона:

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")

Пам'ятайте: це а , тому найкоротший код виграє!


5
Майже отримав
припадк,

1
@Fatalize вибачте за це! ;-) Дивний ефект, чи не так?
agtoever

Інструкції показують клітинку з BGверхнього та GRнижнього рядків , а прикладне зображення - RGу верхньому та GBнижньому. Чи означає це, що будь-яка домовленість, яка ставить дві зелені комірки по діагоналі, є прийнятною? (інші будуть GB / RG та GR / BG.)
рівень річки Св.

@LevelRiverSt моїм наміром було дотримуватися BGGR (як зазначено в четвертій пульті виклику). Моя помилка, якщо фактичний приклад зображення в RGGB. Я виправлю це, як тільки я на своєму ноутбуці.
agtoever

Я не думаю, що ваш приклад є правильним, для одного він має дивний синій відтінок
orlp

Відповіді:


6

Pyth, 26 байт

MXm03H@GH.wsMsgLRRR,U2tU3'

Очікує ім'я вхідного файлу з лапками на stdin і записує в o.png. Приклад виводу:


Ви відповідаєте, це найкоротше досі. Я схильний це сприймати, але було б добре, якби ви могли додати пояснення, як працює ваша програма.
agtoever

Я просто використав продукт Kronecker , використовуючи відповідь з попереднього питання: codegolf.stackexchange.com/questions/78797/… .
orlp

6

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

Для цього використовується представлення 3d-масивів / матриць RGB-зображень у Matlab, а також продукт Kronecker, який саме те, що нам потрібно створити цей новий 2х2 "метапіксель" з кожного вихідного пікселя. Потім результат відображається у спливаючому вікні.

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

Зміна екрана:


Це [1:2;2:3]==nрозумно! Ви не можете видалити b=[a,a;a,a];?
Луїс Мендо

@LuisMendo Спасибі =) Це дійсно працює, я цього не очікував!
недолік

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

Mona Lisa із застосованим фільтром Байєра


2
Ласкаво просимо до PPCG, приємна перша відповідь!
Leaky Nun

4

Математика 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"]

зворотний байер


Не впевнений, але це, здається, не задовольняє " Візьміть ім'я файлу як вхідне "
agtoever

agtoever, Тепер він використовує як введення ім'я файлу замість зображення.
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 зображення після обробки

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.