Fast alle Digitalkamerasensoren sind in einem Raster von Fotosensoren organisiert. Jeder Fotosensor reagiert empfindlich auf eine der Primärfarben : Rot, Grün und Blau. Die Art und Weise, wie diese Fotosensoren organisiert sind, wird nach seinem Erfinder Bryce Bayer a als Bayer-Filter bezeichnet > von Eastman Kodak. Nachdem ein Bild aufgenommen wurde, setzen vier Fotosensoren den RGB-Wert eines Pixels im resultierenden Bild zusammen. Ihre Aufgabe ist es, diesen Vorgang umzukehren und die resultierenden Pixel entsprechend ihrer Filterfarbe einzufärben. Der Einfachheit halber werden wir die Gammakorrektur ignorieren.
Zum Beispiel: Die „normalen“ Bayer-Vorwärtsfilterschritte sind:
- ein Lichtstrahl mit einer Pantone-Bienenwachsfarbe trifft auf den Sensor;
- die BGGR (Blau – Grün / Grün) – Rot) Filter zerlegt dies in vier Strahlen.
- Die vier Strahlen treffen auf den Sensor, der lautet: 81 – 168/168 – 235 (Sensorwerte reichen von 0 – 255);
- Der Bayer-Filter übersetzt dies in ein RGB-Pixel mit Farbe (235, 168, 81).
Die umgekehrten Bayer-Filterschritte sind:
- RGB-Pixel mit Farbe (235, 168, 81) wird in vier Pixel mit RGB-Werten aufgeteilt: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).
Herausforderung
Sie sollten die kürzestmögliche Funktion oder das kürzestmögliche Programm schreiben, das Folgendes ausführt:
- Nehmen Sie einen Dateinamen wie bei der Eingabe und Ausgabe des DeBayered-Bildes
- Die Ausgabe kann in eine Datei geschrieben oder auf dem Bildschirm angezeigt werden.
- T. Die Ausgabe muss doppelt so breit und doppelt so hoch sein wie das Originalbild.
-
Jedes Pixel des Eingabebildes muss gemäß dem BGGR-Bayer-Filter (Blau – Grün / Grün – Rot) zugeordnet werden Muster wie im folgenden Bild grafisch erläutert:
-
Wir gehen davon aus, dass beide grünen Photosensoren das gleiche Signal empfangen, sodass beide G-Werte in der Bayer-Matrix gleich dem G-Wert im RGB-Bild sind.
- Sie können nicht eine Array-Darstellung des resultierenden Bildes zurückgeben. Die Ausgabe muss ein Bild oder eine Datei sein (in jedes geeignete Bildformat ), die als Bild angezeigt werden kann.
Beispiel
Geben Sie diese Datei als Eingabe an:
Das resultierende Bild sollte sein:
Referenz-Python-Implementierung:
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")
Denken Sie daran: Dies ist eine Code-Golf , also gewinnt der kürzeste Code!
Kommentare
- Beim Scrollen
- @Fatalize Entschuldigung! 😉 Seltsamer Effekt, ist es nicht ‚?
- Die Anweisungen zeigen eine Zelle mit
BG
oben Zeile undGR
unten, während das BeispielbildRG
oben undGB
zeigt auf der Unterseite. Bedeutet das, dass jede Anordnung, bei der die beiden grünen Zellen diagonal angeordnet sind, akzeptabel ist? (Die anderen wären GB / RG und GR / BG.) - @LevelRiverSt Meine Absicht war es, mich an BGGR zu halten (wie im vierten Challenge Bullet angegeben). Mein Fehler, wenn das eigentliche Beispielbild in RGGB ist. Ich ‚ werde das korrigieren, sobald ich ‚ auf meinem Laptop bin.
- Ich habe ‚ Ich glaube nicht, dass Ihr Beispielbild korrekt ist. Zum einen hat es einen seltsamen blauen Farbton.
Antwort
Pyth, 26 Bytes
[email protected],U2tU3"
Erwartet den Eingabedateinamen mit Anführungszeichen auf stdin und schreibt in o.png
. Beispielausgabe:
Kommentare
- Ihre Antwort ist die bisher kürzeste. Ich neige dazu, es zu akzeptieren, aber es wäre schön, wenn Sie eine Erklärung hinzufügen könnten, wie Ihr Programm funktioniert.
- Ich habe gerade das Kronecker-Produkt verwendet und eine Antwort aus einer früheren Frage verwendet: codegolf.stackexchange.com/questions/78797/… .
Antwort
Matlab, 104 92 Bytes
Hierbei wird die 3D-Array / Matrix-Darstellung von RGB-Bildern in Matlab verwendet. sowie das Kronecker-Produkt , das genau das ist, was wir brauchen, um dieses neue 2×2 „Metapixel“ aus jedem Quellpixel zu erstellen. Die Ausgabe wird dann in einem Popup-Fenster angezeigt.
a=double(imread(input("")));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)
Größe der Bildschirmaufnahme:
Kommentare
- Das
[1:2;2:3]==n
ist klug!Kann ‚ Sieb=[a,a;a,a];
nicht entfernen? - @LuisMendo Thanks =) Es funktioniert tatsächlich, ich habe ‚ erwarte das nicht!
Antwort
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")
Der Eingabedateiname wird in angegeben Standardeingabe. Ausgaben an o.png
.
Anwendungsbeispiel:
$ echo mona-lisa.jpg | python bayer.py
Kommentare
- Willkommen bei PPCG, nette erste Antwort!
Antwort
Mathematica 118. 127 Bytes
Bei der ursprünglichen Übermittlung wurde ein tatsächliches Bild als Eingabe verwendet. Hierbei wird stattdessen ein Dateiname verwendet.
Es werden zwei Ersetzungsregeln auf die Bilddaten der referenzierten Datei angewendet:
- Ersetzen Sie für jede Zeile der Bilddatenmatrix jedes Pixel { r, b, g} mit einem blauen Pixel {0,0, b}, gefolgt von einem grünen Pixel {0, g, 0};
- Separat für jede Zeile der Bilddatenmatrix, Ersetzen Sie jedes Pixel {r, b, g} durch ein grünes Pixel {0, g, 0}, gefolgt von einem roten Pixel {r, 0,0};
Dann Riffle
(dh verschachteln) die aus 1 und 2 resultierenden Matrizen.
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"]
Kommentare
- Nicht sicher, aber dies ‚ scheint “ nicht zu erfüllen. Nehmen Sie einen Dateinamen als Bei der Eingabe “
- wird jetzt als Eingabe ein Dateiname anstelle eines Bildes verwendet.
Antwort
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""
Dies ist ein Skript in J, das den Dateinamen des Eingabebildes von stdin liest und das Ergebnis in eine Datei mit dem Namen ausgibt o
. Die Eingabe- und Ausgabebilder haben beide das Format bmp
. Es wird auch erwartet, dass nur der Dateiname eingegeben wird, was bedeutet, dass führende und nachfolgende Leerzeichen nicht vorhanden sein sollten.
Beispielverwendung
$ echo -n mona.bmp | jconsole reversebayer.ijs
Erläuterung
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"
Antwort
Python 2, 256 275 Byte
Zuerst habe ich den ursprünglichen Code vereinfacht:
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")
Minimieren Sie dann auf:
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")
Das Bild o.png
: