Aller au contenu

Traitement d’image pour la détection de tag Aruco avec Opencv en python : 2/4 

Deuxième cours de traitement d’image avec pour objectif d’apprendre à utiliser la bibliothèque de manipulation des images en Python : OpenCV. Ce cours nécessite Python 3.x et OpenCV fonctionnel sur sa machine.

Introduction à OpenCV

OpenCV est une bibliothèque open-source pour la vision par ordinateur, l’apprentissage automatique et le traitement d’images. Elle joue aujourd’hui un rôle majeur dans le fonctionnement en temps réel, qui est très important dans les systèmes actuels. En l’utilisant, on peut traiter des images et des vidéos pour identifier des objets, des visages ou même l’écriture d’un être humain. Lorsqu’il est intégré à diverses bibliothèques, telles que NumPy, Python est capable de traiter la structure de tableau OpenCV pour l’analyse. Pour identifier le motif d’une image et ses différentes caractéristiques, nous utilisons l’espace vectoriel et effectuons des opérations mathématiques sur ces caractéristiques.

La première version d’OpenCV était la 1.0. OpenCV est publié sous une licence BSD et est donc libre pour une utilisation académique et commerciale. Il possède des interfaces C++, C, Python et Java et supporte Windows, Linux, Mac OS, iOS et Android. Lors de la conception d’OpenCV, l’accent a été mis sur les applications en temps réel pour une efficacité de calcul. Tout est écrit en C/C++ optimisé pour tirer profit des traitements multicœurs.

Installation d’OpenCV pour Python sur Windows

https://www.geeksforgeeks.org/how-to-install-opencv-for-python-in-windows/

Installation d’OpenCV pour Python sur Linux

https://www.geeksforgeeks.org/how-to-install-opencv-for-python-in-linux/

Travailler avec des images

Lire des images

Pour lire les images, on utilise la méthode cv2.imread(). Cette méthode charge une image à partir du fichier spécifié. Si l’image ne peut pas être lue (à cause d’un fichier manquant, de permissions incorrectes, d’un format non supporté ou invalide), cette méthode renvoie une matrice vide.

Syntaxe : cv2.imread(path,flag)

Paramètres :

  • path : Une chaine de caractère contenant le chemin de l’image à lire
  • flag : Il spécifie la manière dont l’image doit être lue. Sa valeur par défaut est cv2.IMREAD_COLOR. cv2.IMREAD_COLOR : Il spécifie de charger une image en couleur. Toute transparence de l’image sera négligée. C’est l’indicateur par défaut. Alternativement, nous pouvons passer la valeur entière 1 pour ce drapeau. cv2.IMREAD_GRAYSCALE : Il spécifie de charger une image en mode niveaux de gris. Alternativement, nous pouvons passer la valeur entière 0 pour ce drapeau. cv2.IMREAD_UNCHANGED : Il spécifie de charger une image telle quelle, y compris le canal alpha. Alternativement, nous pouvons passer la valeur entière -1 pour ce drapeau.

Retourne : la méthode retourne une image chargée depuis le fichier spécifique

Afficher une image

La méthode cv2.imshow() est utilisée pour afficher une image dans une fenêtre. La fenêtre s’adapte automatiquement à la taille de l’image.

Syntaxe : cv2.imshow(window_name, image)

Paramètres :

  • window_name : Une chaîne représentant le nom de la fenêtre dans laquelle l’image doit être affichée.
  • image : C’est l’image qui doit être affichée.

Retourne : Cette méthode ne retourne rien

Sauver une image

La méthode cv2.imwrite() est utilisée pour enregistrer une image sur un périphérique de stockage quelconque. Cette méthode enregistre l’image selon le format spécifié dans le répertoire de travail actuel.

Syntaxe : cv2.imwrite(filename, image)

Paramètres :

  • filename : Une chaîne représentant le nom du fichier. Le nom de fichier doit inclure le format d’image comme .jpg, .png, etc.
  • image : C’est l’image qui doit être sauvegardée.

Retourne : True si l’image est correctement sauvegardée

# importing cv2 
import cv2 
  
# path 
path = '~/image.png'
  
# Reading an image in default mode
image = cv2.imread(path)
  
# Window name in which image is displayed
window_name = 'image'
  
# Using cv2.imshow() method 
# Displaying the image 
cv2.imshow(window_name, image)
  
#waits for user to press any key 
#(this is necessary to avoid Python kernel form crashing)
cv2.waitKey(0) 

# Using cv2.imwrite() method
# Saving the image
cv2.imwrite(filename, image)
  
#closing all open windows 
cv2.destroyAllWindows() 

Espaces de couleurs en OpenCV

