Filtr obrazu Reverse Bayer

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:

    Bayerův filtr - BGGR - grafické vysvětlení

  • 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:

Mona Lisa

Výsledný obrázek by měl být:

DeBayered Mona Lisa

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 , takže vyhrává nejkratší kód!

Komentáře

  • Když jsem roloval, téměř dostal záchvat
  • @Fatalize omlouvám se za to! 😉 Divný efekt, není to ‚ to?
  • Pokyny ukazují buňku s BG nahoře řádek a GR dole, zatímco ukázkový obrázek zobrazuje RG nahoře a GB 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.)
  • @LevelRiverSt mým záměrem bylo dodržovat BGGR (jak je uvedeno ve čtvrté odrážce). Moje chyba, pokud je skutečný ukázkový obrázek v RGGB. ‚ Opravím to, jakmile ‚ m na svém notebooku.
  • Don ‚ si nemyslíte, že je váš ukázkový obrázek správný, protože má neobvykle modrý odstín

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 ‚ odebrat b=[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 

Mona Lisa s použitým filtrem reverzního Bayeru

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í:

  1. 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};
  2. 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"] 

reverzní Bayer

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 

Ukázka

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:

o.png obrázek po zpracování

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *