Egy kép fordított Bayer-szűrője

Szinte az összes digitális fényképezőgép-érzékelő a fényérzékelők rácsába van rendezve. Minden fotóérzékelő érzékeny a elsődleges színek egyikére: piros, zöld és kék. Ezeknek a fotóérzékelőknek a rendezését Bayer szűrőnek nevezik feltalálója, Bryce Bayer a után > az Eastman Kodak. Kép készítése után négy fotóérzékelő komponálja a kép egy pixel RGB értékét. Az Ön feladata a folyamat megfordítása és a kapott képpontok színezése a szűrő színének megfelelően. Az egyszerűség kedvéért figyelmen kívül hagyjuk a gamma korrekciót .

Például: a “normál” előreinduló Bayer szűrő lépései:

  • a Pantone méhviasz színű világítótálca eléri az érzékelőt;
  • a BGGR (kék – zöld / zöld – Piros) szűrő ezt négy sugarra bontja.
  • A négy sugár az érzékelőt érinti, amely így hangzik: 81 – 168/168 – 235 (az érzékelő értékei 0 – 255 között mozognak);
  • A Bayer szűrő ezt egy RGB pixelre fordítja színes (235, 168, 81) színnel.

A fordított Bayer szűrő lépései a következők:

  • RGB pixel színnel (235, 168, 81) négy pixelre oszlik RGB értékekkel: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Challenge

Írja be a lehető legrövidebb függvényt vagy programot, amely a következőket hajtja végre:

  • Vegyen egy fájlnevet a bemenethez hasonlóan, és adja ki a DeBayered képet .
  • A kimenet fájlba írható vagy megjeleníthető a képernyőn.
  • T a kimenetnek kétszer akkorának kell lennie, mint az eredeti kép szélességének és kétszeresének.
  • A bemeneti kép minden képpontját a BGGR (kék – zöld / zöld – piros) Bayer szűrő szerint kell feltérképezni. minta a következő kép grafikus magyarázata szerint:

    Bayer Filter - BGGR - grafikus magyarázat

  • Feltételezzük, hogy mindkét zöld fényérzékelő ugyanazt a jelet kapja, így a Bayer mátrix mindkét G értéke megegyezik az RGB kép G értékével.

  • A kapott kép tömbábrázolását nem adhatja meg. A kimenetnek képnek vagy fájlnak kell lennie ( bármilyen megfelelő képformátumban ), amely képként megjeleníthető.

Példa

Ezt a fájlt bemenetként megadva:

Mona Lisa

A képnek a következőnek kell lennie:

DeBayered Mona Lisa

Hivatkozás a python megvalósítására:

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

Ne feledje: ez egy , így a legrövidebb kód nyer!

Megjegyzések

  • Majdnem rohamot kaptam, amikor görgettem
  • @Fatalize sajnálom ezért! 😉 Furcsa hatás, nem ‘ ez?
  • Az utasítások egy cellát mutatnak, amelynek tetején BG található sor és GR alján, míg a példaképen a RG látható, felül pedig a GB a fenekén. Ez azt jelenti, hogy bármilyen olyan elrendezés elfogadható, amely a két zöld cellát átlóra helyezi? (a többi GB / RG és GR / BG lenne.)
  • @LevelRiverSt az volt a szándékom, hogy betartjam a BGGR-t (a negyedik kihívási pontban leírtak szerint). Az én hibám, ha a tényleges példa kép RGGB-ben van. Kijavítom ‘ ezt, amint ‘ m a laptopomon.
  • Nem ‘ ne gondolja, hogy a példaképe helyes, az egyik számára furcsa kék árnyalatú

Válasz

Pyth, 26 bájt

[email protected],U2tU3" 

A bemeneti fájlnevet idézőjelekkel várja a stdin-en, és a következőhöz ír: / div>. Kimeneti példa:

Megjegyzések

  • Eddig a legrövidebb válasz. Hajlamos vagyok elfogadni, de jó lenne, ha hozzáadhatna egy magyarázatot a program működéséhez.
  • Éppen a Kronecker terméket használtam, egy korábbi kérdésre adott válasz segítségével: codegolf.stackexchange.com/questions/78797/… .

Válasz

Matlab, 104 92 bájt

Ez az RGB képek 3d tömb / mátrix reprezentációját használja a Matlab-ban, valamint a Kronecker termék , amelyre pontosan szükségünk van az új 2×2 “metapixel” létrehozásához az egyes forráspontokból. A kimenet ekkor megjelenik egy felugró ablakban.

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

Átméretezett képernyőfelvétel:

Megjegyzések

  • Ez a [1:2;2:3]==n okos!’ nem távolíthatja el a b=[a,a;a,a];?
  • @LuisMendo köszönet =) Valóban működik, én nem csináltam ‘ erre nem számíthat!

Válasz

Python 3, 259 254 bájt

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

A bemeneti fájlnév standard bemenet. Kimenet a következőhöz: o.png.

Példa felhasználásra:

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

Mona Lisa fordított Bayer szűrővel,

megjegyzések

  • Üdvözöljük a PPCG oldalán, jó első válasz!

Válasz

Mathematica 118 127 bájt

Az eredeti beküldés tényleges képet használt bemenetként. Ez helyette fájlnevet használ.

Két hivatkozási szabályt alkalmaz a hivatkozott fájl képadataira:

  1. A képadatmátrix minden egyes sorára cserélje le az egyes képpontokat { r, b, g} kék pixellel, {0,0, b}, majd zöld pixellel, {0, g, 0};
  2. külön, a képadatmátrix minden sorához, mindegyik pixelt {r, b, g} zöld képpontokkal {0, g, 0} cserélje ki, majd egy piros pixellel, {r, 0,0};

Ezután Riffle (azaz összeszövik) az 1-ből és a 2-ből származó mátrixokat.

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

fordított réteg

megjegyzések

  • Nem biztos, de úgy tűnik, hogy ez nem felel meg ‘ ” Fájlnév a bemenetben
  • agtoever, Most bemenetként fájlnevet használ kép helyett.

Válasz

J, 100 9 6 90 bájt

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

Ez egy szkript a J-ben, amely beolvassa a bemeneti kép fájlnevét a stdin-ből, és az eredményt kiadja egy fájlba o. A bemeneti és a kimeneti képek egyaránt bmp formátumban lesznek. Azt is elvárja, hogy csak a fájlnév legyen beviteli, ami azt jelenti, hogy a vezető és a záró szóköz ne legyen jelen.

Mintahasználat

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

Minta

Magyarázat

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" 

Válasz

Python 2, 256 275 bájt

Először egyszerűsítettem az eredeti kódot:

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

Ezután tömörítse a következőre:

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

Eredmény a képen o.png:

o.png kép feldolgozás után

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük