Я думаю, що головна проблема полягає в динамічному діапазоні, ваш алгоритм, ймовірно, правильний, але ви працюєте над неправильним типом даних.
Точкове джерело світла, яке в іншому випадку відсікається і перетворюється чисто білим, поширюється на більшу площу розфокусованою лінзою, так що він утворює диск, який не такий яскравий і, отже, не затискається.
Ось чому ви отримуєте ці приємні кружечки у своєму справжньому боке-образі. Якщо ви зафіксуєте сигнал (зробивши його менш яскравим, ніж це було б інакше), а потім розкладете його за допомогою симуляції боке, ви отримаєте тьмяне коло (або шестикутник, чи будь-що інше), яке не виділяється і, таким чином, не виглядає реалістичним.
Що у вас є в реальному ланцюжку зображень:
bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression
Що ти робиш, так і є
sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation
Ви не отримаєте правильний результат, оскільки не працюєте з лінійними даними.
Що ви можете зробити, це спробувати лінеаризувати дані, замінити будь-який динамічний діапазон, який був втрачений на відсікання, виконати симуляцію боке, а потім повторити нелінійні операції!
Ось приклад. Я почав із зображення HDR, яке було тоналізоване, даючи дуже нелінійний результат. Це найгірший тип зображення, з яким можна спробувати імітувати боке!
Виконуючи стандартну операцію згортання для імітації боке (використовуючи інструмент розмивання об'єктива фотошопу), ви отримуєте цей результат, який дуже схожий на те, що ви отримуєте:
Для кращого результату я застосував крайню криву, щоб спробувати повернути зображення приблизно таким, яким воно було б до тоналізації, де яскраві виділення набагато яскравіші, ніж решта зображення. Я зробив це за допомогою інструменту рівнів, просунувши центральний вхід вправо, від 1,0 до приблизно 0,2). Потім я застосував інструмент розмивання лінз, як і раніше. Нарешті я застосував крайню криву у зворотному напрямку до першої кривої. Результат, хоча довгий шлях від ідеального, набагато більше нагадує справжній боке об'єктива:
Якщо ви робите це в коді, спробуйте зрізати кожне значення, потім застосуйте свою схему моделювання боке, а потім візьміть корінь куба кожного значення. Ви повинні побачити покращення. Це може зайняти певне налаштування.
tl; dr, навіть якщо ви реалізували досконалу математичну модель боке, вона повинна бути застосована до відсічених лінійних даних. Якщо застосувати ті ж обчислення до сильно змінених даних (навіть стандарт у JPEG камери сильно модифікований з математичної точки зору), ви отримаєте зовсім інший результат.