Tous les articles par dans tutaux

Somme des éléments d’une liste Python

La liste est l’une des structures de données les plus couramment utilisées en Python, on peut donc se demander comment faire la somme des éléments d’une liste ?

Voici comment calculer la somme des éléments d’une liste en Python :

 

# déclarez une liste
liste = [1, 2, 3, 4, 5]

# utilisez la fonction sum() pour calculer la somme des éléments de la liste
somme = sum(liste)

# affichez la somme des éléments
print(somme)

 

Pour calculer la somme des éléments d’une liste,on peut utiliser la boucle  for pour faire l’addition entre tous les éléments en commençant par le début de la liste. Pour faciliter le calcul, on initialise la somme au début à O, comme Somme= 0. On peut également utiliser la fonction sum() qui est déjà présente en python.

 Toutefois il est important  de noter que, si une liste de tout autre chose que des valeurs numériques est directement fournie à la méthode sum(), elle lèvera un TypeError.

Dans de tels cas, il faut  filtrer les données avant de faire le calcul de la somme des valeurs numériques.  Pour savoir comment utiliser la boucle for pour afficher les éléments d’une liste,Allez ici 

Boucle for python

Une boucle for est utilisée pour itérer sur une séquence (c’est-à-dire une liste, un tuple, un dictionnaire, un ensemble ou une chaîne).

Avec la boucle  for , on peut exécuter un ensemble d’instructions, une fois pour chaque élément d’une liste, d’un tuple, d’un set, etc. 

Exemple de code:

[pastacode lang=”python” manual=”fruits%20%3D%20%5B%22pomme%22%2C%20%22banane%22%2C%20%22mange%22%5D%0Afor%20x%20in%20fruits%3A%0A%20print(x)” message=”Exemple code boucle for python” highlight=”” provider=”manual”/]

Par exemple, pour avoir tous les éléments de la liste sur une même ligne, on peut procéder de la manière suivante :

[pastacode lang=”python” manual=”a%20%3D%20%5B1%2C%202%2C%203%2C%204%5D%0Afor%20i%20in%20range(4)%3A%0A%20%20%20print(a%5Bi%5D%2C%20end%20%3D%22%20%22)%0A” message=”” highlight=”” provider=”manual”/]

On a la sortie : 1 2 3 4

Si on veut on peut itérer en utilisant range pour avoir une liste avec un type de données: Voici un exemple dans le code suivant:

[pastacode lang=”python” manual=”%0Aliste1%20%3D%20%5Bx%20for%20x%20in%20range(10)%5D%0Afor%20i%20in%20range(len((liste1)))%3A%0A%20%20%20print(liste1%5Bi%5D%2C%20end%3D%22%20%22)%0A” message=”” highlight=”” provider=”manual”/]

Le code liste1 = [x for x in range(10)], permet de créer une liste d’éléments allant de 0 à 9, en faisant print(liste1), on va afficher la liste créée avec ses éléments.

En sortie, on aura le résultat suivant  sur l’écran : Sortie : 0 1 2 3 4 5 6 7 8 9

Pour afficher tous les éléments de la liste créée, on peut également utiliser le symbole * qui va précéder le nom de la liste de la manière suivante:

[pastacode lang=”python” manual=”%0Aliste1%20%3D%20%5Bx%20for%20x%20in%20range(10)%5D%0Aprint(*liste1)%0A%0A%23%20Sortie%3A%200%201%202%203%204%205%206%207%208%209″ message=”” highlight=”” provider=”manual”/]

Les listes en python

Les listes sont utilisées pour stocker plusieurs éléments dans une seule variable.

Les listes (ou list array ) en python sont une variable dans laquelle on peut mettre plusieurs variables.

Les listes sont l’un des 4 types de données intégrés à Python utilisés pour stocker des collections de données, les 3 autres sont Tuple , Set et Dictionary , tous avec des qualités et une utilisation différentes.

Les listes sont créées à l’aide de crochets  :  

