Effets de filtres simples OpenCV

OpenCV fournit de riches algorithmes de traitement d'image et de vision par ordinateur, largement utilisés dans le traitement d'images, l'analyse vidéo, la détection d'objets et d'autres domaines.

Cet article présentera comment utiliser OpenCV pour implémenter plusieurs effets de filtre simples, notamment les effets de niveaux de gris, nostalgique et relief.

Voici les principaux effets de filtre :

Effet de filtreMéthode d'implémentation
Filtre en niveaux de griscv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Filtre nostalgiqueSimuler des effets de photo ancienne en ajustant les poids des canaux de couleur.
Filtre de reliefUtiliser un noyau de convolution[[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]pour effectuer une opération de convolution.
Filtre de floucv2.GaussianBlur(image, (15, 15), 0)
Filtre d'accentuationUtiliser un noyau de convolution[[0, -1, 0], [-1, 5, -1], [0, -1, 0]]pour effectuer une opération de convolution.
Filtre de détection de contourscv2.Canny(gray_image, 100, 200)

1. Filtre en niveaux de gris

Le filtre en niveaux de gris est l'un des filtres les plus simples ; il convertit les images en couleur en images en niveaux de gris.

Une image en niveaux de gris n'a qu'un seul canal, et chaque valeur de pixel représente la luminosité.

Étapes d'implémentation

  1. Lire l'image.
  2. Utilisez lacv2.cvtColor()fonction pour convertir l'image de l'espace colorimétrique BGR vers l'espace colorimétrique en niveaux de gris.

Exemple

import cv2

# Lire l'image
image = cv2.imread('input.jpg')

# Convertir en image en niveaux de gris
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Enregistrer l'image en niveaux de gris
cv2.imwrite('gray_output.jpg', gray_image)

# Afficher l'image en niveaux de gris
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Analyse du code :

  • cv2.imread('input.jpg'): Lire le fichier image.
  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY): Convertir l'image de l'espace colorimétrique BGR vers l'espace colorimétrique en niveaux de gris.
  • cv2.imwrite('gray_output.jpg', gray_image): Enregistrer l'image en niveaux de gris.
  • cv2.imshow('Gray Image', gray_image): Afficher l'image en niveaux de gris.

2. Filtre nostalgique

Le filtre nostalgique ajuste les canaux de couleur d'une image pour lui donner un effet rétro.

Généralement, le filtre nostalgique augmente l'intensité des canaux rouge et vert tout en réduisant l'intensité du canal bleu.

Étapes d'implémentation

  1. Lire l'image.
  2. Séparez les canaux BGR de l'image.
  3. Ajustez l'intensité de chaque canal.
  4. Fusionnez les canaux pour générer une image avec un effet nostalgique.

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread('input.jpg')

# Séparer les canaux BGR
b, g, r = cv2.split(image)

# Ajuster l'intensité des canaux
r = np.clip(r * 0.393 + g * 0.769 + b * 0.189, 0, 255).astype(np.uint8)
g = np.clip(r * 0.349 + g * 0.686 + b * 0.168, 0, 255).astype(np.uint8)
b = np.clip(r * 0.272 + g * 0.534 + b * 0.131, 0, 255).astype(np.uint8)

# Fusionner les canaux
vintage_image = cv2.merge((b, g, r))

# Enregistrer l'image nostalgique
cv2.imwrite('vintage_output.jpg', vintage_image)

# Afficher l'image nostalgique
cv2.imshow('Image vintage', vintage_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Analyse du code :

  • cv2.split(image): Séparer les canaux BGR de l'image.
  • np.clip(): S'assurer que les valeurs des pixels sont comprises entre 0 et 255.
  • cv2.merge((b, g, r)): Fusionner les canaux ajustés pour générer une image avec un effet nostalgique.

3. Filtre de relief

Le filtre de relief génère un effet similaire à l'embossage en calculant la différence entre les pixels adjacents de l'image. Ce filtre est souvent utilisé pour améliorer les contours et les textures d'une image.

Étapes d'implémentation

  1. Lire l'image.
  2. Convertir l'image en niveaux de gris.
  3. Utiliser un noyau de convolution pour calculer l'effet de relief.

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread('input.jpg')

# Convertir en image en niveaux de gris
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Définir le noyau de convolution
kernel = np.array([[-2, -1, 0],
                   [-1,  1, 1],
                   [ 0,  1, 2]])

# Appliquer le noyau de convolution
emboss_image = cv2.filter2D(gray_image, -1, kernel)

# Enregistrer l'image en relief
cv2.imwrite('emboss_output.jpg', emboss_image)

# Afficher l'image en relief
cv2.imshow('Image en relief', emboss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Analyse du code :

  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY): Convertir l'image en niveaux de gris.
  • cv2.filter2D(gray_image, -1, kernel): Appliquer le noyau de convolution pour générer l'effet de relief.

4. Filtre de flou

Le filtre de flou réduit le bruit et les détails d'une image en la lissant.

Exemple

import cv2

# Lire l'image
image = cv2.imread("path/to/image.jpg")

# Filtre de flou
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)

# Afficher le résultat
cv2.imshow("Filtre de flou", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. Filtre d'accentuation

Le filtre d'accentuation rend une image plus nette en accentuant ses contours.

Exemple

import cv2
import numpy as np

# Lire l'image
image = cv2.imread("path/to/image.jpg")

# Filtre d'accentuation
sharpen_kernel = np.array([[0, -1, 0],
                           [-1, 5, -1],
                           [0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, sharpen_kernel)

# Afficher le résultat
cv2.imshow("Filtre d'accentuation", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. Filtre de détection de contours

Le filtre de détection de contours met en évidence les contours des objets en détectant les bords dans une image.

Exemple

import cv2

# Lire l'image
image = cv2.imread("path/to/image.jpg")

# Convertir en image en niveaux de gris
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Filtre de détection de contours
edges_image = cv2.Canny(gray_image, 100, 200)

# Afficher le résultat
cv2.imshow("Filtre de contours", edges_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Autres extensions