Reverse Bayer Filter eines Bildes

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:

    Bayer-Filter - BGGR - grafische Erklärung

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

Mona Lisa

Das resultierende Bild sollte sein:

DeBayered Mona Lisa

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 , 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 und GR unten, während das Beispielbild RG oben und GB 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 ‚ Sie b=[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 

Mona Lisa mit angewendetem Reverse-Bayer-Filter

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:

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

Reverse Bayer

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 

Beispiel

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:

o.png-Bild nach der Verarbeitung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.