liste1= [1,2,3,4,5,6,7,8,9]

Éléments de la liste

Les éléments de liste sont ordonnés, modifiables et autorisent les valeurs en double.

Les éléments de la liste sont indexés, le premier élément a index [0], le deuxième élément a index [1] etc. 

Changeable

La liste est modifiable, ce qui signifie que nous pouvons modifier, ajouter et supprimer des éléments dans une liste après sa création.

Autoriser les doublons

Puisque les listes sont indexées, les listes peuvent avoir des éléments avec la même valeur

Longueur de la liste

Pour déterminer le nombre d’éléments d’une liste, utilisez la len() fonction

[pastacode lang=”python” manual=”liste1%3D%20%5B1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%5D%0Aprint(%22Longueur%20de%20la%20liste%22%2C%20len(liste1)%20)” message=”” highlight=”” provider=”manual”/]

Éléments de liste – Types de données

Les éléments de liste peuvent être de n’importe quel type de données :

[pastacode lang=”python” manual=”list1%20%3D%20%5B%22pomme%22%2C%20%22banane%22%2C%20%22orange%22%5D%0Alist2%20%3D%20%5B1%2C%202%2C%203%2C%204%2C%205%5D%0Alist3%20%3D%20%5BTrue%2C%20False%2C%20False%5D” message=”” highlight=”” provider=”manual”/]

Une liste peut contenir différents types de données : 

[pastacode lang=”python” manual=”list1%20%3D%20%5B%22abc%22%2C%2012%2C%20True%2C%2050%2C%20%22homme%22%5D” message=”” highlight=”” provider=”manual”/]

Une liste avec des chaînes, des entiers et des valeurs booléennes 

Le constructeur list()

Il est également possible d’utiliser le constructeur list() lors de la création d’une nouvelle liste.

Utilisation du list() constructeur pour créer une liste : 

[pastacode lang=”python” manual=”liste1%20%3D%20list((%22a%22%2C%20%22b%22%2C%20%22c%22))%20%0Aprint(liste1)” message=”” highlight=”” provider=”manual”/]

Collections Python (tableaux)

Il existe quatre types de données de collecte dans le langage de programmation Python :

  • List est une collection ordonnée et modifiable. Autorise les membres en double.
  • Tuple est une collection ordonnée et immuable. Autorise les membres en double.
  • Set est une collection non ordonnée, non modifiable* et non indexée. Aucun membre en double.
  • Dictionary est une collection ordonnée** et modifiable. Aucun membre en double.

Les éléments de la liste sont indexés et vous pouvez y accéder en vous référant au numéro d’index 

 

Remarque : Le premier élément a l’index 0.

Indexation négative

L’indexation négative signifie commencer par la fin

-1 fait référence au dernier élément, -2 fait référence à l’avant-dernier élément, etc.

Modifier la valeur

Pour modifier la valeur d’un élément spécifique, reportez-vous au numéro d’index :

[pastacode lang=”python” manual=”liste1%20%3D%20%5B%22a%22%2C%20%22b%22%2C%20%22c%22%5D%0Athislist%5B1%5D%20%3D%20%22d%22%0Aprint(liste1)” message=”” highlight=”” provider=”manual”/]

Remarque : La longueur de la liste change lorsque le nombre d’éléments insérés ne correspond pas au nombre d’éléments remplacés.

 

Outils d’annotation des images

