Reverse Bayer Filter eines Bildes

9

Fast alle Digitalkamerasensoren sind in einem Raster von Fotosensoren organisiert. Jeder Fotosensor reagiert empfindlich auf eine der Grundfarben : Rot, Grün und Blau. Die Art und Weise, wie diese Fotosensoren organisiert sind , wird nach seinem Erfinder Bryce Bayer von Eastman Kodak als Bayer-Filter bezeichnet . 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" Vorwärts-Bayer-Filterschritte sind:

  • Ein Lichtstrahl mit der Farbe Pantone Bienenwachs trifft auf den Sensor.
  • Der BGGR-Filter (Blau - Grün / Grün - Rot) 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) werden 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ürzest mögliche Programm schreiben, das Folgendes ausführt:

  • Nehmen Sie einen Dateinamen wie bei der Eingabe und geben Sie das DeBayered-Bild aus.
  • Die Ausgabe kann in eine Datei geschrieben oder auf dem Bildschirm angezeigt werden.
  • Die Ausgabe muss doppelt so breit und doppelt so hoch sein wie das Originalbild.
  • Jedes Pixel des Eingabebildes muss gemäß dem BGGR-Bayer-Filtermuster (Blau - Grün / Grün - Rot) abgebildet werden, 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.

  • Möglicherweise geben Sie keine Array-Darstellung des resultierenden Bildes zurück. Die Ausgabe muss ein Bild oder eine Datei (in einem geeigneten Bildformat ) sein, die als Bild angezeigt werden kann.

Beispiel

Angesichts dieser Datei als Eingabe:

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 ein , also gewinnt der kürzeste Code!

agtoever
quelle
5
Ich habe fast einen Anfall bekommen, als ich
gescrollt habe
1
@Fatalize Entschuldigung! ;-) Seltsamer Effekt, nicht wahr?
Gegen
Die Anweisungen zeigen eine Zelle mit BGin der oberen Reihe und GRin der unteren, während das Beispielbild RGoben und GBunten zeigt. 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.)
Level River St
@LevelRiverSt Meine Absicht war es, mich an die 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.
Gegen
Ich denke nicht, dass Ihr Beispielbild korrekt ist, zum einen hat es einen seltsamen blauen Farbton
orlp

Antworten:

6

Pyth, 26 Bytes

[email protected],U2tU3'

Erwartet den Eingabedateinamen mit Anführungszeichen auf stdin und schreibt in o.png. Beispielausgabe:

orlp
quelle
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.
Bis zum
Ich habe gerade das Kronecker-Produkt verwendet und dabei eine Antwort aus einer früheren Frage verwendet: codegolf.stackexchange.com/questions/78797/… .
Orlp
6

Matlab, 104 92 Bytes

Dies nutzt die 3D-Array / Matrix-Darstellung von RGB-Bildern in Matlab sowie das Kronecker-Produkt, das genau das ist, was wir brauchen, um dieses neue 2x2 "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 geändert:

fehlerhaft
quelle
Das [1:2;2:3]==nist klug! Kannst du nicht entfernen b=[a,a;a,a];?
Luis Mendo
@LuisMendo Danke =) Es funktioniert tatsächlich, das habe ich nicht erwartet!
Fehler
5

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 der Standardeingabe angegeben. Ausgänge zu o.png.

Anwendungsbeispiel:

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

Mona Lisa mit umgekehrtem Bayer-Filter

Kupfer
quelle
2
Willkommen bei PPCG, schöne erste Antwort!
Undichte Nonne
4

Mathematica 118 127 Bytes

Die ursprüngliche Einreichung verwendete ein tatsächliches Bild als Eingabe. Dies verwendet stattdessen einen Dateinamen.

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} durch ein blaues Pixel {0,0, b}, gefolgt von einem grünen Pixel {0, g, 0}.
  2. Ersetzen Sie für jede Zeile der Bilddatenmatrix separat 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

DavidC
quelle
Ich
bin
Außerdem wird jetzt als Eingabe ein Dateiname anstelle eines Bildes verwendet.
DavidC
3

J, 100 96 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 bmpFormat. Es wird auch erwartet, dass nur der Dateiname eingegeben wird, was bedeutet, dass führende und nachfolgende Leerzeichen nicht vorhanden sein sollten.

Beispielnutzung

$ echo -n mona.bmp | jconsole reversebayer.ijs

Stichprobe

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'
Meilen
quelle
0

Python 2, 256 275 Bytes

Zuerst habe ich den Originalcode 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")

Dann minimieren Sie 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")

Ergebnis im Bild o.png:

o.png Bild nach der Verarbeitung

Logikritter
quelle