Какой алгоритм я могу использовать для имитации боке?


12

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

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

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

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

введите описание изображения здесь

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

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

введите описание изображения здесь

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


1
Возможно, это поможет: в чем разница между Bokeh и Gaussian Blur?
Imre

@ Я понимаю различия и то, что Bokeh обычно вызывается линзой, а Gaussian - постобработкой, но я хочу смоделировать Bokeh.
Сущность

@Entity: Как мне искать образцы изображений с точной картой глубины? Твой точен? Я хотел бы попробовать это сам (после финала). Может быть, я дам ответ через пару недель. Если ваша публикация общедоступна, могу ли я иметь ссылку на нее?
Мартин Курто

@MartijnCourteaux Для моего начального тестирования я просто использую плоскую карту глубины, чтобы все было размыто. Для простой геометрии (например, чашка на столе), я думаю, было бы довольно просто сделать красивую карту глубины. Для более сложных изображений вам, вероятно, понадобится настоящая карта глубины. Это можно рассчитать по двум изображениям или даже по одному вашему изображению .
Сущность

Ответы:


20

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

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

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

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

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

Что вы делаете

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

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

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

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

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

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

 

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

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


12

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

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

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


При условии, что все операции являются аддитивными, у вас не возникнет проблема распространения темных областей. Это правда, что вам нужны острые маски, чтобы получить острые круги, но основная проблема заключается в том, что его операция боке применяется к нелинейным данным.
Мэтт Грум
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.