Avant de procéder à l’entrainement d’un modèle basé sur les réseaux de neurones (cas de détection, classification et segmentation), il est important d’annoter les objets afin de permettre au modèle de reconnaître les objets plus tard et faire la prédiction. Pour faciliter le travail d’annotation, plusieurs outils existent déjà en version gratuite et payante. Je vous présente ici une liste non exhaustive dans le cas de l’annotation des images.

 

  • labelImg : LabelImg est un outil d’annotation d’image graphique et des boîtes de délimitation d’objets d’étiquette dans les images
  • Roboflow . En plus de l’annotation, la plate-forme facilite la conversion entre les formats d’annotation et la gestion des ensembles de données, ainsi que la formation et le déploiement de modèles personnalisés sur des points de terminaison d’API privés
  • CVAT – Outil d’annotation de vision par ordinateur puissant et efficace
  • labelme – Annotation polygonale d’image avec Python
  • VoTT – Un outil d’annotation et d’étiquetage open source pour les images et les vidéos
  • imglab – Un outil basé sur le Web pour étiqueter les images des objets qui peuvent être utilisés pour former dlib ou d’autres détecteurs d’objets
  • Yolo_mark – GUI pour marquer des boîtes délimitées d’objets dans des images pour former le réseau de neurones Yolo v3 et v2
  • PixelAnnotationTool – Logiciel qui vous permet d’annoter manuellement et rapidement des images dans des répertoires
  • OpenLabeling – Étiquetez des images et des vidéos pour les applications de vision par ordinateur
  • imagetagger – Une plateforme en ligne open source pour l’étiquetage collaboratif d’images
  • Alturos.ImageAnnotation – Un outil collaboratif pour étiqueter les données d’image
  • deeplabel – Un outil d’annotation d’images multiplateforme pour l’apprentissage automatique
  • MedTagger – Un cadre collaboratif pour annoter des ensembles de données médicales à l’aide du crowdsourcing.

Pour avoir plus de détails et d’autres outils d’annotation pour (les videos, le texte, l’audio et autres ..etc…) aller sur https://github.com/heartexlabs/awesome-data-labeling

Augmentation des données ou data augmentation

 

Qu’est-ce que l’augmentation d’image?

Afin d’augmenter la performance des algorithmes basés sur les réseaux de neurones, on applique souvent les méthodes d’augmentation des données. Selon Wikipédia (https://en.wikipedia.org/wiki/Data_augmentation), l’augmentation des données dans l’analyse des données sont des techniques utilisées pour augmenter la quantité de données en ajoutant des copies légèrement modifiées de données déjà existantes ou de données synthétiques nouvellement créées à partir de données existantes. Pour ce qui concerne la détection d’objets, l’augmentation de données permet d’optimiser la performance et la robustesse des détections.

Les algorithmes basés sur les réseaux de neurones profonds nécessitent beaucoup de données d’entraînement pour obtenir de bons résultats et éviter le surajustement. Cependant, il est souvent très difficile d’obtenir suffisamment d’échantillons d’apprentissage.

L’augmentation d’image  peut être défini comme un processus de création de nouveaux exemples de formation à partir d’exemples existants.

Parmi les méthodes d’augmentation de données pour la détection des objets, il y a deux types  de transformation (Transformations au niveau du pixel et Transformations au niveau spatial)

  1. Transformations au niveau du pixel

Les transformations au niveau du pixel ne changeront qu’une image d’entrée et laisseront inchangées toutes les cibles supplémentaires telles que les masques, les cadres de délimitation et les points clés. Voici quelques transformations au niveau du pixel :

Pour avoir plus de détail voir (https://github.com/albumentations-team/albumentations)

On peut également modifier la luminosité de l’image. L’augmentation de la luminosité de l’image implique l’augmentation ou la diminution aléatoire d’une image, comme l’application d’un changement de pourcentage +/- uniforme à tous les pixels d’une image. On peut appliquer le changement de teinte en changeant l’espace colorimétrique( la couleur de l’image). L’augmentation de la teinte de l’image modifie de manière aléatoire les couleurs d’une image, rendant ainsi un modèle plus résistant aux couleurs spécifiques des objets.

  2.Transformations au niveau spatial

Les transformations au niveau spatial modifieront simultanément une image d’entrée ainsi que des cibles supplémentaires telles que des masques, des cadres de délimitation et des points clés. Voici quelques transformations au niveau spatial

La liste complète des transformations à appliquer sur les images pour augmenter les données  est accessible via leur documentation en ligne via ()le lien suivant.

 

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”/]


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21