Les espaces couleur sont une façon de représenter les canaux de couleur présents dans l’image qui donnent à l’image cette teinte particulière. Il existe plusieurs espaces couleur différents, chacun ayant sa propre signification.
Parmi les espaces de couleur les plus populaires, on trouve RGB (Red, Green, Blue), CMYK (Cyan, Magenta, Yellow, Black), HSV (Hue, Saturation, Value), etc.

Espace couleur BGR : L’espace couleur par défaut d’OpenCV est RVB. Cependant, il stocke en fait la couleur dans le format BGR. Il s’agit d’un modèle de couleur additif où les différentes intensités de Bleu, Vert et Rouge donnent différentes nuances de couleur.

BGR color space

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

HSV color space

L’espace couleur CMYK : Contrairement au RGB, il s’agit d’un espace couleur soustractif. Le modèle CMYK 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, verte et bleue de la lumière blanche. La lumière blanche moins le rouge donne le cyan, la lumière blanche moins le vert donne le magenta et la lumière blanche moins le bleu donne le jaune.

CMYK color space

Traitement d’image

Recadrer une image

Le redimensionnement des images fait référence à la mise à l’échelle des images. Le redimensionnement est utile dans de nombreuses applications de traitement d’images et d’apprentissage automatique. Elle permet de réduire le nombre de pixels d’une image, ce qui présente plusieurs avantages. Par exemple, elle peut réduire le temps de formation d’un réseau neuronal, car plus le nombre de pixels d’une image est élevé, plus le nombre de nœuds d’entrée est important, ce qui accroît la complexité du modèle.
Il permet également de zoomer dans les images. Souvent, nous avons besoin de redimensionner l’image, c’est-à-dire de la réduire ou de l’agrandir pour répondre aux exigences de taille. OpenCV nous fournit plusieurs méthodes d’interpolation pour redimensionner une image.

Choix de la méthode d’interpolation pour le redimensionnement :

  • cv2.INTER_AREA : Ceci est utilisé lorsque nous avons besoin de rétrécir une image.
  • cv2.INTER_CUBIC : Cette méthode est lente, mais plus efficace.
  • cv2.INTER_LINEAR : Ceci est principalement utilisé lorsque le zoom est nécessaire. C’est la technique d’interpolation par défaut dans OpenCV.
import cv2
import numpy as np
import matplotlib.pyplot as plt
 
image = cv2.imread("C://gfg//tomatoes.jpg", 1)
# Loading the image
 
half = cv2.resize(image, (0, 0), fx = 0.1, fy = 0.1)
bigger = cv2.resize(image, (1050, 1610))
 
stretch_near = cv2.resize(image, (780, 540),
               interpolation = cv2.INTER_NEAREST)
 
 
Titles =["Original", "Half", "Bigger", "Interpolation Nearest"]
images =[image, half, bigger, stretch_near]
count = 4
 
for i in range(count):
    plt.subplot(2, 2, i + 1)
    plt.title(Titles[i])
    plt.imshow(images[i])
 
plt.show()

Éroder et dilater une image

Les opérations morphologiques sont un ensemble d’opérations qui traitent les images en fonction des formes. Elles appliquent un élément structurant à une image d’entrée et génèrent une image de sortie.
Les opérations morphologiques les plus basiques sont au nombre de deux : L’érosion et la dilatation

Les bases de l’érosion

  • Érode les contours de l’objet de premier plan.
  • Utilisée pour diminuer les caractéristiques d’une image.

Fonctionnement de l’érosion

  1. Un noyau (une matrice de taille impaire (3,5,7)) est convolué avec l’image.
  2. Un pixel de l’image originale (soit 1 ou 0) sera considéré comme 1 seulement si tous les pixels sous le noyau sont 1, sinon, il est érodé (rendu à zéro).
  3. Ainsi, tous les pixels proches de la frontière seront éliminés en fonction de la taille du noyau.
  4. Ainsi, l’épaisseur ou la taille de l’objet de premier plan diminue ou simplement la région blanche diminue dans l’image.

Les bases de la dilatation

  • Augmente la surface de l’objet
  • Utilisé pour accentuer les caractéristiques

Fonctionnement de la dilatation :

  1. Un noyau (une matrice de taille impaire (3,5,7)) est convolué avec l’image.
  2. Un élément de pixel dans l’image originale est ‘1’ si au moins un pixel sous le noyau est ‘1’.
  3. Cela augmente la région blanche de l’image ou la taille de l’objet de premier plan.
# Python program to demonstrate erosion and
# dilation of images.
import cv2
import numpy as np
 
# Reading the input image
img = cv2.imread('input.png', 0)
 
# Taking a matrix of size 5 as the kernel
kernel = np.ones((5,5), np.uint8)
 
# The first parameter is the original image,
# kernel is the matrix with which image is
# convolved and third parameter is the number
# of iterations, which will determine how much
# you want to erode/dilate a given image.
img_erosion = cv2.erode(img, kernel, iterations=1)
img_dilation = cv2.dilate(img, kernel, iterations=1)
 
