Próbuję napisać skrypt, który przechodzi przez każdy piksel na zdjęciu i nakłada efekt bokeh na obraz jako całość.
Zbudowałem skrypt na podstawie tego linku , jednak wydaje się, że to hack.
Mam trzy obrazy wejściowe: czarno-białą mapę głębi, fotografię i obraz „pędzla” bokeh (który jest obecnie sześciokątem). Dla każdego piksela fotografii wybijam pędzel bokeh, aby był wyśrodkowany na tym pikselu i był w kolorze tego piksela.
Wygląda ... dobrze na małych pędzlach bokeh, ale kiedy w ogóle zwiększę rozmiar pędzla bokeh, ostatecznie wygląda jak rozmycie gaussowskie. Oto zdjęcie rozmazanego kwadratu za pomocą mojego algorytmu:
Bez względu na ciemne krawędzie, mogę to naprawić.
Można powiedzieć, że różni się od gaussowskiego, ale wciąż jest daleko od tego, co można by nazwać bokeh, z wyraźnymi krawędziami:
Rozumiem, dlaczego mój algorytm robi to, co robi ... jak mogę dokładniej symulować bokeh?
źródło
Odpowiedzi:
Myślę, że głównym problemem jest zakres dynamiczny, twój algorytm prawdopodobnie ma rację, ale pracujesz na niewłaściwym typie danych.
Punktowe źródło światła, które w przeciwnym razie przycinałoby się i przechodziło w czystą biel, rozprzestrzenia się na większym obszarze przez rozmytą soczewkę, dzięki czemu tworzy dysk, który nie jest tak jasny i dlatego nie zacina się.
Właśnie dlatego masz ładne kręgi na swoim prawdziwym obrazie bokeh. Jeśli przyciśniesz sygnał (sprawiając, że będzie mniej jaśniejszy niż w innym przypadku, a następnie rozłożysz go za pomocą symulacji bokeh, otrzymasz przyciemniony okrąg (lub sześciokąt lub cokolwiek innego), który nie wyróżnia się, a zatem nie wygląda realistycznie.
To, co masz w prawdziwym łańcuchu obrazów, to:
To co robisz jest
Nie uzyskasz poprawnego wyniku, ponieważ nie pracujesz z danymi liniowymi.
Możesz spróbować zlinearyzować dane, zastąpić dowolny zakres dynamiczny, który został utracony z powodu przycinania, wykonać symulację bokeh, a następnie ponownie wykonać operacje nieliniowe!
Oto przykład. Zacząłem od obrazu HDR, który został zmapowany tonem, co daje wysoce nieliniowy wynik. To najgorszy rodzaj obrazu, przy którym można przeprowadzić symulację bokeh!
Wykonanie standardowej operacji splotu w celu symulacji bokeh (za pomocą narzędzia do rozmycia soczewek w Photoshopie) daje ten wynik, który jest bardzo podobny do tego, co otrzymujesz:
Aby uzyskać lepszy wynik, zastosowałem ekstremalną krzywą, aby spróbować przywrócić obraz mniej więcej taki, jaki byłby przed mapowaniem tonalnym, gdzie podświetlenia są znacznie, znacznie jaśniejsze niż reszta obrazu. Zrobiłem to za pomocą narzędzia poziomów, przesuwając środkowy sygnał wejściowy daleko w prawo, od 1,0 do około 0,2). Następnie zastosowałem narzędzie do rozmycia obiektywu, tak jak poprzednio. W końcu zastosowałem ekstremalną krzywą w przeciwnym kierunku do pierwszej krzywej. Rezultat, choć daleki od ideału, wygląda bardziej jak prawdziwy bokeh obiektywu:
Jeśli robisz to w kodzie, spróbuj podzielić każdą wartość na kostkę, a następnie zastosować procedurę symulacji bokeh, a następnie weź pierwiastek kostki z każdej wartości. Powinieneś zobaczyć poprawę. Może to wymagać drobnych poprawek.
tl; dr, nawet jeśli zaimplementowałeś idealny matematyczny model bokeh, należy go zastosować do nielipowanych danych liniowych. Jeśli zastosujesz te same obliczenia do mocno zmodyfikowanych danych (nawet standardowy aparat JPEG jest mocno zmodyfikowany z matematycznego punktu widzenia), otrzymasz zupełnie inny wynik.
źródło
Przede wszystkim w optyce tylko światło sumuje się, a ciemność nie. Upewnij się, że algorytm nie wykrapla ciemnych pikseli na zewnątrz swojej pierwotnej lokalizacji. Wynikowe piksele powinny raczej przypominać maksimum pobliskich pikseli źródłowych niż średnią. Lub, mówiąc dokładniej, sumowałbyś logarytmy wpływających na piksele źródłowe.
Inną możliwą przyczyną, dla której Twoje krawędzie mogą nie być ostre, jest brak ostrych krawędzi maski. Animacja na stronie podanej jako odniesienie może być źle zrozumiana, więc w masce oryginalny piksel jest jasny, a inne stopniowo ciemniejsze. To również przełożyłoby się na błotniste krawędzie w wyliczonym bokeh. W fotografii otwory mają wyraźne krawędzie, a nie stopniowe. W rzeczywistości większość pikseli w masce powinna mieć jednakową jasność, a tylko krawędzie (gdzie mniej niż piksel powinien być zabarwiony dla gładkiej linii) mogą mieć odcień szarości.
Wspominasz także o posiadaniu mapy głębokości, ale nie ma słowa na temat jej używania . Rozmiar maski bokeh powinien być skorelowany z głębią pikseli i różnicą głębokości płaszczyzny ogniskowej - im dalej piksel znajduje się w płaszczyźnie ogniskowej (w dowolnym kierunku), tym większa powinna być jego maska. W płaszczyźnie ogniskowej rozmiar maski powinien wynosić 1 × 1 piksel.
źródło