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 être
img.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 sont
uint8(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, renvoie
None。
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
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()