Catégorie dans Imagerie

Algorithmes de détection d’objets

Quels sont les algorithmes de détection d’objets par les réseaux de neurones?

En général, les détecteurs d’objets basés sur l’apprentissage en profondeur extraient des caractéristiques de l’image ou de l’image vidéo d’entrée. Un détecteur d’objets résout deux tâches successives :

  • Tâche n° 1 : trouver un nombre arbitraire d’objets (peut-être même zéro), et
  • Tâche n° 2 : classer chaque objet et estimer sa taille à l’aide d’un cadre de sélection.

En fonction de l’étude menée ou du résultat attendu, on peut utiliser des algorithmes qui combinent les deux tâches ( algorithmes à une étage) ou utiliser des algorithmes qui font séparément les tâches ( algorithmes à deux étages). Voyons plus en détails les deux types d’algorithmes, leurs avantages et inconvénients.  

  1. Méthodes  ou algorithmes à une étage: les détecteurs à une étape prédisent simultanément la probabilité de la classe de sortie et la position exacte de l’objet à détecter. Ils combinent les deux tâches en une seule ce qui fait que le processus prend moins de temps  ce qui fait que ces algorithmes sont les plus utilisés dans la détection en temps réel. Ces  détecteurs d’objets à un étage donnent la priorité à la vitesse d’inférence et sont super rapides mais pas moins bons (moins précis) pour reconnaître des objets de forme irrégulière ou un groupe de petits objets. Parmi les détecteurs à un étage les plus populaires on a:  YOLO,  SSD ,  RetinaNet, HOG etc….
  2. Méthodes ou algorithmes à deux étages: les détecteurs d’objets à deux étages utilisent d’abord le réseau de suggestion régional ( RPN) pour générer des boîtes à suggestions régionales approximatives puis utilisent  une tête de détection dédiée pour classer les objets dans l’image. En d’autre terme,  une proposition de région d’objet avec des méthodes conventionnelles de vision par ordinateur ou des réseaux profonds, suivie d’ une classification d’objet basée sur des caractéristiques extraites de la région proposée avec une régression de boîte englobante. Les méthodes en deux étapes ou étages permettent d’obtenir la précision de détection la plus élevée, mais sont généralement plus lentes. Les détecteurs d’objets à deux étages trouvent d’abord une région d’intérêt et utilisent cette région recadrée pour la classification. Parmi les détecteurs à deux étages ou étapes les plus populaires on a: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN etc…

Détection des objets

Détection des objets

Qu’est-ce que la détection d’objets ?

En vision par ordinateur ou computer vision,  la détection d’objets  est désignée par une méthode permettant de détecter la présence d’une instance ou d’une classe d’objets dans une image numérique[1] https://fr.wikipedia.org/wiki/D%C3%A9tection_d’objet.

Selon la terminologie usuelle on peut distinguer la détection, de la localisation et de la reconnaissance d’objets :

  • détection (ou classification) : présence d’une instance de l’objet dans l’image
  • reconnaissance : identification d’une instance particulière (« déchets  », « le visage d’une personne »…)
  • localisation (ou parfois détection) : situation précise de l’instance (détectée ou reconnue) dans l’image (cadre englobant ou segmentation de la zone).

Il est important de noter que pour des entités visuelles localisées (objet, visage, personne…), la détection et la localisation se confondent souvent.

La détection d’une classe d’objets est généralement considérée comme un problème plus difficile que la reconnaissance d’une instance particulière, puisqu’il faut identifier les caractéristiques communes à la classe en faisant abstraction de la variété des différentes instances au sein de ladite classe.

Approche générale

La détection d’un objet dans une image se décompose souvent en trois étapes qui sont:

Les méthodes utilisées pour faire la détection d’objets sont subdivisées en deux grandes familles (les méthodes de seuillages d’images(1) ou les méthodes utilisant l’intelligence artificielle (2) le machine learning ou le deep learning), chacune a ses avantages et inconvénients que nous allons décrire plus bas. 

