Filtrul Bayer invers al unei imagini

Aproape toți senzorii camerei digitale sunt organizați într-o grilă de senzori foto. Fiecare senzor foto este sensibil pentru una dintre culorile primare : roșu, verde și albastru. Modul în care acești senzori foto sunt organizați se numește filtru Bayer , după inventatorul său, Bryce Bayer din Eastman Kodak. După realizarea unei imagini, patru senzori foto compun valoarea RGB a unui pixel în imaginea rezultată. Sarcina dvs. este să inversați acest proces și să colorați pixelii rezultați în funcție de culoarea filtrului lor. Din motive de simplitate, vom ignora corecție gamma .

De exemplu: pașii „normali” ai filtrului Bayer înainte sunt:

  • un lightray cu o culoare Pantone Beeswax lovește senzorul;
  • BGGR (albastru – verde / verde) – Filtrul roșu) descompune acest lucru în patru raze.
  • Cele patru raze lovesc senzorul, care arată: 81 – 168/168 – 235 (valorile senzorului variază de la 0 la 255);
  • Filtrul Bayer traduce acest lucru într-un pixel RGB cu culoare (235, 168, 81).

Pașii inversi ai filtrului Bayer sunt:

  • Pixel RGB cu culoare (235, 168, 81) este împărțit în patru pixeli cu valori RGB: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Provocare

Ar trebui să scrieți cea mai scurtă funcție sau program posibil care face următoarele:

  • Luați un nume de fișier ca la intrare și ieșire a imaginii DeBayered .
  • Rezultatul poate fi scris într-un fișier sau afișat pe ecran.
  • T ieșirea trebuie să fie de două ori lățimea și de două ori înălțimea imaginii originale.
  • Fiecare pixel al imaginii de intrare trebuie mapat conform filtrului Bayer BGGR (Albastru – Verde / Verde – Roșu) model așa cum este explicat grafic în următoarea imagine:

    Filtru Bayer - BGGR - explicație grafică

  • Vom presupune că ambii senzori de culoare verde primesc același semnal, astfel încât ambele valori G din matricea Bayer sunt egale cu valoarea G din imaginea RGB.

  • Puteți nu returna o reprezentare matrice a imaginii rezultate. Ieșirea trebuie să fie o imagine sau un fișier (în orice format de imagine adecvat ) care poate fi afișat ca imagine.

Exemplu

Dat acest fișier ca intrare:

Mona Lisa

Imaginea rezultată ar trebui să fie:

DeBayered Mona Lisa

Implementare Python de referință:

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

Rețineți: acesta este un , deci cel mai scurt cod câștigă!

Comentarii

  • Aproape am primit o criză când am derulat
  • @Fatalize îmi pare rău pentru asta! 😉 Efect ciudat, nu ‘ nu?
  • Instrucțiunile arată o celulă cu BG în partea de sus rând și GR în partea de jos, în timp ce imaginea de exemplu arată RG în partea de sus și GB în partea de jos. Asta înseamnă că este acceptabil vreun aranjament care pune cele două celule verzi pe diagonală? (celelalte ar fi GB / RG și GR / BG.)
  • @LevelRiverSt intenția mea a fost de a adera la BGGR (așa cum se specifică în al patrulea glonț provocare). Greșeala mea dacă imaginea de exemplu este în RGGB. ‘ îl voi corecta imediat ce ‘ m pe laptopul meu.
  • Nu nu cred că imaginea de exemplu este corectă, pentru unul are o nuanță albastră ciudată

Răspuns

Pyth, 26 octeți

[email protected],U2tU3" 

Se așteaptă la numele fișierului de intrare cu ghilimele pe stdin și scrie la o.png. Exemplu de ieșire:

Comentarii

  • Răspunsul dvs. este cel mai scurt de până acum. Tind să-l accept, dar ar fi frumos dacă ați putea adăuga o explicație despre modul în care funcționează programul dvs.
  • Tocmai am folosit produsul Kronecker, folosind un răspuns de la o întrebare anterioară: „>

codegolf.stackexchange.com/questions/78797/… .

Răspuns

Matlab, 104 92 octeți

Aceasta folosește reprezentarea 3D-matrice / matrice a imaginilor RGB în Matlab, precum și produsul Kronecker , exact ceea ce avem nevoie pentru a crea acest nou 2×2 „metapixel” din fiecare pixel sursă. Ieșirea este apoi afișată într-o fereastră popup.

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

Captură de ecran redimensionată:

Comentarii

  • [1:2;2:3]==n este inteligent!’ nu puteți elimina b=[a,a;a,a];?
  • @LuisMendo Mulțumesc =) Într-adevăr funcționează, nu ‘ nu vă așteptați la asta!

Răspuns

Python 3, 259 254 octeți

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

Numele fișierului de intrare este dat în intrare standard. Ieșiri către o.png.

Exemplu de utilizare:

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

Mona Lisa cu filtrul Bayer invers aplicat

Comentarii

  • Bine ați venit la PPCG, primul răspuns frumos!

Răspuns

Mathematica 118 127 octeți

Trimiterea originală a folosit o imagine reală ca intrare. Acesta folosește în schimb un nume de fișier.

Aplică două reguli de înlocuire pentru datele de imagine ale fișierului la care se face referință:

  1. Pentru fiecare rând al matricei de date a imaginii, înlocuiți fiecare pixel { r, b, g} cu un pixel albastru, {0,0, b} urmat de un pixel verde, {0, g, 0};
  2. Separat, pentru fiecare rând al matricei de date a imaginii, înlocuiți fiecare pixel {r, b, g} cu un pixel verde {0, g, 0} urmat de un pixel roșu, {r, 0,0};

Apoi Riffle (adică intercalează) matricile rezultate din 1 și 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"] 

reverse bayer

Comentarii

  • Nu sunt sigur, dar acest lucru nu ‘ pare să satisfacă ” Luați un nume de fișier ca în input
  • agtoever, acum folosește ca intrare un nume de fișier în loc de o imagine.

Răspuns

J, 100 9 6 90 octeți

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

Acesta este un script în J care citește numele de fișier al imaginii de intrare din stdin și scoate rezultatul într-un fișier numit o. Imaginile de intrare și ieșire vor fi ambele în format bmp. De asemenea, se așteaptă să fie introdus doar numele fișierului, ceea ce înseamnă că spațiul alb principal și final nu ar trebui să fie prezent.

Exemplu de utilizare

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

Exemplu

Explicație

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" 

Răspuns

Python 2, 256 275 octeți

Mai întâi am simplificat codul original:

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

Apoi micșorați la:

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

Rezultând imaginea o.png:

imagine o.png după procesare

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *