Я думаю, что основная проблема связана с динамическим диапазоном, ваш алгоритм, вероятно, правильный, но вы работаете с неправильным типом данных.
Точечный источник света, который в противном случае обрезал бы и получал чистый белый цвет, рассеивался через большую область расфокусированным объективом, так что он формировал диск, который не был бы таким ярким и, следовательно, не обрезался.
Вот почему вы получаете эти красивые круги в вашем настоящем изображении боке. Если вы обрезаете сигнал (делая его менее ярким, чем он был бы, а затем распространяете его с помощью симуляции боке), вы получаете тусклый круг (или шестиугольник, или что-то еще), который не выделяется и, следовательно, не выглядит реалистичным.
То, что у вас есть в реальной цепочке изображений:
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 камеры сильно изменен с математической точки зрения), вы получите совсем другой результат.