1- Technique ou méthode de seuillage d’images: ne nécessitent généralement pas de données historiques(données pour faire un entrainement) pour la formation et ne sont pas supervisées par nature. La méthode de seuillage choisie est appliquée directement sur l’image ce qui permet d’avoir une segmentation binaire( segmentation en deux classes) avec une des deux classes représentant l’objet à identifier ou à détecter.

  • Avantages: ces tâches ne nécessitent pas d’ images annotées , où les humains étiquettent les données manuellement (pour une formation supervisée).
  • Inconvénients : ces techniques sont limitées à plusieurs facteurs, tels que les scénarios complexes (sans arrière-plan unicolore), l’occlusion (objets partiellement masqués), l’éclairage et les ombres, et l’effet de fouillis. Ces techniques ne peuvent pas être appliquées sur des images avec plusieurs variations d’éclairage ou d’arrière-plan.

2-Les méthodes d’intelligence artificielle ( machine learning ou le deep learning): reposent généralement sur une formation supervisée . Les performances sont limitées par la puissance de calcul  des GPU en fonction de la machine utilisée et des données(images).

  • Avantages : La détection d’objets d’apprentissage en profondeur ou par les techniques de l’intelligence artificielle est beaucoup plus robuste à l’occlusion, aux scènes complexes et à l’éclairage difficile.
  • Inconvénients : une énorme quantité de données (dans notre  cas images) d’entraînement est nécessaire pour avoir une bonne performance. Pour ce qui de vitesse de du modèle entraîné, il faut une machine avec un bon processeur (GPU) et une mémoire Ram avec une capacité assez élevée et  le processus d’ annotation d’images est laborieux et coûteux. Toutefois, il faut noter qu’il existe déjà des ensemble de données( datasets existants) permettant de faciliter la tâche si l’objet ou les objets à détecter est déjà présent dans une des classes des datasets existants.

Espaces colorimétriques dans OpenCV | Python

Les espaces colorimétriques sont un moyen de représenter les canaux de couleur présents dans l’image qui donnent à l’image cette teinte particulière. Il existe plusieurs espaces de couleurs différents et chacun a sa propre signification.
Certains des espaces colorimétriques populaires sont RVB (rouge, vert, bleu), CMJN (cyan, magenta, jaune, noir), HSV (teinte, saturation, valeur), etc.

Espace colorimétrique BGR : l’espace colorimétrique par défaut d’OpenCV est RVB. Cependant, il stocke en fait la couleur au format BGR. C’est un modèle de couleur additive où les différentes intensités de bleu, vert et rouge donnent différentes nuances de couleur.

Espace colorimétrique HSV : Il stocke les informations de couleur dans une représentation cylindrique des points de couleur RVB. Il tente de représenter les couleurs telles qu’elles sont perçues par l’œil humain. La valeur de teinte varie de 0 à 179, la valeur de saturation varie de 0 à 255 et la valeur de valeur varie de 0 à 255. Il est principalement utilisé à des fins de segmentation des couleurs.

Espace colorimétrique CMJN : Contrairement au RVB, il s’agit d’un espace colorimétrique soustractif. Le modèle CMJN fonctionne en masquant partiellement ou entièrement les couleurs sur un fond plus clair, généralement blanc. L’encre réduit la lumière qui serait autrement réfléchie. Un tel modèle est dit soustractif car les encres « soustraient » les couleurs rouge, vert et bleu de la lumière blanche. Lumière blanche moins feuilles rouges cyan, lumière blanche moins feuilles vertes magenta et lumière blanche moins feuilles bleues jaunes.

  • YUV : Même si RVB est bon à de nombreuses fins, il a tendanceêtre très limité pour de nombreuses applications réelles. Les gens ont commencé à réfléchir à différentes méthodes pour séparer les informations d’intensité des informations de couleur. Par conséquent, ils ont créé l’espace colorimétrique YUV. Y fait référence à la luminance ou à l’intensité, et les canaux U/V représentent les informations de couleur. Cela fonctionne bien dans de nombreuses applications car le système visuel humain perçoit les informations d’intensité très différemment des informations de couleur.