cv2.imshow('Input', img)
cv2.imshow('Erosion', img_erosion)
cv2.imshow('Dilation', img_dilation)
 
cv2.waitKey(0)

Utilisations de l’érosion et de la dilatation

  1. L’érosion :
    • Elle est utile pour éliminer les petits bruits blancs.
    • Utilisée pour détacher deux objets connectés, etc.
  2. Dilatation :
    • Dans des cas comme la suppression du bruit, l’érosion est suivie de la dilatation. En effet, l’érosion supprime les bruits blancs, mais elle rétrécit également notre objet. Nous le dilatons donc. Comme les bruits ont disparu, ils ne reviendront pas, mais la surface de notre objet augmente.
    • Elle est aussi utile pour joindre les parties brisées d’un objet.

Flouter une image

Le flou d’image consiste à rendre l’image moins claire ou moins distincte. Il est réalisé à l’aide de divers noyaux de filtres passe-bas.

Avantages du flou

  • Il permet d’éliminer le bruit. Comme le bruit est considéré comme un signal passe haut, l’application d’un noyau de filtre passe-bas permet de limiter le bruit.
  • Il aide à lisser l’image.
  • Les bords de faible intensité sont supprimés.
  • Il aide à cacher les détails lorsque cela est nécessaire. Par exemple, dans de nombreux cas, la police veut délibérément cacher le visage de la victime, dans de tels cas, le flou est nécessaire.

Principaux types de flou

Flou gaussien : Le flou gaussien est le résultat du flou d’une image par une fonction gaussienne. Il s’agit d’un effet largement utilisé dans les logiciels graphiques, généralement pour réduire le bruit de l’image et atténuer les détails. Il est également utilisé comme étape de prétraitement avant d’appliquer nos modèles d’apprentissage automatique ou d’apprentissage profond.
Par exemple, pour un noyau gaussien (3×3)
\(1/16 \quad \begin{bmatrix} 1 & 2 & 1 \\ 2 & 4 & 2\\ 1 & 2 & 1 \end{bmatrix}\)


Flou médian : Le filtre médian est une technique de filtrage numérique non linéaire, souvent utilisée pour éliminer le bruit d’une image ou d’un signal. Le filtrage médian est très largement utilisé dans le traitement des images numériques car, sous certaines conditions, il préserve les bords tout en supprimant le bruit. C’est l’un des meilleurs algorithmes pour supprimer le bruit de type Sel et poivre.


Flou bilatéral : Un filtre bilatéral est un filtre de lissage non linéaire, préservant les bords et réduisant le bruit des images. Il remplace l’intensité de chaque pixel par une moyenne pondérée des valeurs d’intensité des pixels voisins. Ce poids peut être basé sur une distribution gaussienne. Ainsi, les bords nets sont préservés tout en éliminant les bords faibles.

# importing libraries
import cv2
import numpy as np
  
image = cv2.imread('C://Geeksforgeeks//image_processing//fruits.jpg')
  
cv2.imshow('Original Image', image)
cv2.waitKey(0)
  
# Gaussian Blur
Gaussian = cv2.GaussianBlur(image, (7, 7), 0)
cv2.imshow('Gaussian Blurring', Gaussian)
cv2.waitKey(0)
  
# Median Blur
median = cv2.medianBlur(image, 5)
cv2.imshow('Median Blurring', median)
cv2.waitKey(0)
  
  
# Bilateral Blur
bilateral = cv2.bilateralFilter(image, 9, 75, 75)
cv2.imshow('Bilateral Blurring', bilateral)
cv2.waitKey(0)
cv2.destroyAllWindows()

Histogrammes

Ici, nous utilisons cv2.calcHist()(fonction intégrée à OpenCV) pour trouver l’histogramme.

Syntaxe :

cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

Paramètres :

  • images : c’est l’image source de type uint8 ou float32 représentée par « [img] ».
  • channels : c’est l’index du canal pour lequel on calcule l’histogramme. Pour les images en niveaux de gris, sa valeur est [0].
    pour une image couleur, vous pouvez passer [0], [1] ou [2] pour calculer l’histogramme du canal bleu, vert ou rouge respectivement.
  • mask : image de masque. Pour trouver l’histogramme de l’image complète, il est donné comme « None ».
  • histSize : ceci représente le nombre de BIN. Pour la pleine échelle, nous passons [256].
  • ranges : ceci représente notre RANGE. Normalement, c’est [0,256].
# importing required libraries of opencv
import cv2
  
# importing library for plotting
from matplotlib import pyplot as plt
  
# reads an input image
img = cv2.imread('ex.jpg',0)
  
# find frequency of pixels in range 0-255
histr = cv2.calcHist([img],[0],None,[256],[0,256])
  
# show the plotting graph of an image
plt.plot(histr)
plt.show()