Creo que el problema principal es uno de rango dinámico, su algoritmo probablemente sea correcto pero está trabajando en el tipo de datos incorrecto.
Una fuente de luz puntual que de otro modo se recortaría y pasaría a blanco puro se extiende sobre un área más grande por una lente desenfocada, de modo que forma un disco que no es tan brillante y, por lo tanto, no se recorta.
Es por eso que obtienes esos bonitos círculos en tu imagen bokeh real. Si recorta la señal (haciéndola menos brillante de lo que sería de otro modo y luego la extiende con su simulación de bokeh, obtendrá un círculo oscuro (o hexágono, o lo que sea) que no se destaque y, por lo tanto, no parezca realista.
Lo que tienes en una cadena de imagen real es:
bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression
Lo que estas haciendo es
sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation
No obtendrá el resultado correcto porque no está trabajando con datos lineales.
¡Lo que puede hacer es intentar linealizar los datos, reemplazar cualquier rango dinámico que se haya perdido por el recorte, realizar su simulación de bokeh y luego rehacer las operaciones no lineales!
Aquí hay un ejemplo. Comencé con una imagen HDR que ha sido mapeada, dando un resultado altamente no lineal. ¡Este es el peor tipo de imagen para intentar la simulación de bokeh!
Hacer una operación de convolución estándar para simular bokeh (usando la herramienta de desenfoque de lente de Photoshop) produce este resultado, que es muy similar a lo que está obteniendo:
Para obtener un mejor resultado, apliqué una curva extrema para intentar que la imagen volviera a ser lo que hubiera sido antes del mapeo de tonos, donde los resaltados son mucho, mucho más brillantes que el resto de la imagen. Hice esto con la herramienta de niveles, empujando la entrada central un largo camino hacia la derecha, de 1.0 a aproximadamente 0.2). Luego apliqué la herramienta de desenfoque de lente, como antes. Finalmente apliqué una curva extrema en la dirección opuesta a la primera curva. El resultado, aunque lejos de ser perfecto, se parece mucho más al bokeh de lente real:
Si está haciendo esto en código, intente dividir cada valor en cubos, luego aplique su rutina de simulación de bokeh y luego tome la raíz cúbica de cada valor. Deberías ver una mejora. Puede tomar algunos ajustes.
tl; dr incluso si ha implementado un modelo matemático perfecto de bokeh, debe aplicarse en datos lineales sin recortar. Si aplica los mismos cálculos a datos muy modificados (incluso un estándar en la cámara JPEG está muy modificado desde un punto de vista matemático) obtendrá un resultado muy diferente.