Penso che il problema principale sia quello della gamma dinamica, il tuo algoritmo è probabilmente giusto ma stai lavorando su un tipo di dati sbagliato.
Una fonte di luce puntiforme che altrimenti taglierebbe e diventerebbe bianco puro viene diffusa su un'area più ampia da una lente sfocata, in modo da formare un disco che non è così luminoso e quindi non si ritaglia.
Ecco perché ottieni quei bei cerchi nella tua vera immagine bokeh. Se ritagli il segnale (rendendolo meno luminoso di quanto non sarebbe altrimenti e poi lo diffondi con la tua simulazione bokeh, otterrai un cerchio tenue (o esagono o qualsiasi altra cosa) che non si distingue e quindi non sembra realistico.
Quello che hai in una vera catena di immagini è:
bokeh (from the lens) -> digitisation (clipping) -> gamma correction & dynamic range compression
Quello che stai facendo è
sharp image -> digitisation (clipping) -> gamma correction & dynamic range compression -> bokeh simulation
Non otterrai il risultato corretto perché non stai lavorando con dati lineari.
Quello che puoi fare è tentare di linearizzare i dati, sostituire qualsiasi intervallo dinamico che è stato perso nel ritaglio, eseguire la simulazione del bokeh e quindi ripetere le operazioni non lineari!
Ecco un esempio Ho iniziato con un'immagine HDR che è stata tonemappata, dando un risultato altamente non lineare. Questo è il peggior tipo di immagine con cui provare la simulazione del bokeh!
Effettuare un'operazione di convoluzione standard per simulare il bokeh (usando lo strumento sfocatura obiettivo di Photoshop) produce questo risultato, che è molto simile a quello che stai ottenendo:
Per ottenere un risultato migliore, ho applicato una curva estrema per provare a riportare l'immagine all'incirca a quello che sarebbe stata prima del tonemapping, dove le alte luci sono molto, molto più luminose del resto dell'immagine. L'ho fatto con lo strumento Livelli, spingendo l'ingresso centrale molto a destra, da 1,0 a circa 0,2). Ho quindi applicato lo strumento sfocatura obiettivo, proprio come prima. Alla fine ho applicato una curva estrema nella direzione opposta alla prima curva. Il risultato, benché lontano dalla perfezione, sembra molto più simile al vero bokeh dell'obiettivo:
Se lo stai facendo nel codice, prova a cubare ogni valore, quindi applica la routine di simulazione del bokeh, quindi prendi la radice del cubo di ciascun valore. Dovresti vedere un miglioramento. Potrebbero essere necessarie alcune modifiche.
tl; dr anche se hai implementato un modello matematico perfetto di bokeh, deve essere applicato su dati lineari non ritagliati. Se si applicano gli stessi calcoli a dati fortemente modificati (anche uno standard in JPEG della fotocamera è fortemente modificato da un punto di vista matematico) si otterrà un risultato molto diverso.