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