Bases du traitement d'images avec OpenCV

OpenCV offre de riches fonctions de traitement d'images et de vision par ordinateur, notamment la lecture d'images, l'affichage, la conversion d'espace colorimétrique, le filtrage, la détection de bords, la détection de contours, etc.

Dans ce chapitre, nous présenterons les concepts de base et les fonctions courantes d'OpenCV.

Représentation et traitement d'images

OpenCV utilisedes tableaux NumPypour représenter les données d'image. Chaque image est un tableau multidimensionnel, où chaque élément correspond à un pixel de l'image. La taille et le mode de couleur de l'image peuvent également être représentés par la forme du tableau.

Propriétés de base d'une image :

  • Taille de l'image (Largeur, Hauteur): peut êtreimg.shapeobtenues.
  • Canaux de couleur (Canaux): généralement RGB (trois canaux), ou en niveaux de gris (un seul canal).
  • Type de données (Type de données): les plus courants sontuint8(plage 0-255), peut aussi êtrefloat32ou autre.

Lecture d'une image :

import cv2
img = cv2.imread('image.jpg')
  • cv2.imread()Lire le fichier image et renvoyer un tableau NumPy.

  • Si le chemin de l'image est incorrect ou si le fichier n'existe pas, renvoieNone。

Affichage d'une image :

# 显示图像
cv2.imshow("Display Window", image)

# 等待按键输入
cv2.waitKey(0)

# 关闭所有窗口
cv2.destroyAllWindows()

cv2.imshow()Utilisé pour afficher l'image,cv2.waitKey(0)attendre un événement clavier,cv2.destroyAllWindows()fermer toutes les fenêtres.

Enregistrement d'une image :

# 保存图像
cv2.imwrite("output_image.jpg", image)

cv2.imwrite()Enregistrer l'image dans le chemin spécifié.

Opérations de base sur les images

1. Accès et modification des valeurs de pixel

# 获取像素值 (BGR 格式)
pixel_value = image[100, 100]  # 获取 (100, 100) 处的像素值

# 修改像素值
image[100, 100] = [255, 255, 255]  # 将 (100, 100) 处的像素设置为白色

2. ROI d'image (région d'intérêt)

# 获取 ROI
roi = image[50:150, 50:150]  # 获取 (50,50) 到 (150,150) 的区域

# 修改 ROI
image[50:150, 50:150] = [0, 255, 0]  # 将 ROI 区域设置为绿色

3. Séparation et fusion des canaux d'image

# 分离通道
b, g, r = cv2.split(image)

# 合并通道
merged_image = cv2.merge([b, g, r])

4. Mise à l'échelle, rotation, translation et retournement d'image

# 缩放
resized_image = cv2.resize(image, (new_width, new_height))

# 旋转
rotation_matrix = cv2.getRotationMatrix2D((center_x, center_y), angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))

# 平移
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])  # tx, ty 为平移距离
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))

# 翻转
flipped_image = cv2.flip(image, flip_code)  # flip_code: 0 (垂直翻转), 1 (水平翻转), -1 (双向翻转)

Opérations arithmétiques sur les images

1. Addition d'images

result = cv2.add(image1, image2)

2. Soustraction d'images

result = cv2.subtract(image1, image2)

3. Mélange d'images

result = cv2.addWeighted(image1, alpha, image2, beta, gamma)

alphaetbetasont les poids,gammaest une valeur scalaire.

Seuillage d'image

1. Seuillage simple

ret, thresholded_image = cv2.threshold(image, thresh, maxval, cv2.THRESH_BINARY)

threshest le seuil,maxvalest la valeur maximale.

2. Seuillage adaptatif

thresholded_image = cv2.adaptiveThreshold(image, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, block_size, C)

3. Binarisation d'Otsu

ret, thresholded_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

Lissage d'image

1. Filtrage par moyenne

blurred_image = cv2.blur(image, (kernel_size, kernel_size))

2. Filtrage gaussien

blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigmaX)

3. Filtrage médian

blurred_image = cv2.medianBlur(image, kernel_size)

4. Filtrage bilatéral

blurred_image = cv2.bilateralFilter(image, d, sigmaColor, sigmaSpace)

Espaces de couleur d'image et conversion

OpenCV prend en charge la conversion entre plusieurs espaces de couleurs, par exemple de RGB vers les niveaux de gris, HSV, etc.

La conversion d'espace colorimétrique est très importante dans de nombreuses tâches de traitement d'image.

Conversion de RGB en niveaux de gris :

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Conversion de BGR en HSV :

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

Conversion de RGB en YUV :

yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

La conversion d'espace colorimétrique est une opération de base en traitement d'image, utilisée pour différents algorithmes et effets visuels.

Redimensionnement et recadrage d'image

OpenCV propose plusieurs façons de redimensionner des images et de recadrer des régions d'image.

Redimensionnement d'une image :

resized_img = cv2.resize(img, (width, height))

Recadrage d'une image :

cropped_img = img[y1:y2, x1:x2]

Une région spécifique de l'image peut être recadrée à l'aide d'opérations de découpage.

Lissage et débruitage d'image (flou)

Le lissage d'image peut réduire le bruit. Les algorithmes de flou courants incluent le flou gaussien, le flou moyen, etc.

Flou gaussien :

blurred_img = cv2.GaussianBlur(img, (5, 5), 0)

Flou moyen :

blurred_img = cv2.blur(img, (5, 5))

Flou médian :

blurred_img = cv2.medianBlur(img, 5)

Détection des contours d'image

La détection de contours est une technique courante de traitement d'image utilisée pour détecter les contours dans une image. La méthode la plus couramment utilisée est la détection de contours de Canny.

Détection de contours de Canny :

edges = cv2.Canny(img, 100, 200)

L'algorithme de Canny trouve les contours en calculant les gradients sur l'image et renvoie une image binaire où les contours sont blancs et les autres régions sont noires.

Opérateur de Sobel :

sobel_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=5)

Opérateur laplacien :

laplacian = cv2.Laplacian(image, cv2.CV_64F)

Opérations morphologiques

Les opérations morphologiques sont souvent utilisées dans le traitement d'images binaires. Les opérations courantes incluent l'érosion, la dilatation, l'ouverture, la fermeture, etc.

Érosion :Réduit les régions blanches dans l'image.

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
eroded_img = cv2.erode(img, kernel, iterations=1)

Dilatation :Étend les régions blanches dans l'image.

dilated_img = cv2.dilate(img, kernel, iterations=1)

Opérations d'ouverture et de fermeture :

  • Ouverture (érosion suivie de dilatation) : utilisée pour supprimer les petits objets.
  • Fermeture (dilatation suivie d'érosion) : utilisée pour remplir les petits trous dans l'image.
opening_img = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing_img = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

Détection de contours d'image

OpenCV offre de puissantes capacités de détection de contours, qui peuvent être utilisées dans des applications telles que la reconnaissance d'objets et la segmentation d'image.

Détection des contours :

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, threshold_img = cv2.threshold(gray_img, 127, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(threshold_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

Dessin des contours :

cv2.drawContours(img, contours, -1, (0, 255, 0), 3)

Traitement vidéo

OpenCV prend également en charge le traitement vidéo. Il peut lire des fichiers vidéo, capturer des flux vidéo et effectuer un traitement en temps réel.

Lecture d'une vidéo :

Exemples

cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # Traiter chaque image
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()
Autres extensions