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:
-
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:
Wynikowy obraz powinien wyglądać następująco:
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 code-golf , więc najkrótszy kod wygrywa!
Komentarze
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
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:
- 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};
- 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"]
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
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
:
BG
na górze wiersz iGR
na dole, podczas gdy przykładowe zdjęcie przedstawiaRG
na górze iGB
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.)