Bijna alle sensoren van digitale cameras zijn georganiseerd in een raster van fotosensoren. Elke fotosensor is gevoelig voor een van de primaire kleuren : rood, groen en blauw. De manier waarop die fotosensoren zijn georganiseerd, wordt het Bayer-filter genoemd, naar de uitvinder ervan, Bryce Bayer van Eastman Kodak. Nadat een foto is gemaakt, vormen vier fotosensoren de RGB-waarde van één pixel in de resulterende afbeelding. Het is jouw taak om dat proces om te keren en de resulterende pixels in te kleuren volgens hun filterkleur. Eenvoudigheidshalve negeren we gammacorrectie .
Bijvoorbeeld: de “normale” voorwaartse Bayer-filterstappen zijn:
- een lichtstraal met een Pantone-bijenwaskleur raakt de sensor;
- de BGGR (blauw – groen / groen – Rood) filter verdeelt dit in vier stralen.
- De vier stralen raken de sensor, die aangeeft: 81 – 168/168 – 235 (sensorwaarden variëren van 0 – 255);
- Het Bayer-filter vertaalt dit naar één RGB-pixel met kleur (235, 168, 81).
De omgekeerde Bayer-filterstappen zijn:
- RGB-pixel met kleur (235, 168, 81) wordt opgesplitst in vier pixels met RGB-waarden: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).
Uitdaging
Je moet de kortst mogelijke functie of programma schrijven dat het volgende doet:
- Neem een bestandsnaam zoals in de invoer en voer de DeBayered-afbeelding uit .
- De uitvoer kan naar een bestand worden geschreven of op het scherm worden weergegeven.
- T De uitvoer moet tweemaal de breedte en tweemaal de hoogte zijn van de originele afbeelding.
-
Elke pixel van de invoerafbeelding moet in kaart worden gebracht volgens het BGGR-filter (blauw – groen / groen – rood) Bayer patroon zoals grafisch uitgelegd in de volgende afbeelding:
-
We gaan ervan uit dat beide groene fotosensoren hetzelfde signaal ontvangen, dus beide G-waarden in de Bayer-matrix zijn gelijk aan de G-waarde in het RGB-beeld.
- Je mag niet een array-representatie van de resulterende afbeelding retourneren. De uitvoer moet een afbeelding of een bestand zijn (in elk geschikt afbeeldingsformaat ) dat als afbeelding kan worden weergegeven.
Voorbeeld
Gegeven dit bestand als invoer:
De resulterende afbeelding moet zijn:
Referentie-implementatie van 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")
Onthoud: dit is een code-golf , dus de kortste code wint!
Reacties
Antwoord
Pyth, 26 bytes
[email protected],U2tU3"
Verwacht de bestandsnaam van de invoer met aanhalingstekens op stdin en schrijft naar o.png
. Voorbeelduitvoer:
Reacties
- Je antwoord is tot dusver het kortst. Ik accepteer het meestal, maar het zou leuk zijn als je een uitleg zou kunnen toevoegen hoe je programma werkt.
- Ik heb zojuist het product Kronecker gebruikt, met een antwoord van een eerdere vraag: codegolf.stackexchange.com/questions/78797/… .
Antwoord
Matlab, 104 92 bytes
Dit maakt gebruik van de 3d-array / matrix representatie van RGB-afbeeldingen in Matlab, evenals het Kronecker-product , wat precies is wat we nodig hebben om deze nieuwe 2×2 “metapixel” van elke bronpixel te maken. De uitvoer wordt vervolgens weergegeven in een pop-upvenster.
a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)
Formaat schermopname gewijzigd:
Reacties
- Dat
[1:2;2:3]==n
is slim!Kun je ‘ niet verwijderenb=[a,a;a,a];
? - @LuisMendo Bedankt =) Het werkt inderdaad, ik deed het niet ‘ verwacht dat niet!
Antwoord
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")
De invoerbestandsnaam wordt gegeven in standaard input. Voert uit naar o.png
.
Voorbeeldgebruik:
$ echo mona-lisa.jpg | python bayer.py
Reacties
- Welkom bij PPCG, mooi eerste antwoord!
Answer
Mathematica 118 127 bytes
De oorspronkelijke inzending gebruikte een echte afbeelding als invoer. Dit gebruikt in plaats daarvan een bestandsnaam.
Het past twee vervangingsregels toe op de afbeeldingsgegevens van het bestand waarnaar wordt verwezen:
- Vervang voor elke rij van de afbeeldingsgegevensmatrix elke pixel { r, b, g} met een blauwe pixel, {0,0, b} gevolgd door een groene pixel, {0, g, 0};
- afzonderlijk, voor elke rij van de afbeeldingsgegevensmatrix, vervang elke pixel {r, b, g} door een groene pixel {0, g, 0} gevolgd door een rode pixel, {r, 0,0};
Dan Riffle
(dwz interleave) de matrices resulterend uit 1 en 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"]
Reacties
- Niet zeker, maar dit ‘ lijkt niet te voldoen aan ” Neem een bestandsnaam als in invoer ”
- ook, het gebruikt nu als invoer een bestandsnaam in plaats van een afbeelding.
Antwoord
J, 100 9 6 90 bytes
load"bmp" "o"writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin""
Dit is een script in J dat de bestandsnaam van de invoerafbeelding uit stdin leest en het resultaat naar een bestand met de naam o
. De invoer- en uitvoerafbeeldingen hebben beide de indeling bmp
. Het verwacht ook dat alleen de bestandsnaam wordt ingevoerd, wat betekent dat voorloop- en volgspaties niet aanwezig mogen zijn.
Voorbeeldgebruik
$ echo -n mona.bmp | jconsole reversebayer.ijs
Uitleg
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"
Antwoord
Python 2, 256 275 bytes
Eerst vereenvoudigde ik de originele code:
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")
Verklein vervolgens naar:
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")
Resulterend in de afbeelding o.png
:
BG
bovenaan rij enGR
onderaan, terwijl de voorbeeldafbeeldingRG
bovenaan enGB
toont op de bodem. Betekent dit dat een arrangement waarbij de twee groene cellen op een diagonaal worden geplaatst, acceptabel is? (de andere zouden GB / RG en GR / BG zijn.)