Visualiser les différents canaux de couleur d’une image RVB:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%20%20%0Aimage%20%3D%20cv2.imread(‘%2Fcontent%2Fprofil.jpeg’)%0Aimage%3Dcv2.cvtColor(image%2C%20cv2.COLOR_BGR2RGB)%0AR%2C%20G%2C%20B%20%3D%20cv2.split(image)%0A%0Afigure(figsize%3D(9%2C6))%0Aplt.subplot(141)%2Cimshow(image)%2Cplt.title(‘Image%20originale’)%0Aplt.axis(‘off’)%0Aplt.subplot(142)%2Cimshow(B)%2Cplt.title(‘Canal%20rouge’)%0Aplt.axis(‘off’)%0Aplt.subplot(143)%2C%20imshow(G)%2C%20plt.title(‘Canal%20vert’)%0Aplt.axis(‘off’)%0Aplt.subplot(144)%2Cimshow(R)%2Cplt.title(‘Canal%20bleu’)%0Aplt.axis(‘off’)” message=”Visualiser les différents canaux de couleur d’une image RVB.” highlight=”” provider=”manual”/]

Nous utilisons la fonction 

cvtColor

pour convertir entre les espaces colorimétriques. Le premier argument est l’image d’entrée et le deuxième argument spécifie la conversion de l’espace colorimétrique. Vous pouvez convertir en YUV en utilisant l’indicateur suivant :

 

image=cv2.cvtColor(image, cv2.COLOR_RGB2YUV)

Voici un exemple  de code permettant de changer l’espace colorimétrique:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%20%20%0Aimage%20%3D%20cv2.imread(‘%2Fcontent%2Fprofil.jpeg’)%0Aimage%3Dcv2.cvtColor(image%2C%20cv2.COLOR_BGR2RGB)%0Aimage1%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2GRAY)%0Aimage2%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2HSV)%0Aimage3%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2XYZ)%0Aimage4%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2YCrCb)%0Aimage5%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2YUV)%0Aimage6%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2Lab)%0Aimage7%3Dcv2.cvtColor(image%2C%20cv2.COLOR_RGB2LUV)%0Afigure(figsize%3D(10%2C8))%0Aplt.subplot(441)%2Cimshow(image)%2Cplt.title(‘Image%20originale’)%0Aplt.axis(‘off’)%0Aplt.subplot(442)%2Cimshow(image1)%2Cplt.title(‘RGB%20vers%20GRAY’)%0Aplt.axis(‘off’)%0Aplt.subplot(443)%2C%20imshow(image2)%2C%20plt.title(‘RGB%20vers%20HSV’)%0Aplt.axis(‘off’)%0Aplt.subplot(444)%2Cimshow(image3)%2Cplt.title(‘RGB%20vers%20XYZ’)%0Aplt.axis(‘off’)%0Aplt.subplot(445)%2Cimshow(image4)%2Cplt.title(‘RGB%20vers%20YCrCb’)%0Aplt.axis(‘off’)%0Aplt.subplot(446)%2Cimshow(image5)%2Cplt.title(‘RGB%20vers%20YUV’)%0Aplt.axis(‘off’)%0Aplt.subplot(447)%2C%20imshow(image6)%2C%20plt.title(‘RGB%20vers%20Lab’)%0Aplt.axis(‘off’)%0Aplt.subplot(448)%2Cimshow(image7)%2Cplt.title(‘RGB%20vers%20LUV’)%0Aplt.axis(‘off’)” message=”” highlight=”” provider=”manual”/]

 

Seuillage adaptatif ou Segmentation adaptative

L’utilisation d’une valeur de seuil globale peut ne pas être un bon choix lorsque l’image a des conditions d’éclairage différentes dans différentes zones. Donc, dans ce cas, nous pouvons vouloir utiliser le seuillage adaptatif. Il utilise l’algorithme qui calcule le seuil pour de petites régions de l’image afin d’

[pastacode lang=”python” manual=”cv2.AdaptiveThreshold(src%2C%20dst%2C%20maxValue%2C%20adaptive_method%3DCV_ADAPTIVE_THRESH_MEAN_C%2C%20thresholdType%3DCV_THRESH_BINARY%2C%20blockSize%3D3%2C%20param1%3D5)%20″ message=”” highlight=”” provider=”manual”/]

obtenir différents seuils pour différentes régions de la même image et il nous donne de meilleurs résultats pour les images avec des conditions d’éclairage variables.

