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]==ner 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 ogGRnederst, mens eksempelbildet viserRGøverst ogGBpå 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.)