Odwrócony filtr Bayera obrazu

Prawie wszystkie czujniki aparatu cyfrowego są zorganizowane w siatce fotoczujników. Każdy czujnik fotograficzny jest czuły na jeden z kolorów podstawowych : czerwony, zielony i niebieski. Sposób organizacji tych czujników fotograficznych jest nazywany filtrem Bayera , od nazwiska jego wynalazcy, Bryce Bayer firmy Eastman Kodak. Po zrobieniu zdjęcia cztery fotokomórki tworzą wartość RGB jednego piksela w wynikowym obrazie. Twoim zadaniem jest odwrócenie tego procesu i pokolorowanie wynikowych pikseli zgodnie z ich kolorem filtra. Dla uproszczenia zignorujemy korekcję gamma .

Na przykład: „normalne” kroki filtrowania Bayera w przód to:

  • latarka z kolorem Pantone Beeswax uderza w czujnik;
  • BGGR (niebieski – zielony / zielony – Czerwony) filtr rozkłada to na cztery promienie.
  • Cztery promienie uderzają w czujnik, który brzmi: 81 – 168/168 – 235 (wartości czujnika mieszczą się w zakresie 0 – 255);
  • Filtr Bayera tłumaczy to na jeden piksel RGB z kolorem (235, 168, 81).

Odwrotne kroki filtra Bayera to:

  • Piksel RGB z kolorem (235, 168, 81) jest podzielony na cztery piksele z wartościami RGB: (0,0,81) – (0,168,0) / (0,168,0) – (235,0,0).

Wyzwanie

Powinieneś napisać możliwie najkrótszą funkcję lub program, który wykonuje następujące czynności:

  • Weź nazwę pliku na wejściu i wyślij obraz DeBayered .
  • Dane wyjściowe mogą zostać zapisane do pliku lub wyświetlone na ekranie.
  • T Wyjście musi być dwa razy większe i dwa razy większe niż oryginalny obraz.
  • Każdy piksel obrazu wejściowego musi być odwzorowany zgodnie z filtrem Bayera BGGR (niebieski – zielony / zielony – czerwony) wzór jak wyjaśniono graficznie na poniższym obrazku:

    Filtr Bayera - BGGR - wyjaśnienie graficzne

  • Zakładamy, że oba zielone fotokomórki odbierają ten sam sygnał, więc obie wartości G w macierzy Bayera są równe wartości G na obrazie RGB.

  • Nie możesz nie zwrócić reprezentacji tablicowej wynikowego obrazu. Wyjście musi być obrazem lub plikiem (w dowolnym odpowiednim formacie obrazu ), który można wyświetlić jako obraz.

Przykład

Biorąc pod uwagę ten plik jako dane wejściowe:

Mona Lisa

Wynikowy obraz powinien wyglądać następująco:

DeBayered Mona Lisa

Referencyjna implementacja Pythona:

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

Pamiętaj: to jest , więc najkrótszy kod wygrywa!

Komentarze

  • Prawie dostałem ataku podczas przewijania
  • @Fatalize przepraszam za to! 😉 Dziwny efekt, czy nie ' t it?
  • Instrukcje pokazują komórkę z BG na górze wiersz i GR na dole, podczas gdy przykładowe zdjęcie przedstawia RG na górze i GB na dole. Czy to oznacza, że każdy układ, który umieszcza dwie zielone komórki na przekątnej, jest akceptowalny? (pozostałe to GB / RG i GR / BG.)
  • @LevelRiverSt Moim zamiarem było trzymanie się BGGR (jak określono w czwartym punkcie wyzwania). Mój błąd, jeśli rzeczywisty przykładowy obraz jest w RGGB. ' poprawię to, gdy tylko ' m na swoim laptopie.
  • Nie ' Nie sądzę, że Twój przykładowy obraz jest poprawny, ponieważ jeden ma dziwny niebieski odcień

Odpowiedź

Pyth, 26 bajtów

[email protected],U2tU3" 

Oczekuje nazwy pliku wejściowego z cudzysłowami na stdin i zapisuje do o.png. Przykładowe dane wyjściowe:

Komentarze

  • Twoja odpowiedź jest jak dotąd najkrótsza. Zwykle to akceptuję, ale byłoby miło, gdybyś mógł dodać wyjaśnienie, jak działa twój program.
  • Właśnie użyłem produktu Kronecker, używając odpowiedzi z poprzedniego pytania: codegolf.stackexchange.com/questions/78797/… .

Odpowiedź

Matlab, 104 92 bajty

Wykorzystuje trójwymiarową reprezentację obrazów RGB w Matlabie, a także produkt Kronecker , który jest dokładnie tym, czego potrzebujemy, tworząc ten nowy „metapiksel” 2×2 z każdego piksela źródłowego. Wynik jest następnie wyświetlany w wyskakującym okienku.

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

Zrzut ekranu o zmienionym rozmiarze:

Komentarze

  • To [1:2;2:3]==n jest sprytne!Czy ' t usunąć b=[a,a;a,a];?
  • @LuisMendo Thanks =) To rzeczywiście działa, nie ' nie oczekuj tego!

Odpowiedź

Python 3, 259 254 bajtów

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

Nazwa pliku wejściowego jest podana w standardowe wejście. Dane wyjściowe do o.png.

Przykładowe użycie:

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

Mona Lisa z zastosowanym odwróconym filtrem Bayera

Komentarze

  • Witamy w PPCG, miła pierwsza odpowiedź!

Odpowiedź

Mathematica 118 127 bajtów

Pierwotnie przesłane dane wykorzystywały rzeczywisty obraz jako dane wejściowe. Zamiast tego używa nazwy pliku.

Stosuje dwie reguły zastępowania do danych obrazu pliku, do którego się odwołuje:

  1. Dla każdego wiersza macierzy danych obrazu, zamień każdy piksel { r, b, g} z niebieskim pikselem, {0,0, b}, po którym następuje zielony piksel, {0, g, 0};
  2. Oddzielnie, dla każdego wiersza macierzy danych obrazu, zamień każdy piksel {r, b, g} na zielony piksel {0, g, 0}, po którym następuje czerwony piksel, {r, 0,0};

Następnie Riffle (tj. Przeplatają) macierze wynikające z 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

Komentarze

  • Nie jestem pewien, ale to nie ' wydaje się zadowalać ” Wybierz nazwę pliku jako w danych wejściowych
  • agtoever, używa teraz nazwy pliku zamiast obrazu.

Odpowiedź

J, 100 9 6 90 bajtów

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

To jest skrypt w języku J, który czyta nazwę pliku obrazu wejściowego ze standardowego wejścia i wysyła wynik do pliku o nazwie o. Obrazy wejściowe i wyjściowe będą w formacie bmp. Oczekuje również, że wprowadzona zostanie tylko nazwa pliku, co oznacza, że początkowe i końcowe spacje nie powinny być obecne.

Przykładowe użycie

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

Przykład

Wyjaśnienie

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" 

Odpowiedź

Python 2, 256 275 bajtów

Najpierw uprościłem oryginalny kod:

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

Następnie zmniejsz do:

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

W rezultacie powstał obraz o.png:

obraz o.png po przetworzeniu

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *