Omvendt Bayer-filter af et billede

Næsten alle digitale kamerasensorer er organiseret i et gitter af fotosensorer. Hver fotosensor er følsom over for en af primære farver : rød, grøn og blå. Den måde, hvorpå disse fotosensorer er organiseret, kaldes Bayer-filter , efter opfinderen Bryce Bayer fra Eastman Kodak. Når et billede er taget, komponerer fire fotosensorer RGB-værdien på en pixel i det resulterende billede. Din opgave er at vende den proces og farve de resulterende pixels i henhold til deres filterfarve. Af enkelheds skyld ignorerer vi gammakorrektion .

For eksempel: de “normale” fremadrettede Bayer-filtertrin er:

  • en lysstråle med en Pantone bivoksfarve rammer sensoren;
  • BGGR (blå – grøn / grøn – Rødt) filter nedbryder dette i fire stråler.
  • De fire stråler rammer sensoren, som lyder: 81 – 168/168 – 235 (sensorværdier varierer fra 0 – 255);
  • Bayer-filteret oversætter dette til en RGB-pixel med farve (235, 168, 81).

De omvendte Bayer-filtertrin er:

  • RGB-pixel med farve (235, 168, 81) er opdelt i fire pixels med RGB-værdier: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Udfordring

Du skal skrive den kortest mulige funktion eller det program, der gør følgende:

  • Tag et filnavn som i input og output det DeBayered-billede .
  • Outputtet kan skrives til en fil eller vises på skærmen.
  • T output skal være dobbelt så bredt som dobbelt så højt som det oprindelige billede.
  • Hver pixel i inputbilledet skal kortlægges i henhold til BGGR (Blue – Green / Green – Red) Bayer-filteret mønster som forklaret grafisk på følgende billede:

    Bayer-filter - BGGR - grafisk forklaring

  • Vi antager, at begge grønne fotosensorer modtager det samme signal, så begge G-værdierne i Bayer-matrixen er lig med G-værdien i RGB-billedet.

  • Du kan ikke returnere en matrixrepræsentation af det resulterende billede. Outputtet skal være et billede eller en fil (i ethvert passende billedformat ), der kan vises som et billede.

Eksempel

Givet denne fil som input:

Mona Lisa

Det resulterende billede skal være:

DeBayered Mona Lisa

Implementering af referencepython:

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å den korteste kode vinder!

Kommentarer

  • Fik næsten et anfald, da jeg rullede
  • @Fatalize undskyld for det! 😉 Underlig effekt, er det ikke ‘ t?
  • Instruktionerne viser en celle med BG øverst række og GR i bunden, mens eksempelbilledet viser RG øverst og GB på bunden. Betyder det, at ethvert arrangement, der placerer de to grønne celler på en diagonal, er acceptabelt? (de andre ville være GB / RG og GR / BG.)
  • @LevelRiverSt min hensigt var at overholde BGGR (som specificeret i den fjerde udfordringskugle). Min fejl, hvis det faktiske eksempelbillede er i RGGB. Jeg ‘ retter det så snart jeg ‘ m på min bærbare computer.
  • Jeg don ‘ Tænk ikke, at dit eksempelbillede er korrekt, for det første har det en underlig blå nuance

Svar

Pyth, 26 bytes

[email protected],U2tU3" 

Forventer inputfilnavn med anførselstegn på stdin og skriver til o.png. Eksempel på output:

Kommentarer

  • Dit svar er det korteste hidtil. Jeg accepterer det, men det ville være rart, hvis du kunne tilføje en forklaring på, hvordan dit program fungerer.
  • Jeg brugte lige Kronecker-produktet ved hjælp af et svar fra et tidligere spørgsmål: codegolf.stackexchange.com/questions/78797/… .

Svar

Matlab, 104 92 bytes

Dette gør brug af 3D-array / matrixrepræsentation af RGB-billeder i Matlab, såvel som Kronecker-produktet , hvilket er nøjagtigt hvad vi har brug for for at skabe denne nye 2×2 “metapixel” fra hver kilde-pixel. Outputtet vises derefter i et popup-vindue.

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

Skærmtilpasning til størrelse:

Kommentarer

  • At [1:2;2:3]==n er smart!Kan ‘ t du fjerner b=[a,a;a,a];?
  • @LuisMendo Tak =) Det fungerer virkelig, jeg ‘ t forvent det!

Svar

Python 3, 259 254 bytes

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

Inputfilnavnet er angivet i standard input. Udgange til o.png.

Eksempel på brug:

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

Mona Lisa med omvendt Bayer-filter anvendt

Kommentarer

  • Velkommen til PPCG, dejligt første svar!

Svar

Mathematica 118 127 bytes

Den originale indsendelse brugte et faktisk billede som input. Dette bruger et filnavn i stedet.

Det gælder to erstatningsregler for billeddataene for den refererede fil:

  1. For hver række i billeddatamatrixen skal du udskifte hver pixel { r, b, g} med en blå pixel, {0,0, b} efterfulgt af en grøn pixel, {0, g, 0};
  2. Separat for hver række i billeddatamatrixen udskift hver pixel {r, b, g} med en grøn pixel {0, g, 0} efterfulgt af en rød pixel, {r, 0,0};

Derefter Riffle (dvs. sammenfletter) matricerne, der er resultatet af 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 bayer

Kommentarer

  • Ikke sikker, men det ser ikke ud til ‘ ” Tag et filnavn som i input
  • agtoever, det bruger nu som input et filnavn i stedet for et billede.

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 script i J, der læser filnavnet på inputbilledet fra stdin og sender resultatet til en fil med navnet o. Input- og outputbillederne vil begge være i bmp -format. Det forventer også, at kun filnavnet skal indtastes, hvilket betyder, at ledende og efterfølgende mellemrum ikke skal være til stede.

Eksempelbrug

$ 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 bytes

Først forenklede jeg den oprindelige kode:

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

Miniser derefter 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 billedet o.png:

o.png-billede efter behandling

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *