Jakiego algorytmu mogę użyć do symulacji bokeh?


12

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:

wprowadź opis zdjęcia tutaj

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:

wprowadź opis zdjęcia tutaj

Rozumiem, dlaczego mój algorytm robi to, co robi ... jak mogę dokładniej symulować bokeh?



@Imre Rozumiem różnice i że Bokeh jest zwykle powodowane przez obiektyw, a Gaussa przez przetwarzanie końcowe, ale chcę symulować Bokeh.
Entity

@Entity: Jak szukać przykładowych obrazów z dokładną mapą głębokości? Czy twoje jest dokładne? Chciałbym tego spróbować sam (po finałach). Może wtedy wymyślę odpowiedź za kilka tygodni. Jeśli twój jest publiczny, czy mogę dostać link do niego?
Martijn Courteaux,

@MartijnCourteaux Do moich pierwszych testów używam tylko płaskiej mapy głębokości, aby wszystko było rozmazane. W przypadku prostej geometrii (np. Filiżanki na stole) wydaje mi się, że dość dobrze byłoby stworzyć dobrze wyglądającą mapę głębokości. W przypadku bardziej złożonych obrazów prawdopodobnie potrzebujesz prawdziwej mapy głębokości. Można to obliczyć na podstawie dwóch zdjęć, a nawet tylko jednego obrazu .
Entity

Odpowiedzi:


20

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:

bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression

To co robisz jest

sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation

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.


12

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.


Pod warunkiem, że wszystkie operacje są addytywne, nie spowoduje to rozprzestrzeniania się ciemnych obszarów. To prawda, że ​​potrzebujesz ostrej maski, aby uzyskać ostre koła, ale głównym problemem jest to, że jego działanie bokeh jest stosowane do danych nieliniowych.
Matt Grum,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.