Téměř všechny senzory digitálních fotoaparátů jsou uspořádány do mřížky fotocitačů. Každý fotosenzor je citlivý na jednu z primárních barev : červenou, zelenou a modrou. Způsob, jakým jsou tyto fotosenzory uspořádány, se nazývá Bayerův filtr , po jeho vynálezci Bryce Bayer společnosti Eastman Kodak. Po pořízení snímku vytvoří čtyři fotografické senzory ve výsledném snímku hodnotu RGB jednoho pixelu. Vaším úkolem je obrátit tento proces a vybarvit výsledné pixely podle jejich barvy filtru. Kvůli zjednodušení budeme ignorovat korekci gama .
Například: „normální“ dopředné kroky Bayerova filtru jsou:
- světelný paprsek s barvou Pantone Beeswax zasáhne senzor;
- BGGR (modrá – zelená / zelená – Červená) filtr to rozloží na čtyři paprsky.
- Tyto čtyři paprsky zasáhnou senzor, který zní: 81 – 168/168 – 235 (hodnoty senzoru se pohybují v rozmezí 0 – 255);
- Filtr Bayer to převádí na jeden RGB pixel s barvou (235, 168, 81).
Kroky zpětného filtru Bayer jsou:
- RGB pixel s barvou (235, 168, 81) je rozdělena na čtyři pixely s hodnotami RGB: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).
Výzva
Měli byste napsat nejkratší možnou funkci nebo program, který provede následující:
- Vezměte si název souboru jako na vstupu a výstupu obrázku DeBayered .
- Výstup může být zapsán do souboru nebo zobrazen na obrazovce.
- T Jeho výstup musí mít dvojnásobnou šířku a dvojnásobnou výšku než původní obrázek.
-
Každý pixel vstupního obrazu musí být mapován podle BGGR (modrá – zelená / zelená – červená) Bayerova filtru vzor, jak je graficky vysvětlen na následujícím obrázku:
-
Předpokládáme, že oba zelené fotosenzory přijímají stejný signál, takže obě hodnoty G v Bayerově matici se rovnají hodnotě G v obrazu RGB.
- Můžete nevrátit reprezentaci pole výsledného obrázku. Výstupem musí být obrázek nebo soubor (v libovolném vhodném formátu obrázku ), který lze zobrazit jako obrázek.
Příklad
Vzhledem k tomuto souboru jako vstupu:
Výsledný obrázek by měl být:
Implementace referenčního pythonu:
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")
Nezapomeňte: toto je code-golf , takže vyhrává nejkratší kód!
Komentáře
odpověď
Pyth, 26 bajtů
[email protected],U2tU3"
Očekává vstupní název souboru s uvozovkami na stdin a zapíše na o.png
. Příklad výstupu:
Komentáře
- Vaše odpověď je zatím nejkratší. Mám sklon to přijímat, ale bylo by hezké, kdybyste mohli přidat vysvětlení, jak váš program funguje.
- Právě jsem použil produkt Kronecker pomocí odpovědi z předchozí otázky: codegolf.stackexchange.com/questions/78797/… .
odpověď
Matlab, 104 92 bajtů
Tím se využívá 3d-maticová / maticová reprezentace obrazů RGB v Matlabu, stejně jako produkt Kronecker , což je přesně to, co potřebujeme k vytvoření tohoto nového 2 x 2 „metapixelu“ z každého zdrojového pixelu. Výstup se poté zobrazí ve vyskakovacím okně.
a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)
Změněná velikost obrazovky:
Komentáře
- To je
[1:2;2:3]==n
chytré!Nelze ‚ odebratb=[a,a;a,a];
? - @LuisMendo Thanks =) Opravdu to funguje, ne ‚ to neočekávám!
odpověď
Python 3, 259 254 bajtů
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")
Vstupní název souboru je uveden v standardní vstup. Výstupy do o.png
.
Příklad použití:
$ echo mona-lisa.jpg | python bayer.py
Komentáře
- Vítejte v PPCG, hezká první odpověď!
Odpověď
Mathematica 118 127 bajtů
Původní podání použilo jako vstup skutečný obrázek. Místo toho se používá název souboru.
Na obrazová data odkazovaného souboru se vztahují dvě pravidla nahrazení:
- Pro každý řádek matice obrazových dat nahraďte každý pixel { r, b, g} s modrým pixelem, {0,0, b} následovaným zeleným pixelem, {0, g, 0};
- Samostatně pro každý řádek matice obrazových dat, nahraďte každý pixel {r, b, g} zeleným pixelem {0, g, 0} následovaným červeným pixelem, {r, 0,0};
Then Riffle
(tj. Prokládat) matice vyplývající z 1 a 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"]
Komentáře
- Nevím, ale zdá se, že to ‚ nevyhovuje “ Vezměte název souboru jako ve vstupu “
- agtoever, nyní používá jako vstup název souboru namísto obrázku.
Odpověď
J, 100 9 6 90 bajtů
load"bmp" "o"writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin""
Toto je skript v J, který načte název souboru vstupního obrazu ze stdin a odešle výsledek do souboru s názvem o
. Vstupní i výstupní obrázky budou ve formátu bmp
. Očekává také, že bude zadán pouze název souboru, což znamená, že by neměly být přítomny úvodní a koncové mezery.
Ukázkové použití
$ echo -n mona.bmp | jconsole reversebayer.ijs
Vysvětlení
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"
Odpověď
Python 2, 256 275 bajtů
Nejprve jsem zjednodušil původní kód:
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")
Poté minify na:
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")
Výsledek v obrázku o.png
:
BG
nahoře řádek aGR
dole, zatímco ukázkový obrázek zobrazujeRG
nahoře aGB
na dně. Znamená to, že je přijatelné jakékoli uspořádání, které staví dvě zelené buňky na úhlopříčku? (ostatní by byly GB / RG a GR / BG.)