Manipulation avancée d’images avec OpenCV

Transformation géométrique d’images

Les transformations géométriques jouent un rôle crucial dans le traitement d’images, permettant de modifier la perspective, la taille et l’orientation des images.

Redimensionnement

Le redimensionnement est une des transformations les plus courantes. OpenCV permet de redimensionner une image avec la fonction

cv2.resize()

.

 

 

import cv2

# Charger l'image
image = cv2.imread('chemin/vers/image.jpg')

# Redimensionner l'image
image_resized = cv2.resize(image, (nouvelle_largeur, nouvelle_hauteur))

cv2.imshow('Image redimensionnée', image_resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

Rotation

La rotation d’une image à un certain angle se fait en utilisant la matrice de rotation obtenue avec

cv2.getRotationMatrix2D()

.

 

# Centre de rotation (le centre de l'image dans ce cas)
centre = (largeur / 2, hauteur / 2)

# Matrice de rotation
matrice_rotation = cv2.getRotationMatrix2D(centre, angle, echelle)

# Appliquer la rotation
image_rotated = cv2.warpAffine(image, matrice_rotation, (largeur, hauteur))

Exercice 1 : Appliquer une rotation

  1. Chargez une image.
  2. Appliquez une rotation de 45 degrés sans perte de contenu.
  3. Affichez l’image originale et l’image tournée.

Conversion de couleurs et gestion des canaux

OpenCV permet de convertir facilement les images d’un espace colorimétrique à un autre (par exemple, de BGR à RGB, HSV, etc.) avec la fonction

cv2.cvtColor()

.

Changement d’espace colorimétrique

 

# Convertir une image BGR en HSV
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

OpenCV permet de convertir facilement les images d’un espace colorimétrique à un autre, comme de BGR (Bleu, Vert, Rouge) à RGB, HSV (Teinte, Saturation, Valeur) ou à des images en niveaux de gris.

# Convertir une image BGR en RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

# Convertir une image BGR en HSV
image_hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# Convertir une image BGR en niveaux de gris
image_grise = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

Séparation et fusion de canaux

Vous pouvez séparer une image en ses canaux de couleur individuels, puis les fusionner ou manipuler individuellement.

 

# Séparer les canaux
B, G, R = cv2.split(image)

# Fusionner les canaux
image_fusionnee = cv2.merge([B, G, R])

Exercice 2 : Manipulation des canaux

  1. Chargez une image en couleur.
  2. Séparez-la en ses canaux Rouge, Vert et Bleu.
  3. Créez une nouvelle image en échangeant deux canaux de l’image originale.
  4. Comparez l’image originale et l’image modifiée.

Application de masques et de filtres

Les masques et les filtres sont des outils puissants pour améliorer ou extraire des informations d’une image.

Application d’un filtre

Les filtres permettent de réaliser des opérations telles que le flou, l’accentuation ou la détection de bords.

 

# Appliquer un flou gaussien
image_floue = cv2.GaussianBlur(image, (5, 5), 0)

Utilisation de masques

Un masque permet d’appliquer une opération sur une partie spécifique de l’image.

 

# Créer un masque binaire
masque = cv2.inRange(image_hsv, borne_inf, borne_sup)

# Appliquer le masque
image_masquee = cv2.bitwise_and(image, image, mask=masque)

Exercice 3 : Filtrage par masque

  1. Chargez une image en couleur.
  2. Convertissez l’image en espace de couleur HSV.
  3. Créez un masque pour isoler une certaine gamme de couleurs.
  4. Appliquez ce masque pour extraire la partie de l’image contenant les couleurs ciblées.
  5. Affichez l’image originale et le résultat du masquage.

Ces techniques avancées de manipulation d’images ouvrent la porte à de nombreuses applications, de l’amélioration de la qualité d’image à la reconnaissance d’objets. En maîtrisant ces outils, vous serez bien équipé pour aborder des projets plus complexes en traitement d’images et en vision par ordinateur.

Introduction à OpenCV

Installation et configuration de l’environnement de développement

Pour commencer à travailler avec OpenCV, il faut d’abord l’installer et configurer l’environnement de développement. OpenCV est disponible pour Windows, Linux et macOS, et peut être intégré à de nombreux IDEs et langages de programmation, le plus courant étant Python.

Installation avec Python

  1. Assurez-vous d’avoir Python installé sur votre système. OpenCV requiert Python 2.7.X ou une version 3.4+.
  2. Installez OpenCV en utilisant pip, le gestionnaire de paquets Python, en exécutant la commande suivante dans votre terminal ou invite de commande :
    pip install opencv-python
  1. Pour les fonctionnalités supplémentaires d’OpenCV, installez
    opencv-python-headless

    avec :

    pip install opencv-python-headless

Vérification de l’installation

Pour vérifier que l’installation a réussi, ouvrez un interpréteur Python et essayez d’importer cv2 (le module OpenCV pour Python) :

import cv2
print(cv2.__version__)
 

Si aucune erreur n’apparaît et que vous voyez la version d’OpenCV, alors l’installation a été réussie.

Premiers pas avec le traitement d’images

OpenCV facilite le traitement d’images grâce à ses nombreuses fonctions intégrées. Voici quelques exemples et exercices pour commencer.

Exemple : Lire et afficher une image

import cv2

# Charger une image
image = cv2.imread('chemin/vers/votre/image.jpg')

# Afficher l'image dans une fenêtre
cv2.imshow('Titre de la fenêtre', image)
cv2.waitKey(0) # Attendre une touche pour fermer
cv2.destroyAllWindows()
 

Exercice 1 : Conversion en niveaux de gris

  1. Lisez une image à partir de votre disque.
  2. Convertissez cette image en niveaux de gris en utilisant la fonction
    cv2.cvtColor()

    avec l’argument

    cv2.COLOR_BGR2GRAY

    .

  3. Affichez l’image originale et l’image en niveaux de gris côte à côte.

Exercice 2 : Floutage d’une image

  1. Chargez une image.
  2. Appliquez un flou Gaussien en utilisant la fonction
    cv2.GaussianBlur()

    .

  3. Choisissez différents noyaux (par exemple, (5, 5), (10, 10)) et comparez les résultats.
  4. Affichez l’image originale et les images floutées pour voir l’effet du flou.

Ces exemples et exercices devraient vous donner un bon départ dans le monde fascinant du traitement d’images avec OpenCV. Continuez à expérimenter avec différentes fonctions et paramètres pour explorer davantage les capacités d’OpenCV.

OpenCV et de ses fonctionnalités

OpenCV, qui signifie “Open Source Computer Vision Library”, est une bibliothèque logicielle ouverte et gratuite destinée à la vision par ordinateur et au traitement d’images. Elle a été développée pour fournir une infrastructure commune pour les applications de vision par ordinateur et pour accélérer l’utilisation de la perception machine dans les produits commerciaux. Depuis sa première sortie en 2000, OpenCV a trouvé son chemin dans de nombreuses applications, allant de la sécurité interactive aux véhicules autonomes.

 

Les fonctionnalités d’OpenCV couvrent plusieurs domaines du traitement d’images et de la vision par ordinateur, notamment :

  1. Traitement d’images : opérations de base sur les images telles que le filtrage, la transformation, la manipulation de formes, etc.
  2. Vision par ordinateur : techniques de détection de caractéristiques, de correspondance de caractéristiques et de suivi d’objets.
  3. Reconnaissance faciale : détection, reconnaissance et suivi des visages.
  4. Machine Learning : algorithmes pour la classification, la régression et le clustering.
  5. Réalité augmentée : superposition d’images et de vidéos dans des scènes réelles.
  6. 3D : manipulation et affichage d’images 3D, y compris la stéréovision et la reconstruction de scènes.

Lire une image avec OpenCV en Python

Pour lire une image avec OpenCV en Python, vous pouvez utiliser la fonction

cv2.imread()

. Cette fonction prend en argument le chemin vers l’image que vous souhaitez lire, ainsi que l’option de lecture (si l’image est en niveaux de gris ou en couleur). Voici un exemple de code pour lire une image en couleur avec OpenCV en Python :

 

import cv2

# Chemin vers l'image
image_path = "chemin/vers/image.jpg"

# Lire l'image en couleur
image = cv2.imread(image_path, cv2.IMREAD_COLOR)

Si vous souhaitez lire l’image en niveaux de gris, vous pouvez utiliser l’option

cv2.IMREAD_GRAYSCALE

au lieu de

cv2.IMREAD_COLOR

.

Une fois que vous avez lu l’image avec OpenCV, vous pouvez l’afficher en utilisant la fonction

cv2.imshow()

et attendre que l’utilisateur appuie sur une touche pour fermer l’image en utilisant la fonction

cv2.waitKey()

. Voici un exemple de code pour afficher une image lue avec OpenCV en Python :

 

import cv2

# Chemin vers l'image
image_path = "chemin/vers/image.jpg"

# Lire l'image en couleur
image = cv2.imread(image_path, cv2.IMREAD_COLOR)

# Afficher l'image
cv2.imshow("Image", image)

# Attendre que l'utilisateur appuie sur une touche pour fermer l'image
cv2.waitKey(0)

Dans ce code, nous utilisons d’abord la fonction

cv2.imread()

pour lire l’image à partir du chemin spécifié. Nous spécifions l’option

cv2.IMREAD_COLOR

pour indiquer que nous voulons lire l’image en couleur.

Ensuite, nous utilisons la fonction

cv2.imshow()

pour afficher l’image lue. Nous lui donnons un nom d’affichage (ici, “Image”) et l’image elle-même en tant qu’argument.

Enfin, nous utilisons la fonction

cv2.waitKey()

pour attendre que l’utilisateur appuie sur une touche du clavier pour fermer l’image.

Notez que vous devrez peut-être importer la bibliothèque Numpy pour traiter les données de l’image avec OpenCV. Vous pouvez le faire en ajoutant l’instruction

import numpy as np

au début de votre script Python.

 

 

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

Lecture et sauvegarde des images usb camera dans un repertoire

Lecture  et sauvegarde des images usb camera  dans un repertoire

Comment sauvegarder les images dans un répertoire spécifique?

Dans ce article, on va apprendre rapidement comment on peut enregistrer  les images acquises à partir des USB caméras dans un répertoire spécifique et avec un intervalle de temps d’acquisition précis en utilisant Opencv , time et OS.

 

On peut utiliser le système sur un raspberry pi pour faire des images ou superviser quelque chose soit avec un ordinateur.

Comme nous allons utiliser python, on aura besoin d’importer quelques librairies avant d’écrire notre code pour la capture et le sauvegarde des images.

Quelles libraires  importées?

On va importer trois librairies  qui sont:

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20os.path%20%20%23%20ou%20import%20os%0Aimport%20time%0A” message=”Librairies à importer” highlight=”” provider=”manual”/]

