Kuvan käänteinen Bayer-suodatin

Lähes kaikki digitaalikameran anturit on järjestetty valosensorien ruudukkoon. Jokainen valokuvakenno on herkkä jollekin pääväristä : punaiselle, vihreälle ja siniselle. Näiden valokennojen järjestelyä kutsutaan Bayer-suodattimeksi keksijänsä Bryce Bayer a jälkeen > Eastman Kodakista. Kun kuva on otettu, neljä valokuva-anturia säveltää yhden pikselin RGB-arvon tuloksena olevassa kuvassa. Sinun tehtäväsi on kääntää tämä prosessi ja värittää saadut pikselit niiden suodatinvärin mukaan. Yksinkertaisuuden vuoksi jätämme huomiotta gammakorjauksen .

Esimerkiksi: ”normaalit” Bayerin eteenpäin suodattimen vaiheet ovat:

  • valokotelo, jossa Pantone-mehiläisvahan väri osuu anturiin;
  • BGGR (sininen – vihreä / vihreä – Punainen) suodatin hajottaa tämän neljään säteeseen.
  • Neljä sädettä osuu anturiin, jonka lukema on: 81 – 168/168 – 235 (anturin arvot vaihtelevat välillä 0 – 255);
  • Bayer-suodatin kääntää tämän yhdeksi värilliseksi RGB-pikseliksi (235, 168, 81).

Käänteiset Bayer-suodattimen vaiheet ovat:

  • RGB-pikseli värillä (235, 168, 81) jaetaan neljään pikseliin, joissa on RGB-arvot: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Haaste

Kirjoita mahdollisimman lyhyt toiminto tai ohjelma, joka toimii seuraavasti:

  • Ota tiedostonimi kuten syötteessä ja lähetä DeBayered-kuva .
  • Tulos voidaan kirjoittaa tiedostoon tai näyttää ruudulla.
  • T ulostulon on oltava kaksi kertaa alkuperäisen kuvan leveys ja kaksinkertainen korkeus.
  • Jokainen tulokuvan pikseli on kartoitettava BGGR (sininen – vihreä / vihreä – punainen) Bayer-suodattimen mukaan kuvio, joka on kuvattu graafisesti seuraavassa kuvassa:

    Bayer-suodatin - BGGR - graafinen selitys

  • Oletamme, että molemmat vihreät valoanturit vastaanottavat saman signaalin, joten molemmat G-arvot Bayer-matriisissa ovat yhtä suuria kuin R-kuvan G-arvo.

  • Et voi olla palauttamatta tuloksena olevan kuvan taulukkoesitystä. Tuloksen on oltava kuva tai tiedosto ( missä tahansa sopivassa kuvamuodossa ), joka voidaan näyttää kuvana.

Esimerkki

Annetaan tämä tiedosto syötteenä:

Mona Lisa

Tuloksena olevan kuvan tulee olla seuraava:

DeBayered Mona Lisa

Viittaus python-toteutukseen:

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

Muista: tämä on , joten lyhyin koodi voittaa!

Kommentit

  • Melkein takavarikko, kun vieritin
  • @Fatalize anteeksi siitä! 😉 Outo vaikutus, eikö ’ ole sitä?
  • Ohjeissa näkyy solu, jonka yläosassa on BG rivi ja GR alareunassa, kun taas esimerkkikuvassa näkyy RG ja GB pohjalla. Tarkoittaako tämä sitä, että mikä tahansa järjestely, joka asettaa kaksi vihreää solua diagonaaliin, on hyväksyttävä? (muut olisivat GB / RG ja GR / BG.)
  • @LevelRiverSt aikomukseni oli noudattaa BGGR: tä (kuten neljännessä haasteluettelossa on määritelty). Virheeni, jos todellinen esimerkkikuva on RGGB: ssä. Korjaan sen ’ heti kun olen ’ m kannettavassani.
  • En ’ älä ajattele, että esimerkkikuvasi on oikea, sillä yhdellä on outo sininen sävy

Vastaa

Pyth, 26 tavua

[email protected],U2tU3" 

Odotaa syötetiedoston nimen lainausmerkeillä stdinissä ja kirjoittaa osoitteeseen o.png. Esimerkkilähtö:

kommentit

  • Vastauksesi on tähän mennessä lyhyin. Minulla on tapana hyväksyä se, mutta olisi hienoa, jos voisit lisätä selityksen ohjelmasi toiminnalle.
  • Käytin juuri Kronecker-tuotetta käyttämällä vastausta edellisestä kysymyksestä: codegolf.stackexchange.com/questions/78797/… .

vastaus

Matlab, 104 92 tavua

Tämä käyttää Matlabissa olevien RGB-kuvien 3d-matriisi / matriisi-esitystä, samoin kuin Kronecker-tuote , joka on juuri se, mitä tarvitsemme tämän uuden 2×2 ”metapikselin” luomiseksi jokaisesta lähdepikselistä. Lähtö näytetään sitten ponnahdusikkunassa.

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

Kuvakoon muuttaminen:

Kommentit

  • Se, että [1:2;2:3]==n on fiksu!Voiko ’ poistaa b=[a,a;a,a];?
  • @LuisMendo Thanks =) Se todella toimii, en ’ ei odota sitä!

Vastaa

Python 3, 259 254 tavua

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

Syötetyn tiedoston nimi annetaan vakiotulo. Lähdetään osoitteeseen o.png.

Esimerkki käytöstä:

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

Mona Lisa ja Bayerin käänteinen suodatin käytössä

Kommentit

  • Tervetuloa PPCG: hen, mukava ensimmäinen vastaus!

Vastaa

Mathematica 118 127 tavua

Alkuperäisessä lähetyksessä käytettiin todellista kuvaa syötteenä. Tämä käyttää sen sijaan tiedostonimeä.

Se soveltaa kahta korvaussääntöä viitatun tiedoston kuvatiedoihin:

  1. Vaihda jokainen kuvadatamatriisin rivi jokainen pikseli { r, b, g} sinisellä pikselillä, {0,0, b}, jota seuraa vihreä pikseli, {0, g, 0};
  2. erikseen jokaiselle kuvadatamatriisin riville, korvaa kukin pikseli {r, b, g} vihreällä pikselillä {0, g, 0}, jota seuraa punainen pikseli, {r, 0,0};

Sitten Riffle (ts. Lomittavat) matriisit, jotka saadaan tuloksista 1 ja 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"] 

käänteinen taso

kommentit

  • Ei varma, mutta tämä ei ’ näytä tyydyttävän ” Ota tiedostonimi nimellä syötteessä
  • agtoever, Se käyttää nyt syötteenä tiedostonimeä kuvan sijasta.

Vastaus

J, 100 9 6 90 tavua

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

Tämä on skripti J: ssä, joka lukee tulokuvan tiedostonimen stdinistä ja tuottaa tuloksen tiedostoon nimeltä o. Tulo- ja lähtökuvat ovat molemmat muodossa bmp. Se odottaa myös, että vain tiedostonimi syötetään, mikä tarkoittaa, että etu- ja lopputilaa ei saa olla läsnä.

Esimerkkikäyttö

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

Näyte

Selitys

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" 

Vastaa

Python 2, 256 275 tavua

Ensinnäkin yksinkertaistin alkuperäistä koodia:

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

Pienennä sitten:

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

Tuloksena kuvasta o.png:

o.png-kuva käsittelyn jälkeen

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *