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:
-
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ä:
Tuloksena olevan kuvan tulee olla seuraava:
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 code-golf , joten lyhyin koodi voittaa!
Kommentit
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 ’ poistaab=[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
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:
- Vaihda jokainen kuvadatamatriisin rivi jokainen pikseli { r, b, g} sinisellä pikselillä, {0,0, b}, jota seuraa vihreä pikseli, {0, g, 0};
- 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"]
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
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
:
BG
rivi jaGR
alareunassa, kun taas esimerkkikuvassa näkyyRG
jaGB
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.)