Les éléments  sont:

  1. src – Source image monocanal  8 bits ou image du premier canal en 8 bits.
  2. dst – Image de destination de la même taille et du même type que src.
  3. maxValue – Valeur non nulle attribuée aux pixels pour lesquels la condition est satisfaite.
  4. adaptiveMethod – Algorithme de seuillage adaptatif à utiliser, ADAPTIVE_THRESH_MEAN_C (la valeur seuil est la moyenne de la zone de voisinage) ou ADAPTIVE_THRESH_GAUSSIAN_C (la valeur seuil est la somme pondérée des valeurs de voisinage où les pondérations sont une fenêtre gaussienne). adaptiveMethod décide comment la valeur de seuil est calculée.
  5. thresholdType – le type seuillage qui doit être soit THRESH_BINARY ou THRESH_BINARY_INV.
  6. blockSize – taille d’un voisinage de pixels qui est utilisé pour calculer une valeur de seuil pour le pixel : 3, 5, 7, et ainsi de suite.
  7. C – Constante soustraite de la moyenne ou moyenne pondérée. Normalement, il est positif mais peut également être nul ou négatif. C’est juste une constante qui est soustraite de la moyenne ou moyenne pondérée calculée.

Voici le code  d’un exemple du seuillage adaptatif :

[pastacode lang=”python” manual=”%23%20Importer%20les%20modules%20%0Aimport%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FClassification%2FComputational%20Imaging%2Fmoi.jpg’%2C0)%0Aimg%20%3D%20cv2.medianBlur(img%2C5)%0A%0Aret%2Cth1%20%3D%20cv2.threshold(img%2C150%2C255%2Ccv2.THRESH_BINARY)%20%23%20binarisation%20%0Ath2%20%3D%20cv2.adaptiveThreshold(img%2C255%2Ccv2.ADAPTIVE_THRESH_MEAN_C%2C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20cv2.THRESH_BINARY%2C15%2C2)%0Ath3%20%3D%20cv2.adaptiveThreshold(img%2C255%2Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C%2C%5C%0A%20%20%20%20%20%20%20%20%20%20%20%20cv2.THRESH_BINARY%2C15%2C2)%0A%0Atitles%20%3D%20%5B’%20Image%20original’%2C%20’Seuillage%20global%20(v%20%3D%20150)’%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20’Seuillage%20moyen%20adaptatif’%2C%20’Seuillage%20gaussien%20adaptatif’%5D%0Aimages%20%3D%20%5Bimg%2C%20th1%2C%20th2%2C%20th3%5D%0A%0Afor%20i%20in%20range(4)%3A%0A%20%20%20%0A%20%20%20%20plt.subplot(2%2C2%2Ci%2B1)%2Cplt.imshow(images%5Bi%5D%2C’gray’)%0A%20%20%20%20plt.title(titles%5Bi%5D)%0A%20%20%20%20plt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.show()” message=”Seuillage adaptatif ” highlight=”” provider=”manual”/]

Histogramme des images avec python

Histogramme des images avec python

Alors qu’est-ce que l’histogramme  d’une image? On  peut considérer l’histogramme comme un graphique ou un tracé, ce qui vous donne une idée globale de la distribution d’intensité d’une image. Il s’agit d’un graphique avec des valeurs de pixels (allant de 0 à 255, pas toujours) sur l’axe X et le nombre correspondant de pixels dans l’image sur l’axe Y.

Cette représentation permet de de comprendre l’image. En regardant l’histogramme d’une image, on peut obtenir  une intuition sur le contraste, la luminosité, la distribution d’intensité, etc. de cette image.

À partir de l’histogramme, on peut  voir que la région sombre , la région plus claire, et la  valeurs  du nombre de pixels à un point donné, par exemple à 127.

Calcul d’histogramme en utilisant opencv-python

Vous allons  utiliser la fonction cv2.calcHist() pour trouver l’histogramme de l’image .

On va calculer l’histogramme avec la formule suivante:

