Какой алгоритм я могу использовать для имитации боке? - Фотопедия
12 голосов
/ 18 июня 2015

Я пытаюсь написать скрипт, который проходит через каждый пиксель на фотографии и применяет боке к изображению в целом.

Я создал скрипт, основанный на этой ссылке , однако это похоже на взлом.

У меня есть три входных изображения: черно-белая карта глубины, фотография и изображение кисти «боке» (в настоящее время это шестиугольник). Для каждого пикселя фотографии я проштампую кисть боке так, чтобы она была центрирована по этому пикселю и по цвету этого пикселя.

Это выглядит ... хорошо, на крошечных кисточках боке, но как только я увеличиваю размер кисти боке, в конечном итоге это выглядит как размытие по Гауссу. Вот картинка таймс-квадрата, размытого моим алгоритмом:

enter image description here

Не бери в голову темные края, я могу это исправить.

Вы можете сказать, что он отличается от гауссовского, но он все еще очень далек от того, что можно с уважением назвать боке, с четкими краями:

enter image description here

Я понимаю, почему мой алгоритм делает то, что делает ... как я могу более точно симулировать боке?

Ответы [ 2 ]

19 голосов
/ 18 июня 2015

Я думаю, что основная проблема связана с динамическим диапазоном, ваш алгоритм, вероятно, правильный, но вы работаете с неправильным типом данных.

Точечный источник света, который в противном случае обрезал бы и получал чистый белый цвет, рассеивался расфокусированной линзой на большей площади, так что он формировал диск, который не был бы таким ярким и, следовательно, не обрезался.

Вот почему у вас есть эти красивые круги в вашем настоящем изображении боке. Если вы обрезаете сигнал (делая его менее ярким, чем он был бы, а затем распространяете его с помощью симуляции боке), вы получаете тусклый круг (или шестиугольник, или что-то еще), который не выделяется и, следовательно, не выглядит реалистичным.

То, что у вас есть в реальной цепочке изображений:

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

То, что вы делаете, это

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

Вы не получите правильный результат, потому что вы не работаете с линейными данными.

Что вы можете сделать, это попытаться линеаризовать данные, заменить любой динамический диапазон, который был потерян для отсечения, выполнить симуляцию боке, , а затем повторить нелинейные операции!

Вот пример. Я начал с HDR-изображения, которое было отображено в тон, что дает очень нелинейный результат. Это худший тип изображения для попытки симуляции боке!

http://mattgrum.com/photo_se/hdr-original.jpg

Выполнение стандартной операции свертки для имитации боке (с помощью инструмента размытия линз в Photoshop) дает такой результат, который очень похож на то, что вы получаете:

http://mattgrum.com/photo_se/non-linear-bokeh.jpg

Чтобы получить лучший результат, я применил экстремальную кривую, чтобы попытаться вернуть изображение примерно к тому, что было бы до отображения тона, где блики намного, намного ярче, чем остальная часть изображения. Я сделал это с помощью инструмента уровней, толкая центральный вход далеко вправо, от 1,0 до 0,2). Затем я применил инструмент размытия линз, как и раньше. Наконец я применил экстремальную кривую в противоположном направлении к первой кривой. Результат, хотя и далек от идеального, больше похож на настоящее боке объектива:

http://mattgrum.com/photo_se/linear-hdr-bokeh2.jpg

Если вы делаете это в коде, попробуйте кубировать каждое значение, затем примените процедуру моделирования боке, а затем возьмите корень куба каждого значения. Вы должны увидеть улучшение. Это может занять некоторое время.

tl; dr , даже если вы реализовали идеальную математическую модель боке, она должна применяться к линейным данным без клипа. Если вы примените те же вычисления к сильно измененным данным (даже стандарт в JPEG камеры сильно изменен с математической точки зрения), вы получите совсем другой результат.

12 голосов
/ 18 июня 2015

Прежде всего, в оптике складывается только свет, а тьмы нет. Убедитесь, что ваш алгоритм не отбрасывает темные пиксели наружу от их исходного местоположения. Результирующие пиксели должны скорее напоминать максимум ближайших исходных пикселей, чем средний. Или, если быть более точным, вы бы суммировали логарифмы воздействия на исходные пиксели.

Другая возможная причина, по которой ваши края могут быть неострыми, может быть, если края вашей маски не острые. Анимация на странице, которую вы указали в качестве ссылки, может быть неправильно понята, поэтому в маске исходный пиксель становится ярким, а другие постепенно становятся темнее. Это также может привести к мутным краям в расчетном боке. В фотографии апертуры имеют определенные края, а не постепенные. Таким образом, на самом деле большинство пикселей в маске должны иметь одинаковую яркость, и только края (где для гладкой линии должен быть окрашен меньше чем пиксель) могут иметь некоторый оттенок серого.

Вы также упомянули, что имеет карту глубины, но нет слова на , используя . Ваш размер маски боке должен быть коррелирован с глубиной пикселя и разницей глубины фокальной плоскости - чем дальше пиксель от фокальной плоскости (в любом направлении), тем больше должна быть его маска. В фокальной плоскости размер маски должен составлять 1 × 1 пиксель.

Добро пожаловать на сайт Фотопедия, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...