Nesten alle sensorer for digitalkameraer er organisert i et rutenett av fotosensorer. Hver bildesensor er følsom for en av primærfargene : rød, grønn og blå. Måten disse fotosensorene er organisert på, kalles Bayer-filteret , etter oppfinneren, Bryce Bayer av Eastman Kodak. Etter at et bilde er tatt, komponerer fire fotosensorer RGB-verdien på en piksel i det resulterende bildet. Din oppgave er å reversere den prosessen og fargelegge de resulterende pikslene i henhold til filterfargen. For enkelhets skyld vil vi ignorere gammakorreksjon .
For eksempel: de «normale» fremover Bayer-filtertrinnene er:
- en lysstråle med en Pantone bivoksfarge treffer sensoren;
- BGGR (blå – grønn / grønn – Rødt) filter dekomponerer dette i fire stråler.
- De fire strålene treffer sensoren, som lyder: 81 – 168/168 – 235 (sensorverdiene varierer fra 0 – 255);
- Bayer-filteret oversetter dette til en RGB-piksel med farge (235, 168, 81).
De omvendte Bayer-filtertrinnene er:
- RGB-piksler med farge (235, 168, 81) er delt inn i fire piksler med RGB-verdier: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).
Utfordring
Du bør skrive en kortest mulig funksjon eller et program som gjør følgende:
- Ta et filnavn som du skriver inn og sender ut DeBayered-bildet .
- Utgangen kan skrives til en fil eller vises på skjermen.
- T utgangen må være dobbelt så bred som to ganger høyden på det opprinnelige bildet.
-
Hver piksel av inngangsbildet må kartlegges i henhold til BGGR (Blue – Green / Green – Red) Bayer-filteret mønster som forklart grafisk i følgende bilde:
-
Vi antar at begge de grønne fotosensorene mottar det samme signalet, så begge G-verdiene i Bayer-matrisen er lik G-verdien i RGB-bildet.
- Du kan ikke returnere en matrixrepresentasjon av det resulterende bildet. Utdataene må være et bilde eller en fil (i hvilket som helst passende bildeformat ) som kan vises som et bilde.
Eksempel
Gitt denne filen som input:
Det resulterende bildet skal være:
Henvisning til implementering av python:
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")
Husk: dette er en code-golf , så korteste kode vinner!
Kommentarer
Svar
Pyth, 26 byte
[email protected],U2tU3"
Forventer inngangsfilnavnet med anførselstegn på stdin, og skriver til o.png
. Eksempel på utdata:
Kommentarer
- Du svarer er det korteste så langt. Jeg pleier å godta det, men det ville være fint om du kunne legge til en forklaring på hvordan programmet ditt fungerer.
- Jeg brukte nettopp Kronecker-produktet ved å bruke et svar fra et forrige spørsmål: codegolf.stackexchange.com/questions/78797/… .
Svar
Matlab, 104 92 byte
Dette bruker 3d-array / matrise-representasjonen av RGB-bilder i Matlab, i tillegg til Kronecker-produktet , som er akkurat det vi trenger for å lage denne nye 2×2 «metapikslen» fra hver kilde. Utgangen vises deretter i et popup-vindu.
a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)
Endret størrelse på skjermfangst:
Kommentarer
- At
[1:2;2:3]==n
er smart!Kan du ‘ t fjerneb=[a,a;a,a];
? - @LuisMendo Takk =) Det fungerer virkelig, jeg ‘ t forvent det!
Svar
Python 3, 259 254 byte
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")
Inngangsfilnavnet er gitt i standardinngang. Utganger til o.png
.
Eksempel på bruk:
$ echo mona-lisa.jpg | python bayer.py
Kommentarer
- Velkommen til PPCG, hyggelig første svar!
Svar
Mathematica 118 127 byte
Den opprinnelige innsendingen brukte et faktisk bilde som inndata. Dette bruker et filnavn i stedet.
Det gjelder to erstatningsregler for bildedataene til den refererte filen:
- For hver rad i bildedatematrisen erstatter du hver piksel { r, b, g} med en blå piksel, {0,0, b} etterfulgt av en grønn piksel, {0, g, 0};
- Separat, for hver rad i bildedatematrisen, erstatt hver piksel {r, b, g} med en grønn piksel {0, g, 0} etterfulgt av en rød piksel, {r, 0,0};
Deretter Riffle
(dvs. fletter sammen) matrisene som oppstår fra 1 og 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"]
Kommentarer
- Ikke sikker, men dette ser ikke ‘ t til å tilfredsstille » Ta et filnavn som i inngang »
- for alltid, Den bruker nå som inndata et filnavn i stedet for et bilde.
Svar
J, 100 9 6 90 byte
load"bmp" "o"writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin""
Dette er et skript i J som leser filnavnet til inngangsbildet fra stdin og sender resultatet til en fil som heter o
. Inngangs- og utgangsbildene vil begge være i bmp
-format. Det forventer også at bare filnavnet skal legges inn, noe som betyr at ledende og etterfølgende mellomrom ikke skal være til stede.
Eksempelbruk
$ echo -n mona.bmp | jconsole reversebayer.ijs
Forklaring
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"
Svar
Python 2, 256 275 byte
Først forenklet jeg den opprinnelige koden:
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")
Minifiser deretter til:
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")
Resultatet i bildet o.png
:
BG
øverst rad ogGR
nederst, mens eksempelbildet viserRG
øverst ogGB
på bunnen. Betyr det at noen ordninger som setter de to grønne cellene på en diagonal er akseptable? (de andre ville være GB / RG og GR / BG.)