La librairie cv2 va nous aider à lire notre caméra et à sauvegarder  les images , os.path  va nous permettre d’avoir accès au système surtout au dossiers ou fichiers ou répertoire et enfin  time va nous permettre de gérer le temps et de nommer nos images avec le temps ou la date.

 

Après avoir importé nos librairies, on va maintenant initialiser la caméra si c’est une seule caméra ou les caméras.

On l’initialise avec la commande suivante:

[pastacode lang=”python” manual=”camera1%20%3D%20cv2.VideoCapture(0)” message=”Initialisation de la caméra” highlight=”” provider=”manual”/]

Ensuite on vérifie si la caméra est bien initialisée si oui on la lit avec la commande:

[pastacode lang=”python” manual=”while%20True%3A%0A%20%20%20%20ret1%2C%20frame1%20%3D%20camera1.read()” message=”Vérification et lecture de la caméra” highlight=”” provider=”manual”/]

On  déclare le répertoire dans lequel on veut enregistrer les images et l’intervalle de temps au bout duquel on veut capturer une image avec les commandes suivantes:

[pastacode lang=”python” manual=”%23%20declaration%20du%20r%C3%A9pertoire%20%0Apath1%20%3D%22.%2FBureau%2FImagetest%2FCamera1%22%0A%0A%23%20d%C3%A9claration%20du%20timelapse%0Atime.sleep(60)” message=”Déclaration du répertoire et du timelapse” highlight=”” provider=”manual”/]

