Omgekeerd Bayer-filter van een afbeelding

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:

    Bayer-filter - BGGR - grafische uitleg

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

Mona Lisa

De resulterende afbeelding moet zijn:

DeBayered Mona Lisa

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 , dus de kortste code wint!

Reacties

  • Kreeg bijna een aanval toen ik scrolde
  • @Fatalize sorry daarvoor! 😉 Vreemd effect, isn ‘ t het?
  • De instructies tonen een cel met BG bovenaan rij en GR onderaan, terwijl de voorbeeldafbeelding RG bovenaan en GB 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.)
  • @LevelRiverSt het was mijn bedoeling me aan BGGR te houden (zoals gespecificeerd in het vierde uitdagingskogel). Mijn fout als de daadwerkelijke voorbeeldafbeelding in RGGB is. Ik ‘ zal dit corrigeren zodra ik ‘ m op mijn laptop zit.
  • Ik doe ‘ denk niet dat uw voorbeeldafbeelding correct is, bijvoorbeeld heeft deze een rare blauwe tint.

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

Mona Lisa met omgekeerd Bayer-filter toegepast

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:

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

reverse bayer

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 

Voorbeeld

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:

o.png afbeelding na verwerking

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *