Quasi tutti i sensori per fotocamere digitali sono organizzati in una griglia di fotosensori. Ogni sensore fotografico è sensibile per uno dei colori primari : rosso, verde e blu. Il modo in cui sono organizzati quei sensori fotografici è chiamato filtro Bayer , dal suo inventore, Bryce Bayer di Eastman Kodak. Dopo aver scattato un'immagine, quattro sensori fotografici compongono il valore RGB di un pixel nell'immagine risultante. Il tuo compito è di invertire tale processo e colorare i pixel risultanti in base al colore del filtro. Per semplicità, ignoreremo la correzione gamma .
Ad esempio: i "normali" passaggi del filtro Bayer in avanti sono:
- un raggio di luce con un colore di cera d'api Pantone colpisce il sensore;
- il filtro BGGR (Blu - Verde / Verde - Rosso) lo decompone in quattro raggi.
- I quattro raggi colpiscono il sensore, che recita: 81 - 168/168 - 235 (i valori del sensore vanno da 0 a 255);
- Il filtro Bayer lo traduce in un pixel RGB con colore (235, 168, 81).
I passaggi del filtro Bayer inverso sono:
- Il pixel RGB con colore (235, 168, 81) è diviso in quattro pixel con valori RGB: (0,0,81) - (0,168,0) / (0,168,0) - (235,0,0).
Sfida
È necessario scrivere la funzione o il programma più breve possibile che procede come segue:
- Prendi un nome file come in input e genera l'immagine DeBayered.
- L'output può essere scritto in un file o visualizzato sullo schermo.
- L'output deve essere il doppio della larghezza e il doppio dell'altezza dell'immagine originale.
Ogni pixel dell'immagine di input deve essere mappato secondo il modello di filtro Bayer BGGR (Blu - Verde / Verde - Rosso) come spiegato graficamente nella seguente immagine:
Supponiamo che entrambi i fotosensori verdi ricevano lo stesso segnale, quindi entrambi i valori G nella matrice Bayer sono uguali al valore G nell'immagine RGB.
- Si può non restituire una rappresentazione di matrice dell'immagine risultante. L'output deve essere un'immagine o un file (in qualsiasi formato immagine adatto ) che può essere visualizzato come immagine.
Esempio
Dato questo file come input:
L'immagine risultante dovrebbe essere:
Implementazione di Python di riferimento:
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")
Ricorda: questo è un codice-golf , quindi vince il codice più corto!
BG
nella riga superiore e GR
in fondo, mentre l'immagine di esempio mostra RG
in alto e GB
in basso. Significa che è accettabile qualsiasi accordo che metta le due celle verdi su una diagonale? (gli altri sarebbero GB / RG e GR / BG.)