Filtro Bayer inverso di un'immagine


9

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:

    Filtro Bayer - BGGR - spiegazione grafica

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

Monna Lisa

L'immagine risultante dovrebbe essere:

DeBayered Mona Lisa

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 , quindi vince il codice più corto!


5
Ho quasi avuto un attacco quando ho fatto lo
— scrolling

1
@Fatalize mi dispiace per quello! ;-) Effetto strano, no?
— agtoever,

Le istruzioni mostrano una cella con BGnella riga superiore e GRin fondo, mentre l'immagine di esempio mostra RGin alto e GBin basso. Significa che è accettabile qualsiasi accordo che metta le due celle verdi su una diagonale? (gli altri sarebbero GB / RG e GR / BG.)
— Level River St

@LevelRiverSt la mia intenzione era di aderire a BGGR (come specificato nel quarto proiettile della sfida). Il mio errore se l'immagine di esempio attuale è in RGGB. Lo correggerò non appena sarò sul mio laptop.
— agtoever,

Non credo che la tua immagine di esempio sia corretta, perché ha una strana tinta blu
— orlp

Risposte:


6

Pyth, 26 byte

MXm03H@GH.wsMsgLRRR,U2tU3'

Si aspetta il nome file di input tra virgolette su stdin e scrive su o.png. Esempio di output:


La tua risposta è la più breve finora. Tendo ad accettarlo, ma sarebbe bello se potessi aggiungere una spiegazione su come funziona il tuo programma.
— agtoever,

Ho appena usato il prodotto Kronecker, usando una risposta da una domanda precedente: codegolf.stackexchange.com/questions/78797/… .
— orlp,

6

Matlab, 104 92 byte

Questo utilizza la rappresentazione 3d-array / matrice di immagini RGB in Matlab, così come il prodotto Kronecker che è esattamente ciò di cui abbiamo bisogno per creare questo nuovo "metapixel" 2x2 da ciascun pixel sorgente. L'output viene quindi visualizzato in una finestra popup.

a=double(imread(input('')));for n=1:3;b(:,:,n)=kron(a(:,:,n),[1:2;2:3]==n)/255;end;imshow(b)

Screencapture ridimensionato:


È [1:2;2:3]==nintelligente! Non puoi rimuovere b=[a,a;a,a];?
— Luis Mendo,

@LuisMendo Thanks =) Funziona davvero, non me l'aspettavo!
— flawr

5

Python 3, 259 254 byte

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')

Il nome file di input è fornito in input standard. Uscite a o.png.

Esempio di utilizzo:

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

Mona Lisa con filtro Bayer inverso applicato


2
Benvenuto in PPCG, bella prima risposta!
— Leaky Nun,

4

Mathematica 118 127 byte

L'invio originale utilizzava un'immagine reale come input. Questo utilizza invece un nome file.

Applica due regole di sostituzione ai dati di immagine del file di riferimento:

  1. Per ogni riga della matrice di dati immagine, sostituisci ogni pixel {r, b, g} con un pixel blu, {0,0, b} seguito da un pixel verde, {0, g, 0};
  2. Separatamente, per ogni riga della matrice di dati immagine, sostituisci ogni pixel {r, b, g} con un pixel verde {0, g, 0} seguito da un pixel rosso, {r, 0,0};

Quindi Riffle(cioè interleave) le matrici risultanti da 1 e 2.

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"]

bayer inverso


Non sono sicuro, ma questo non sembra soddisfare " Prendi un nome file come in input "
— agtoever

agtoever, ora utilizza come input un nome file anziché un'immagine.
— DavidC,

3

J, 100 96 90 byte

load'bmp'
'o'writebmp~,./,./($a)$2 1 1 0(_2]\(2^0 8 8 16)*{)"1(3#256)#:,a=:readbmp]stdin''

Questo è uno script in J che legge il nome file dell'immagine di input da stdin e genera il risultato in un file chiamato o. Le immagini di input e output saranno entrambe in bmpformato. Si aspetta inoltre che venga inserito solo il nome file, il che significa che gli spazi bianchi iniziali e finali non dovrebbero essere presenti.

Esempio di utilizzo

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

Campione

Spiegazione

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'

0

Python 2, 256 275 byte

Innanzitutto ho semplificato il codice originale:

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")

Quindi minimizza per:

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")

Risultato nell'immagine o.png:

immagine o.png dopo l'elaborazione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.