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:
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:
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 ein Code-Golf , also gewinnt der kürzeste Code!
quelle
BG
in der oberen Reihe undGR
in der unteren, während das BeispielbildRG
oben undGB
unten 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.)Antworten:
Pyth, 26 Bytes
Erwartet den Eingabedateinamen mit Anführungszeichen auf stdin und schreibt in
o.png
. Beispielausgabe:quelle
Matlab,
10492 BytesDies 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.
Größe der Bildschirmaufnahme geändert:
quelle
[1:2;2:3]==n
ist klug! Kannst du nicht entfernenb=[a,a;a,a];
?Python 3,
259254 BytesDer Eingabedateiname wird in der Standardeingabe angegeben. Ausgänge zu
o.png
.Anwendungsbeispiel:
quelle
Mathematica
118127 BytesDie 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:
Dann
Riffle
(dh verschachteln) die aus 1 und 2 resultierenden Matrizen.quelle
J,
1009690 BytesDies 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 dasbmp
Format. Es wird auch erwartet, dass nur der Dateiname eingegeben wird, was bedeutet, dass führende und nachfolgende Leerzeichen nicht vorhanden sein sollten.Beispielnutzung
Erläuterung
quelle
Python 2,
256275 BytesZuerst habe ich den Originalcode vereinfacht:
Dann minimieren Sie auf:
Ergebnis im Bild
o.png
:quelle