Я пытаюсь написать скрипт, который проходит через каждый пиксель на фотографии и применяет боке к изображению в целом.
Я создал скрипт, основанный на этой ссылке , однако это похоже на взлом.
У меня есть три входных изображения: черно-белая карта глубины, фотография и изображение кисти «боке» (в настоящее время это шестиугольник). Для каждого пикселя фотографии я ставлю кисть «боке», чтобы она была центрирована по этому пикселю и по цвету этого пикселя.
Это выглядит ... хорошо, на крошечных кисточках боке, но как только я увеличиваю размер кисти боке, все заканчивается тем, что выглядит как гауссово размытие. Вот картина таймс-квадрата, размытого моим алгоритмом:
Не бери в голову темные края, я могу это исправить.
Вы можете сказать, что он отличается от гауссовского, но он все еще далек от того, что можно с уважением назвать боке, с четкими краями:
Я понимаю, почему мой алгоритм делает то, что делает ... как я могу более точно симулировать боке?
Ответы:
Я думаю, что основная проблема связана с динамическим диапазоном, ваш алгоритм, вероятно, правильный, но вы работаете с неправильным типом данных.
Точечный источник света, который в противном случае обрезал бы и получал чистый белый цвет, рассеивался через большую область расфокусированным объективом, так что он формировал диск, который не был бы таким ярким и, следовательно, не обрезался.
Вот почему вы получаете эти красивые круги в вашем настоящем изображении боке. Если вы обрезаете сигнал (делая его менее ярким, чем он был бы, а затем распространяете его с помощью симуляции боке), вы получаете тусклый круг (или шестиугольник, или что-то еще), который не выделяется и, следовательно, не выглядит реалистичным.
То, что у вас есть в реальной цепочке изображений:
Что вы делаете
Вы не получите правильный результат, потому что вы не работаете с линейными данными.
То, что вы можете сделать, это попытаться линеаризовать данные, заменить любой динамический диапазон, который был потерян для отсечения, выполнить симуляцию боке, а затем повторить нелинейные операции!
Вот пример. Я начал с HDR-изображения, которое было отображено тонами, что дает очень нелинейный результат. Это худший тип изображения, с которым можно пытаться симулировать боке!
Выполнение стандартной операции свертки для имитации боке (с использованием инструмента размытия линз в Photoshop) дает такой результат, который очень похож на то, что вы получаете:
Чтобы получить лучший результат, я применил экстремальную кривую, чтобы попытаться вернуть изображение примерно к тому, что было бы до отображения тона, где блики намного, намного ярче, чем остальная часть изображения. Я сделал это с помощью инструмента уровней, толкая центральный вход далеко вправо, от 1,0 до 0,2). Затем я применил инструмент размытия линз, как и раньше. Наконец я применил крайнюю кривую в противоположном направлении к первой кривой. Результат, хотя и далек от идеального, больше похож на настоящее объективное боке:
Если вы делаете это в коде, попробуйте кубировать каждое значение, затем примените процедуру моделирования боке, а затем возьмите корень куба каждого значения. Вы должны увидеть улучшение. Это может занять некоторое время.
Т.Л., д - р , даже если вы реализовали идеальную математическую модель бока, она должна применяться на необрезаемых линейных данных. Если вы примените те же вычисления к сильно измененным данным (даже стандарт в JPEG камеры сильно изменен с математической точки зрения), вы получите совсем другой результат.
источник
Прежде всего, в оптике складывается только свет, а тьмы нет. Убедитесь, что ваш алгоритм не отбрасывает темные пиксели наружу от их исходного местоположения. Результирующие пиксели должны скорее напоминать максимум ближайших исходных пикселей, чем средний. Или, если быть более точным, вы бы суммировали логарифмы воздействия на исходные пиксели.
Другая возможная причина, по которой ваши края могут быть неострыми, - это если края вашей маски не острые. Анимация на странице, которую вы указали в качестве ссылки, может быть неправильно понята, поэтому в маске исходный пиксель становится ярким, а другие постепенно темнее. Это также может привести к мутным краям в расчетном боке. В фотографии апертуры имеют определенные края, а не постепенные. Таким образом, на самом деле большинство пикселей в маске должны иметь одинаковую яркость, и только края (где цвет должен быть меньше пикселя для гладкой линии) могут иметь некоторый оттенок серого.
Вы также упоминаете, что у вас есть карта глубины, но нет слов об ее использовании . Ваш размер маски боке должен быть коррелирован с глубиной пикселя и разницей глубины фокальной плоскости - чем дальше пиксель от фокальной плоскости (в любом направлении), тем больше должна быть его маска. В фокальной плоскости размер маски должен составлять 1 × 1 пиксель.
источник