Comme mentionné dans les autres réponses, la diffraction a conduit à une netteté. Pour mettre cela à l'épreuve, on peut essayer de rendre l'image plus nette en utilisant la déconvolution en utilisant la fonction d'étalement des points qui correspond à F / 29. Pour la diffraction, nous avons (jusqu'à une normalisation globale)
P (s) = {J 1 [π rs / ( λF )] / [π rs / ( λF )]} 2
où J 1 est la fonction de Bessel du premier type d'ordre 1 ,
s est la distance dans l'image mesurée en pixels,
r est la taille d'un pixel (généralement environ 4,2 * 10 ^ (- 6) mètres pour les capteurs de récolte),
λ est la longueur d'onde de la lumière, et
F le nombre F, dans ce cas 29.
Cela est alors vrai pour la lumière monochromatique, pour approximer la fonction d'étalement des points pour les canaux de couleur, nous pouvons faire la moyenne sur une plage appropriée de longueurs d'onde. De plus, il faut intégrer P (s) sur la zone du pixel spécifiée par s.
Si nous compilons des fonctions d'étalement à 3 points pour les 3 canaux de couleur de cette façon, nous pouvons rendre l'image plus nette en la transformant en espace colorimétrique linéaire et en appliquant un algorithme de déconvolution puis en la transformant à nouveau en sRGB. J'ai obtenu le résultat suivant:
Le visage a donc été nettement affiné en utilisant uniquement les données sur le nombre F et l'hypothèse sur la taille du pixel. Les artefacts de formation de bandes sont visibles dans la partie sombre de l'image, cela est dû à la postérisation après la reconversion en sRGB.
Comme demandé, j'ajouterai plus de détails sur les programmes utilisés. J'ai utilisé ImageJ et ImageMagick , j'ai également utilisé Mathematica pour calculer la fonction d'étalement des points, mais cela peut également être fait dans ImageJ. Je vais commencer par expliquer comment je fais la déconvolution avec ImageJ alors que j'ai déjà la fonction d'étalement de points. Pour faire la déconvolution, vous devez installer un plugin pour ImageJ, j'ai utilisé ce plugin pour ce cas, mais il existe également d'autres plugins disponibles, par exemple le plugin DeconvolutionLab .
Tout d'abord, vous devez convertir en espace colorimétrique linéaire, j'ai utilisé ImageMagick pour convertir l'image floue (input.jpg) en espace colorimétrique linéaire en utilisant la commande:
convert input.jpg -colorspace RGB output.tif
Puis avec ImageJ, vous ouvrez ensuite le fichier output.tif. Ensuite, dans les options du menu, vous sélectionnez "image" puis "couleur" puis "Spit Channels". Ensuite, dans le menu, sélectionnez "plugins" puis "déconvolution itérative parallèle" puis déconvolution interactive 2d ".
Vous obtenez alors la fenêtre de déconvolution, vous sélectionnez ensuite l'image et "PSF" signifie la fonction d'étalement du point, là vous sélectionnez le fichier image qui contient la fonction d'étalement du point. Pour la méthode, je choisis "WPL" qui est basé sur le filtre de Wiener, qui fonctionne généralement assez bien pour les images à faible bruit. Dans les options pour WPL, cochez la case "normaliser PSF", et pour le filtre passe-bas, changez la valeur à 0,2, par défaut c'est 1, mais une valeur inférieure est meilleure pour les images à faible bruit (si vous choisissez une taille plus grande, vous ' ll obtiendra une image moins nette). Les autres options, Limite peuvent être choisies pour être réflexives, le redimensionnement peut être réglé sur "puissance suivante de 2", la sortie peut être réglée sur 32 bits, la précision peut être réglée sur le double. J'ai choisi le nombre d'itérations maximum à 15,
Vous exécutez ensuite le programme en cliquant sur "déconvolver". Vous obtenez ensuite un fichier image 32 bits en sortie. Habituellement, les valeurs en pixels sont assez similaires à ce qu'elles étaient dans l'image d'origine, mais vous pouvez avoir des pixels qui dépassent le maximum pour le format d'image d'origine. Donc, dans ce cas, nous avons commencé avec des images 8 bits, mais dans l'image déconvolue, vous pouvez avoir des valeurs de gris qui dépassent 255, ce qui fait que l'image entière devient trop sombre. Cela doit être corrigé en écrêtant ces pixels à 255, ce que vous pouvez faire en sélectionnant dans le menu "processus" puis "Math" puis "Max". La valeur maximale sera ensuite utilisée pour découper les valeurs de gris qui dépassent cette valeur. Notez que cela se fera sur l'image sur laquelle vous avez cliqué pour la dernière fois. Vous pouvez également voir quel fichier est le "fichier actuel" en sélectionnant "
Ensuite, une fois que vous avez déconvolu les 3 composants de couleur, vous pouvez les combiner en sélectionnant dans le menu "image", puis "couleur" puis "Fusionner les canaux". Vous obtenez alors une image composite que vous pouvez convertir en RVB 8 bits en utilisant la commande "Empiler en RVB" que vous y trouverez.
Vous enregistrez ensuite cette image, appelons-la im.tif. Enfin, vous devez convertir ceci en sRGB, vous pouvez le faire avec ImageMagick en utilisant la commande:
convert im.tif -set colorspace RGB -colorspace sRGB output.tif
La question restante est alors de savoir comment obtenir la fonction d'étalement des points. En pratique, si vous aviez pris une photo comme celle discutée ici, vous auriez pu simplement prendre une photo d'une source ponctuelle, par exemple une étoile à F / 29 et l'utiliser comme fonction d'étalement de points. Alternativement, vous pouvez regarder les frontières à contraste élevé et extraire la fonction d'étalement des points de la façon dont les valeurs de gris changent d'une valeur à l'autre à travers la frontière. Mais alors vous essayez de rendre l'image plus nette que possible.
Dans ce cas, l'objectif était de compiler les fonctions d'étalement des points pour le canal de couleur en fonction de ce que vous attendez de F / 29, de déconvoluer l'image avec cela et de voir si le résultat semble suffisamment amélioré. J'ai utilisé Mathematica pour faire des calculs et pour lesquels un programme d'algèbre informatique avancé, il est assez facile de faire toutes sortes de manipulations, y compris la moyenne sur un intervalle de longueur d'onde et l'intégration sur des zones de pixels pour rendre le PSF plus réaliste.
Mais ImageJ vous permet également de créer une nouvelle image que vous pouvez utiliser comme fonction d'étalement des points. Si vous cliquez sur "Fichier" puis sur "Nouveau", vous pouvez créer une image 32 bits de taille, disons 64 par 64 remplie de noir. Vous pouvez ensuite programmer une formule pour les valeurs de gris en sélectionnant "processus", puis "Math" puis "Macro". Pour obtenir la fonction d'étalement de points pour ce cas qui implique la fonction de Bessel ici, vous pouvez utiliser le fait qu'elle est bien décrite par les premiers termes de l'expansion de la série. La page MathWorld à laquelle j'ai lié vous donne les extensions de cette série, donc, J 1 (x) 2 / x 2 avec x = π rs / ( λF ) peut être remplacé par une fonction de la forme A + B s 2 + C s 4. Cette approximation deviendra invalide si s est trop grand. Maintenant, nous savons que le PSF tend vers zéro, par exemple à une distance d'environ 5 ou 6 pixels, il peut être mis à zéro. En supposant que le polynôme est encore petit à ces valeurs, vous pouvez écrire la macro comme:
if(d<7) v = A + B * pow(d,2) + B * pow(d,4)
Vous créez ensuite 3 images pour, disons, lambda = 650 nm, 500 nm et 400 nm, ou toute autre valeur que vous jugez appropriée pour représenter la diffraction dans les 3 canaux de couleur. Vous pouvez ensuite faire la moyenne sur plusieurs longueurs d'onde différentes en créant des images pour différents lambda puis en sélectionnant "processus", puis "calculatrice d'image", et là vous sélectionnez "ajouter". Vous pouvez ensuite ajouter une autre image à ce résultat et lorsque vous avez terminé l'ajout, vous pouvez diviser pour obtenir la moyenne en sélectionnant "processus", puis "mathématiques" puis "diviser".