Jak wspomniano w innych odpowiedziach, dyfrakcja doprowadziła do nieostrości. Aby to sprawdzić, można spróbować wyostrzyć obraz za pomocą dekonwolucji, używając funkcji rozproszenia punktów odpowiadającej F / 29. W przypadku dyfrakcji mamy (do ogólnej normalizacji)
P (s) = {J 1 [π rs / ( λF )] / [π rs / ( λF )]} 2
gdzie J 1 jest funkcją Bessela pierwszego rodzaju rzędu 1 ,
s jest odległością na obrazie mierzoną w pikselach,
r jest wielkością jednego piksela (zwykle około 4,2 * 10 ^ (- 6) metrów dla czujników uprawy),
λ jest długością fali światła, a
F liczbą F, w tym przypadku 29.
Odnosi się to do światła monochromatycznego, aby przybliżyć przybliżoną funkcję rozproszenia punktów dla kanałów kolorów, którą możemy uśrednić dla pewnego odpowiedniego zakresu długości fal. Ponadto należy zintegrować P (s) na obszarze piksela określonym przez s.
Jeśli w ten sposób skompilujemy 3-punktowe funkcje rozproszenia dla 3 kanałów kolorów, możemy wyostrzyć obraz, przekształcając go w liniową przestrzeń kolorów i stosując algorytm dekonwolucji, a następnie przekształcając z powrotem do sRGB. Mam następujący wynik:
Tak więc twarz została znacznie wyostrzona przy użyciu tylko danych o liczbie F i założenia o wielkości piksela. Artefakty paskowania są widoczne w ciemnej części obrazu, wynika to z posteryzacji po przekształceniu z powrotem do sRGB.
Zgodnie z życzeniem dodam więcej szczegółów na temat używanych programów. Użyłem ImageJ i ImageMagick , użyłem również Mathematica do obliczenia funkcji rozproszenia punktów, ale można to również zrobić w ImageJ. Zacznę od wyjaśnienia, w jaki sposób dokonuję dekonwolucji za pomocą ImageJ, kiedy mam już funkcję rozpraszania punktów. Aby wykonać dekonwolucję, musisz zainstalować wtyczkę do ImageJ, użyłem tej wtyczki w tym przypadku, ale dostępne są również inne wtyczki, np . Wtyczka DeconvolutionLab .
Najpierw musisz przekonwertować na liniową przestrzeń kolorów, użyłem ImageMagick, aby przekonwertować nieostry obraz (input.jpg) na liniową przestrzeń kolorów za pomocą polecenia:
convert input.jpg -colorspace RGB output.tif
Następnie za pomocą ImageJ otworzysz plik output.tif. Następnie z opcji menu wybierz „obraz”, następnie „kolor”, a następnie „Kanały pluć”. Następnie z menu wybierz „wtyczki”, a następnie „równoległą iteracyjną dekonwolucję”, a następnie 2d dekonwolucję pośrednią ”.
Następnie pojawia się okno dekonwolucji, następnie wybierasz obraz, a „PSF” oznacza funkcję rozkładania punktów, tam wybierasz plik obrazu, który zawiera funkcję rozkładu punktów. Jako metodę wybrałem „WPL” opartą na filtrze Wienera, który zwykle działa dość dobrze w przypadku obrazów o niskim poziomie szumów. W opcjach WPL zaznacz „normalizuj PSF”, a dla filtra dolnoprzepustowego zmień wartość na 0,2, domyślnie jest to 1, ale niższa wartość jest lepsza dla obrazów o niskim poziomie szumów (jeśli wybierzesz większy, to „ Otrzymasz obraz, który jest mniej ostry). Pozostałe opcje, Granica, mogą być wybrane jako refleksyjne, zmiana rozmiaru może być ustawiona na „następną moc 2”, wyjście może być ustawione na 32 bity, precyzja może być ustawiona na podwojoną wartość. Wybrałem maksymalną liczbę iteracji na 15,
Następnie uruchom program, klikając „dekonwoluj”. Otrzymasz 32-bitowy plik obrazu jako wynik. Zwykle wartości w pikselach są dość podobne do tych, które były na oryginalnym obrazie, ale niektóre piksele mogą przekraczać maksimum dla oryginalnego formatu obrazu. Tak więc w tym przypadku zaczęliśmy od obrazów 8-bitowych, ale na obrazie rozkręconym możesz mieć wartości szare przekraczające 255, co powoduje, że cały obraz staje się zbyt ciemny. Należy to naprawić, przycinając te piksele do 255, co można zrobić, wybierając w menu „proces”, a następnie „Matematyka”, a następnie „Max”. Wartość maksymalna zostanie następnie wykorzystana do przycięcia szarych wartości, które przekraczają tę wartość. Pamiętaj, że zostanie to zrobione z obrazem, który ostatnio klikałeś. Możesz również zobaczyć, który plik jest „bieżącym plikiem”, wybierając „
Następnie po rozłożeniu trzech składników kolorów można je połączyć, wybierając w menu „obraz”, następnie „kolor”, a następnie „Scal kanały”. Następnie otrzymujesz złożony obraz, który możesz przekonwertować na 8-bitowy RGB za pomocą polecenia „Stack to RGB”, które tam znajdziesz.
Następnie zapisz ten obraz, nazwijmy go im.tif. Na koniec musisz przekonwertować to na sRGB, możesz to zrobić za pomocą ImageMagick za pomocą polecenia:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
Pozostaje pytanie, jak uzyskać funkcję rozkładania punktów. W praktyce, gdybyś zrobił zdjęcie takie jak omawiane tutaj, mógłbyś po prostu zrobić zdjęcie źródła punktowego, np. Gwiazdy o F / 29 i użyć go jako funkcji rozrzutu punktów. Alternatywnie można spojrzeć na granice o wysokim kontraście i wyodrębnić funkcję rozproszenia punktów ze sposobu, w jaki wartości szarości zmieniają się z jednej wartości na drugą w poprzek granicy. Ale wtedy próbujesz wyostrzyć obraz najlepiej, jak potrafisz.
W tym przypadku celem było skompilowanie funkcji rozproszenia punktów dla kanału kolorów w oparciu o to, czego można oczekiwać dla F / 29, dekonwolować obraz i sprawdzić, czy wynik wygląda na wystarczająco poprawiony. Użyłem Mathematiki do wykonania obliczeń, a który z tak zaawansowanego programu algebry komputerowej jest dość łatwy do wykonywania wszelkiego rodzaju manipulacji, w tym uśredniania dla przedziału długości fali i całkowania na obszarach pikseli, aby uczynić PSF bardziej realistycznym.
Ale ImageJ pozwala również utworzyć nowy obraz, którego można użyć jako funkcji rozrzucania punktów. Jeśli klikniesz „Plik”, a następnie „Nowy”, możesz utworzyć 32-bitowy obraz o rozmiarze, powiedzmy, 64 na 64 wypełniony czarnym kolorem. Następnie można zaprogramować formułę wartości szarości, wybierając „proces”, następnie „Matematyka”, a następnie „Makro”. Aby uzyskać funkcję rozproszenia punktów dla tego przypadku, która obejmuje tutaj funkcję Bessela, możesz użyć faktu, że jest ona dobrze opisana przez kilka pierwszych terminów rozszerzenia serii. Strona MathWorld, do której odsyłam, daje rozszerzenia tej serii, więc J 1 (x) 2 / x 2 z x = π rs / ( λF ) można zastąpić funkcją w postaci A + B s 2 + C s 4. To przybliżenie stanie się nieważne, jeśli s jest zbyt duży. Teraz wiemy, że PSF dąży do zera, np. W odległości około 5 lub 6 pikseli można go ustawić na zero. Zakładając, że wielomian jest wciąż mały przy tych wartościach, możesz napisać Makro jako:
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
Następnie tworzysz 3 obrazy dla, powiedzmy, lambda = 650 nm, 500 nm i 400 nm lub dowolnych innych wartości, które Twoim zdaniem są odpowiednie do przedstawienia dyfrakcji w 3 kanałach kolorów. Następnie możesz wykonać uśrednianie dla kilku różnych długości fali, tworząc zdjęcia dla różnych lambda, a następnie wybierając „proces”, a następnie „kalkulator obrazu” i tam wybierz „dodaj”. Następnie możesz dodać kolejny obraz do tego wyniku, a po zakończeniu dodawania możesz podzielić, aby uzyskać średnią, wybierając „proces”, następnie „matematyka”, a następnie „dziel”.