cv2.calcHist(images, canaux, masque, histSize, plages[, hist[, accumuler]])

  1. images : c’est l’image source
  2. canaux : il est également indiqué entre crochets. C’est l’indice du canal pour lequel on calcule l’histogramme. Par exemple, si l’entrée est une image en niveaux de gris, sa valeur est [0]. Pour l’image couleur, vous pouvez passer [0],[1] ou [2] pour calculer l’histogramme du canal bleu, vert ou rouge respectivement.
  3. masque : image de masque. Pour trouver l’histogramme de l’image complète, il est donné comme “Aucun”. Mais si vous voulez trouver l’histogramme d’une région particulière de l’image, vous devez créer une image de masque pour cela et la donner comme masque. (Je montrerai un exemple plus tard.)
  4. histSize : cela représente notre nombre de BIN. Doit être indiqué entre crochets. Pour la pleine échelle, nous passons [256].
  5. gammes : c’est notre GAMME. Normalement, c’est [0,256].

Dans notre exemple, nous allons voir comment tracer l’histogramme d’une image sans séparer chaque canal et ensuite comme tracer séparément l’histogramme de chaque canal d’une image couleur(RGB par exemple).

Cas de l’histogramme d’une image couleur ou en niveau de gris

[pastacode lang=”python” manual=”import%20numpy%20as%20np%0Aimport%20cv2%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’)%0Aplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%3B%20plt.show()” message=” Calcul d’histogramme dans OpenCV” highlight=”” provider=”manual”/]

Cas de l’histogramme d’une image couleur(RGB) avec séparation de chaque canal

[pastacode lang=”python” manual=”%23%20calcule%20de%20l’histogramme%20par%20Opencv%20sur%20chaque%20canal%0Aimport%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C0)%0Aimg1%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C1)%0Aimg2%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2C2)%0Aplt.subplot(131)%2Cplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘Bleue’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.subplot(132)%2Cplt.hist(img1.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘vert’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0Aplt.subplot(133)%2Cplt.hist(img.ravel()%2C256%2C%5B0%2C256%5D)%2Cplt.title(‘Rouge’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0A%0Aplt.show()” message=”Histogramme avec chaque canal” highlight=”” provider=”manual”/]

ou

[pastacode lang=”python” manual=”import%20numpy%20as%20np%0Aimport%20cv2%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’)%0Aimg%3D%20%20cv2.cvtColor(img%2Ccv2.COLOR_BGR2RGB)%0A%0Acolor%20%3D%20(‘r’%2C’g’%2C’b’)%0Afor%20i%2Ccol%20in%20enumerate(color)%3A%0A%20%20%20%20histr%20%3D%20cv2.calcHist(%5Bimg%5D%2C%5Bi%5D%2CNone%2C%5B256%5D%2C%5B0%2C256%5D)%0A%20%20%20%20plt.plot(histr%2Ccolor%20%3D%20col)%0A%20%20%20%20plt.xlim(%5B0%2C256%5D)%2Cplt.legend(color)%2Cplt.title(‘Histogramme%20des%20canaux%20R%2C%20G%20B’)%0Aplt.show()%0A” message=”” highlight=”” provider=”manual”/]

Seuillage ou Segmentation d’image avec Opencv-python

Seuillage  ou Segmentation d’image avec Opencv-python

Le seuillage d’image  consiste à remplacer un à un les pixels d’une image à l’aide d’une valeur seuil fixée (par exemple 127). Ainsi, si un pixel à une valeur supérieure au seuil (par exemple 190), il prendra la valeur 255 (blanc), et si sa valeur est inférieure (par exemple 100), il prendra la valeur 0 (noir). On peut dire également que c’est une technique , qui consiste à affecter les valeurs des pixels en fonction de la valeur seuil fournie. Dans le seuillage, chaque valeur de pixel est comparée à la valeur seuil. … Cette technique de seuillage est réalisée sur des images en niveaux de gris.

La valeur du seuil est fixée arbitrairement.

On va donc essayer de voir quelques méthodes de seuillage :

Méthode d’Otsu

La méthode d’Otsu est utilisée pour effectuer un seuillage automatique à partir de la forme de l’histogramme de l’image1, ou la réduction d’une image à niveaux de gris en une image binaire. L’algorithme suppose alors que l’image à binariser ne contient que deux classes de pixels, (c’est-à-dire le premier plan et l’arrière-plan) puis calcule le seuil optimal qui sépare ces deux classes afin que leur variance intra-classe soit minimale2  

