Reverse Bayer Filter av et bilde

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:

    Bayer Filter - BGGR - grafisk forklaring

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

Mona Lisa

Det resulterende bildet skal være:

DeBayered Mona Lisa

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 , så korteste kode vinner!

Kommentarer

  • Fikk nesten et anfall da jeg rullet
  • @Fatalize beklager det! 😉 Weird effect, isn ‘ t it?
  • Instruksjonene viser en celle med BG øverst rad og GR nederst, mens eksempelbildet viser RG øverst og GB 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.)
  • @LevelRiverSt min intensjon var å følge BGGR (som spesifisert i den fjerde utfordringskulen). Min feil hvis det faktiske eksempelbildet er i RGGB. Jeg ‘ retter det så snart jeg ‘ m på den bærbare datamaskinen.
  • Jeg har ikke ‘ ikke synes eksempelbildet ditt er riktig, for det første har det en merkelig blå fargetone

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 fjerne b=[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 

Mona Lisa med omvendt Bayer-filter brukt

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:

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

omvendt lag

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 

Eksempel

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:

o.png-bilde etter behandling

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *