Flou d'image
Le flou d'image, également appelé lissage, sert à réduire le bruit et à adoucir les détails d'une image. Nous allons utiliser un filtre de convolution pour cela.
Un filtre de convolution est une matrice qui est appliquée à chaque pixel de l'image, en calculant une moyenne pondérée des pixels voisins. Pour créer un filtre de flou, nous utilisons une matrice où tous les éléments sont égaux, de sorte que chaque pixel contribue de manière égale à la moyenne.
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import cv2
def apply_blur(image, kernel_size):
kernel = np.ones((kernel_size, kernel_size)) / (kernel_size ** 2)
blurred_image = signal.convolve2d(image, kernel, mode='same', boundary='symm')
return blurred_image
image = plt.imread('bird.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
blurred = apply_blur(gray_image, kernel_size=5)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(gray_image, cmap='gray')
plt.title('Image Originale')
plt.subplot(1, 2, 2)
plt.imshow(blurred, cmap='gray')
plt.title('Image Floue')
plt.show()
Dans cet exemple, la fonction apply_blur
prend une image et une taille de noyau comme arguments. Elle crée un noyau de convolution en divisant une matrice de uns par le carré de la taille du noyau, assurant ainsi que la somme des éléments du noyau est égale à 1. Ensuite, elle utilise la fonction convolve2d
de SciPy pour appliquer le filtre à l'image, avec le mode 'same'
pour conserver la taille de l'image et la condition aux limites 'symm'
pour gérer les bords. On mentionne l'importance d'une conversion en niveau de gris afin d'avoir une gestion plus facile des couleurs. Cette technique peut être affinée en variant la taille du noyau pour obtenir différents degrés de flou.
Détection de Bord
La détection de bord est une technique essentielle pour identifier les contours et les structures dans une image. Un des opérateurs les plus simples est l'opérateur de Sobel.
Il utilise deux noyaux de convolution, un pour détecter les bords horizontaux et l'autre pour les bords verticaux.
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import cv2
def detect_edges(image, threshold):
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
edge_x = signal.convolve2d(image, sobel_x, mode='same', boundary='symm')
edge_y = signal.convolve2d(image, sobel_y, mode='same', boundary='symm')
edge_magnitude = np.sqrt(edge_x**2 + edge_y**2)
edge_magnitude = edge_magnitude > threshold
return edge_magnitude.astype(int)
image = plt.imread('bird.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
edges = detect_edges(gray_image, threshold=50)
plt.imshow(edges, cmap='gray')
plt.title('Détection de Bords')
plt.show()
Dans ce code, detect_edges
prend une image et un seuil comme arguments. Il définit les noyaux de Sobel pour les directions x et y, puis effectue la convolution de l'image avec ces noyaux. La magnitude des bords est calculée comme la racine carrée de la somme des carrés des réponses des convolutions en x et y. Enfin, un seuil est appliqué pour déterminer les pixels qui sont considérés comme des bords. L'ajustement du seuil permet de varier la sensibilité de la détection des bords, capturant des détails plus ou moins importants.
Affinage d'Image
L'affinage d'image vise à améliorer la netteté des détails sans introduire de bruit excessif. Une méthode courante est d'ajouter une portion de la magnitude du gradient à l'image floue.
Cette technique accentue les transitions de pixels, rendant les bords plus définis.
import numpy as np
import matplotlib.pyplot as plt
from scipy import signal
import cv2
def sharpen_image(image, alpha):
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
edge_x = signal.convolve2d(image, sobel_x, mode='same', boundary='symm')
edge_y = signal.convolve2d(image, sobel_y, mode='same', boundary='symm')
edge_magnitude = np.sqrt(edge_x**2 + edge_y**2)
sharpened_image = image + alpha * edge_magnitude
sharpened_image = np.clip(sharpened_image, 0, 255).astype(np.uint8)
return sharpened_image
image = plt.imread('bird.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
sharpened = sharpen_image(gray_image, alpha=0.5)
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(gray_image, cmap='gray')
plt.title('Image Originale')
plt.subplot(1, 2, 2)
plt.imshow(sharpened, cmap='gray')
plt.title('Image Affinée')
plt.show()
Ici, sharpen_image
prend une image et un facteur alpha comme arguments. Il calcule la magnitude du gradient en utilisant les noyaux de Sobel, puis ajoute une portion de ce gradient à l'image d'origine. La fonction np.clip
assure que les valeurs de pixel restent dans la plage valide de 0 à 255. Le facteur alpha contrôle l'intensité de l'affinage, permettant d'ajuster le résultat selon les besoins spécifiques. Un facteur plus élevé accentue davantage les détails, mais peut aussi augmenter le bruit.