threshold est utilisé pour appliquer le seuillage. Le premier argument est l’image source, qui doit être une image en niveaux de gris. Le deuxième argument est la valeur de seuil qui est utilisée pour classer les valeurs de pixel. Le troisième argument est la valeur maximale qui est attribuée aux valeurs de pixels dépassant le seuil.

En termes simples,  le seuillage d’Otsu calcule automatiquement une valeur seuil à partir de l’histogramme d’image pour une image bimodale. (Pour les images qui ne sont pas bimodales, la binarisation ne sera pas précise.)

Image originale:

Voici un exemple de code python :

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0Afrom%20matplotlib.pyplot%20import%20*%0Aima%3Dcv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-01-50-11_.tif’%2Ccv2.COLOR_BGR2RGB)%0A%0Agray%3Dcv2.cvtColor(ima%2C%20cv2.COLOR_BGR2GRAY)%20%23%20convertir%20l’image%20en%20niveau%20de%20gris%0A%0Aret%2C%20thresh_img1%20%3D%20cv2.threshold(gray%2C%20220%2C%20255%2C%20cv2.THRESH_OTSU)%20%23%20seuil%20220-255%0Aret%2C%20thresh_img%20%3D%20cv2.threshold(ima%2C%20127%2C%20255%2C%20cv2.THRESH_BINARY)%20%23%20Seuil%20127-255%0Afigure(figsize%3D(10%2C6))%0Aplt.subplot(331)%2Cimshow(ima)%2C%20plt.title(‘Image%20originale’)%0Aplt.xticks(%5B%5D)%2C%20plt.yticks(%5B%5D)%0Aplt.subplot(332)%2Cimshow(thresh_img1)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%2C%20plt.title(‘Radicule%20segment%C3%A9e_220_255’)%0Aplt.subplot(333)%2Cimshow(thresh_img)%2Cplt.title(‘Image%20binaris%C3%A9e’)%0Aplt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)” message=”Binarisation d’Otsu ou le seuillage d’Otsu” highlight=”” provider=”manual”/]

Seuillage simple ou Segmentation simple

 

Si la valeur du pixel est supérieure à une valeur seuil, une valeur lui est attribuée (peut être blanche), sinon une autre valeur lui est attribuée (peut être noire). La fonction utilisée est cv2.threshold. Le premier argument est l’image source, qui doit être une image en niveaux de gris . Le deuxième argument est la valeur seuil qui est utilisée pour classer les valeurs de pixels. Le troisième argument est la valeur maximale qui représente la valeur à donner si la valeur du pixel est supérieure (parfois inférieure) à la valeur seuil.

OpenCV fournit différents styles de seuillage et il est décidé par le quatrième paramètre de la fonction. Les différents types sont :

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

Voici un code python pour montrer comment on peut appliquer les différents types de seuillage.

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20numpy%20as%20np%0Afrom%20matplotlib%20import%20pyplot%20as%20plt%0A%0Aimg%20%3D%20cv2.imread(‘%2Fcontent%2Fdrive%2FMyDrive%2FSerie1%2FTournesol_H_noir_IMX145_05-06-2021-03-50-13_.tif’%2C0)%0Aret%2Cthresh1%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY)%0Aret%2Cthresh2%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_BINARY_INV)%0Aret%2Cthresh3%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TRUNC)%0Aret%2Cthresh4%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO)%0Aret%2Cthresh5%20%3D%20cv2.threshold(img%2C127%2C255%2Ccv2.THRESH_TOZERO_INV)%0A%0Atitles%20%3D%20%5B’Original%20Image’%2C’BINARY’%2C’BINARY_INV’%2C’TRUNC’%2C’TOZERO’%2C’TOZERO_INV’%5D%0Aimages%20%3D%20%5Bimg%2C%20thresh1%2C%20thresh2%2C%20thresh3%2C%20thresh4%2C%20thresh5%5D%0A%0Afor%20i%20in%20range(6)%3A%0A%20%20%20%20plt.subplot(2%2C3%2Ci%2B1)%2Cplt.imshow(images%5Bi%5D%2C’gray’)%0A%20%20%20%20plt.title(titles%5Bi%5D)%0A%20%20%20%20plt.xticks(%5B%5D)%2Cplt.yticks(%5B%5D)%0A%0Aplt.show()” message=”Seuillage simple ou Segmentation simple avec python” highlight=”” provider=”manual”/]

