Beaucoup de personnes se demandent comment reconstituer une image nette à partirr de deux images dont une partie est nette dans chacune des deux images. Je vais à travers ce tutoriel vous montrer méthodes qu’on peut utiliser pour faire la reconstitution d’image avec matlab ou python.
Voici les trois méthodes utilisées pour faire les opérations de calcul de focus :
- Écart type local de l’image ou Local standard deviation of image
- Entropie locale de l’image en niveaux de gris ou Local entropy of grayscale image
- Portée locale de l’image ou Local range of image
Avant de commencer il faut lire les images qu’on veut utiliser pour faire la reconstitution en matlab avec la fonction :
img1= im2double(imread(‘p30a.jpg’));
img2=im2double(imread(‘p30b.jpg’));
On va maintenant appliquer la méthode qu’on veut utiliser. Si on prend chacune d’elle on peut les appliquer des manières suivantes:
Écart type local de l’image ou Local standard deviation of image
J1 = stdfilt(img1) et J2 = stdfilt(img2) de sorte J1 et J2 effectue chacune un filtrage par écart type de l’image img1 et img2 et renvoie l’image filtrée J1 et J1. La valeur de chaque pixel de sortie est l’écart type du voisinage 3 par 3 autour du pixel d’entrée correspondant. Pour lespixels situés sur les bords de I, stdfilt utilise un rembourrage symétrique. Dans le rembourrage symétrique,les valeurs des pixels de rembourrage sont une réflexion miroir des pixels de bordure dans I (img1 ou img2).Image filtrée, renvoyée sous la forme d’un tableau numérique de même taille que l’image d’entrée I. La classe de J est double.
J1=stdfilt(img1);%Local standard deviation of image
J2=stdfilt(img2);
Ensuite on a:
%focus=max(max(J1(i,j,k),J2(i,j,k)));%Local standard deviation of image de sorte que notre image qui sera reconstituée sera celle qui va récupérer le maximun des pixels de chacune des deux images pour former une nouvelle image.
Voici le résultat que nous avons en applique la méthode de l’Écart type local de l’image
Entropie locale de l’image en niveaux de gris ou Local entropy of grayscale image
L’entropie est une mesure statistique du caractère aléatoire qui peut être utilisée pour caractériser la texture
de l’image d’entrée. L’entropie est définie comme : –Σ(P * log2(P)), où p contient le nombre d’histogrammes normalisés renvoyés par l’imhist.
Par défaut, entropyfilt utilise deux bacs pour les tableaux logiques. entropyfilt convertit toute autre classe
en uint8 pour le calcul du nombre d’histogrammes et utilise 256 bacs afin que les valeurs des pixels soient
discrètes et correspondent directement à une valeur de bac.
J = entropyfilt(I) renvoie le tableau J, où chaque pixel de sortie contient la valeur d’entropie du
voisinage 9 par 9 autour du pixel correspondant dans l’image d’entrée I.
Pour les pixels situés aux limites de I, entropyfilt utilise un remplissage symétrique. Dans le cas du
remplissage symétrique, les valeurs des pixels de remplissage sont une réflexion miroir des pixels de bordure
dans I.
Dans notre cas on :
b1= entropyfilt(img1); % Local entropy of grayscale image,
b2=entropyfilt(img2);
focus=max(max(b1(i,j,k),b2(i,j,k))); %Local entropy of grayscale image
Et enfin on a la méthode
Portée locale de l’image ou Local range of image
J = rangefilt(I) renvoie le tableau J, où chaque pixel de sortie contient la valeur de plage (valeur maximale
– valeur minimale) du voisinage 3 par 3 autour du pixel correspondant dans l’image d’entrée I.
La fonction rangefilt renvoie un tableau où chaque pixel de sortie contient la valeur de plage (valeur
maximale – valeur minimale) du voisinage 3 par 3 autour du pixel correspondant dans l’image d’entrée. Image
filtrée, retournée sous forme de tableau numérique, de même taille et de même classe que l’image d’entrée I,
à l’exception des types de données entières signées. La classe de sortie pour les types de données signées est
le type de données entières non signées correspondant. Par exemple, si la classe de I est int8 ou double, alors
la classe de J est uint8 ou double.Rangefilt utilise les fonctions morphologiques imdilate et imerode pour
déterminer les valeurs maximales et minimales dans le quartier spécifié. Par conséquent, le rangefilt utilise
le comportement de rembourrage de ces fonctions morphologiques.
c1=rangefilt(img1);% Local range of image
c2=rangefilt(img2);
Et on a le résultat suivant:
Enfin je vous montre le résultat global des trois méthodes:
Voir aussi (Lire et afficher une image avec opencv python)