La ligne path1 =“./Bureau/Imagetest/Camera1” représente le  chemin du répertoire et la ligne sleep(60) représente le timelapse , la durée pour acquérir une image.

Enfin si la caméra est bien lue,on procède à la visualisation et sauvegarde des images avec les commandes suivantes:

[pastacode lang=”python” manual=”%20if%20ret1%3A%0A%20%20%20%20%20%20%20%20cv2.imshow(%22camera1%22%2C%20frame1)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path1%2C%20%22image1_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe1)” message=”Verification de lecture de la caméra et sauvegarde des images” highlight=”” provider=”manual”/]

Important: Quand on déclare un dossier sous linux, il faut mettre un point avant le chemin du répertoire mais sur windows et raspberry pi c’est raspbian on n’a pas besoin du point avant le chemin du répertoire.

Voici le code complet pour lancer la caméra et sauvegarder les images dans un répertoire spécifique en utilisant un python code python (opencv pour capture).

[pastacode lang=”python” manual=”import%20cv2%0Aimport%20time%2Cos.path%0Afrom%20time%20import%20sleep%0Aimport%20os%0A%23%20initialiser%20les%20cam%C3%A9ras%0Acamera1%20%3D%20cv2.VideoCapture(0)%0A%0Acamera2%20%3D%20cv2.VideoCapture(2)%0A%0Awhile%20True%3A%0A%20%20%20%20ret1%2C%20frame1%20%3D%20camera1.read()%0A%20%20%20%20ret2%2C%20frame2%20%3D%20camera2.read()%0A%20%20%20%20%0A%20%20%20%20%23%20D%C3%A9claration%20du%20chemin%20des%20r%C3%A9pertoires%0A%20%20%20%20path1%20%3D%22.%2FBureau%2FImagetest%2FCamera1%22%0A%20%20%20%20path2%20%3D%22.%2FBureau%2FImagetest%2FCamera2%22%0A%0A%20%20%20%23%20D%C3%A9claration%20du%20timelapse%0A%20%20%20sleep(60)%0A%0A%20%20%20if%20ret1%3A%0A%20%20%20%20%20%20%20%23%20cv2.imshow(%22camera1%22%2C%20frame1)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path1%2C%20%22image1_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe1)%0A%20%20%20%20%20%20%20%0A%20%20%20%20if%20ret2%3A%0A%20%20%20%20%20%20%20%23%20cv2.imshow(%22camera2%22%2C%20frame2)%0A%20%20%20%20%20%20%20%20cv2.imwrite(os.path.join(path2%2C%20%22image2_%22%20%2B%20time.strftime(%22%25d-%25m-%25Y-%25H-%25M-%25S_%22)%20%20%2B%20%22.tif%22)%2Cframe2)%0A%20%20%20%20%20%20%20%20camera2.set(cv2.CAP_PROP_FRAME_WIDTH%2C%201920)%0A%20%20%20%20%20%20%20%20camera2.set(cv2.CAP_PROP_FRAME_HEIGHT%2C%201080)%0A%20%20%20%0A%20%20%20%20%20if%20cv2.waitKey(1)%20%26%200xff%20%3D%3Dord(‘a’)%3A%0A%20%20%20%20%20%0A%20%20%20%20%20%20%20%20%20%20break%0A%0Acamera1.release()%0Acamera2.release()%0Acv2.destroyAllWindows()%0A%0A” message=”Code complet” highlight=”” provider=”manual”/]

Ce code permet de lancer deux caméras directement soit sur un raspberry pi ou un pc (linux , windows ou macox) en banchant les deux caméras à deux ports USB, enregistrer les images acquises de chaque caméra dans un répertoire différent suivant le même intervalle de temps ici 60 secondes soit 1 minuit pour chaque image.

J’espère que ce article vous a aidé.

A lire aussi (Installer un raspberry pi)

 

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.

 

 


1 2