Reconstitution d’une image nette à partir de deux images , focus shape

Reconstitution d’une image  nette à partir de deux images , focus shape

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 :

  1. Écart type local de l’image ou Local standard deviation of image
  2. Entropie locale de l’image en niveaux de gris ou Local entropy of grayscale image
  3. 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)

Lire et afficher une image sous python avec Opencv

Lire et afficher une image sous python avec Opencv

Comment lire et afficher une image avec opencv et Matplotlib Python?

Il lit l’image  dans le répertoire de travail courant en utilisant la méthode 

imread()

du module opencv avec la méthode cv2.imshow(‘image’) et affiche finalement l’image en utilisant la méthode

imshow()

. Vous devez appeler la méthode 

show()

 après 

imshow()

pour afficher l’image si vous n’utilisez pas

[pastacode lang=”python” manual=”%23importer%20Biblioth%C3%A8ques%20opencv%0Aimport%20cv2%0Aimport%20matplotlib.pyplot%20as%20plt%0A%23%20imread%20pour%20lire%20l’image%2C%20plt.imshow()%20pour%20appeler%20l’image%20qui%20sera%20affich%C3%A9e%0A%23%20cvtColor%20pour%20convertir%20l’image%20en%20image%20couler%20RGB%0A%23%20enfin%20plt.show()%20pour%20afficher%20%0Aima%3Dcv2.imread(‘%2F2021-03-24-173709.jpg’)%0Aima%3Dcv2.cvtColor(ima%2C%20cv2.COLOR_BGR2RGB)%0Aplt.imshow(ima)%0Aplt.show()” message=”Lire et afficher une image sous python avec opencv et matplotlib” highlight=”” provider=”manual”/]

; la méthode 

show()

lancera une fenêtre séparée pour afficher  l’image.

 

 

Traitement d’images

Traitement d’images

Le traitement d’images sert à désigner une discipline de l’informatique et des mathématiques appliquées qui étudie les images numériques et leurs transformations, dans l’objectif de perfectionner leur qualité ou d’en extraire de l’information.

Il s’agit d’un sous-ensemble du traitement de signal (traitement de signal) dédié aux images ainsi qu’aux données dérivées comme la vidéo (par opposition aux parties du traitement du signal consacrées à d’autres types de données : son et autres signaux monodimensionnels surtout), tout en opérant dans le domaine numérique de traitement du signal, comme la photographie ou la télévision respectant les traditions.

Quelles sont les trois grandes catégories de transformation d’images ?

Il existe de nombreuses manipulations que l’on peut faire sur les images, que l’on peut classe en 3 grandes catégories :

  • composition : assembler différentes images pour constituer une nouvelle image avec par exemple des effets de transparence ou de masquage
  • traitement : modification d’une image donnée soit par une transformation géométrique (rotation par exemple), soit pour modifier son contenu (élimination du bruit ou renforcement des contours par exemple)
  • analyse : extractions d’informations structurelles ou sémantiques (contours, objets 3D, etc.).

Ces trois catégories sont loin d’être indépendantes : la composition nécessite des techniques de traitement, par exemple pour changer la taille d’une image avant de la composer, et l’analyse fait la plupart du temps appel à des techniques de traitement, notamment par filtrage. Le domaine de l’analyse d’image étant particulièrement vaste, il ne sera pas abordé ici. De même ne sont pas abordées les techniques de stockage et de compression d’images.

Que peut-on faire  avec le traitement d’images  ou l’imagerie?

Reconstruction d’un objet d’après plusieurs images. – Pattern recognition, comparaison d’objets, OCR (reconnaissance de caractères). … Parfois, le traitement d’image se mêle à l’analyse d’images, ou la vision informatique.

Voici quelques domaines d’application (Voir plus):

  • Vision industrielle
  • Imagerie médicale
  • Imagerie végétale
  • Imagerie satellite
  • Microscopie
  • Télécommunication
  • Classification
  • reconnaissance de forme
  • Détection
  • Automatisation et robotique
  • Biomédicale
  • Animation , Géomatique …

(Voir)   Manipuler les images avec Python OpenCV

 


1 2 3 4 5 6 7 8 9 10 11 12 13