MST MBD-SIM/M31 Labs OpenCV-Python M.
AIT KBIR
# Filtrage : détection des contours. Voir aussi : cv2.Laplacian(Filtre Laplacien),
# cv2.blur( filtre moyenneur) et cv2.medianBlur(filtre median)
import cv2
import numpy as np
def main():
# lecture
img = cv2.imread('../images/coins.png',0)
cv2.imshow('Image', img)
# Lissage avec un filtre gaussien
img = cv2.GaussianBlur(img,(5,5),0)
cv2.imshow('Lissage', img)
# Sobel
kernelx = np.array([[1,2,1],[0,0,0],[-1,-2,-1]],dtype=float)
kernely = np.array([[-1,0,1],[-2,0,2],[-1,0,1]],dtype=float)
# Convolution
Gx = cv2.filter2D(np.float32(img), -1, kernelx)
Gy = cv2.filter2D(np.float32(img), -1, kernely)
# Autre manière d'appliquer les opérateur de Sobel
# Gx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5) # x
# Gy = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5) # y
# Calcul du Gradient + normalisation
G=(Gx**2+Gy**2)**(0.5)
Mx = np.amax(G)
Mn = np.amin(G)
G = np.uint8(((G-Mn)/(Mx-Mn))*255)
cv2.imshow('Gradient', G)
# Image contour : Binarisation automatique de l'image gradient
ret, cntrSobel = cv2.threshold(G,0,255,cv2.THRESH_OTSU)
cv2.imshow('Contour: Sobel', cntrSobel)
# Opérateur de Sobel
cntrCanny = cv2.Canny(img, 120, 180)
2023-2024 1
MST MBD-SIM/M31 Labs OpenCV-Python M. AIT KBIR
cv2.imshow('Contour: Canny', cntrCanny)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
Image originale image gradient image contour (Sobel) image contour ( Canny)
---------------------------------- --# Filtrage passe bas dans le domaine spectral ---------------------------
import cv2
import numpy as np
# (ccol, crow) - (x1, y1) est le rayon
params = {'x': -1, 'y': -1, 'Pressed': -1 }
rayon = None
# Déssiner le disque au centre
def dessinerCercle(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
params['Pressed'] = 1
elif event == cv2.EVENT_LBUTTONUP:
params['Pressed'] = 0
elif event == cv2.EVENT_MOUSEMOVE and (params['Pressed'] == 1):
params['x'] = x
params['y'] = y
def main():
# lecture + affichage
img = cv2.imread('../images/a.jpg', 0)
cv2.imshow("Resultat", img)
# Calculer la transformation de Fourier puis l'amplitude
2023-2024 2
MST MBD-SIM/M31 Labs OpenCV-Python M. AIT KBIR
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude = 20 * np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
# Normalisation de l'amplitude pour l'affichage
mx = np.max(magnitude)
mn = np.min(magnitude)
magnitude = np.uint8(255 * (magnitude - mn) / (mx - mn))
cv2.imshow("Magnitude Spectrale", magnitude)
# Définir de rayon à l'aide de la souris
rows, cols = img.shape
cy, cx = np.uint16(rows / 2), np.int16(cols / 2)
cv2.setMouseCallback("Magnitude Spectrale", dessinerCercle)
while (True):
if params['Pressed'] == 1:
rayon = np.int(np.linalg.norm([params['x'] - cx, params['y'] - cy]))
# Créer un masque 1D pour un filtre passe-bas
mask1D = np.zeros(magnitude.shape, np.uint8)
cv2.circle(mask1D, (cx, cy), rayon, 1, -1)
mask1D = magnitude**mask1D
cv2.imshow(‘Magnitude Spectrale’, mask1D)
# Créer deux masques pass-bas un pour la partie réelle et l’autre pour la partie imaginaire
mask2D = np.zeros((rows, cols, 2), np.uint8)
cv2.circle(mask2D, (cx, cy), rayon, (1, 1), -1)
# Multiplication des spectres
fshift = dft_shift * mask2D
f_ishift = np.fft.ifftshift(fshift)
imgr = cv2.idft(f_ishift)
imgr = cv2.magnitude(imgr[ :, :, 0], imgr[ :, :, 1])
# Normalisation pour l’affichage
mx = np.max(imgr)
mn = np.min(imgr)
imgr = np.uint8(255 * (imgr – mn) / (mx – mn))
cv2.imshow(« Resultat », imgr)
if (cv2.waitKey(100) & 0xFF) == 27 :
break
2023-2024 3
MST MBD-SIM/M31 Labs OpenCV-Python M. AIT KBIR
cv2.waitKey(0) ; cv2.destroyAllWindows()
if __name__ == « __main__ » :
main()
Image originale magnitude spectrale multipliée par un masque pass bas Image filtrée
# Remplacer les masques passe-bas par les masques passe-haut
# Créer un masque 1D pour un filtre passe-haut
mask1D = np.ones(magnitude.shape, np.uint8)
cv2.circle(mask1D, (cx, cy), rayon, 0, -1)
# Créer deux masques pass-haut un pour la partie réelle et l’autre pour la partie imaginaire (matrice 2D)
mask2D = np.ones((rows, cols, 2), np.uint8)
cv2.circle(mask2D, (cx, cy), rayon, (0, 0), -1)
Image originale magnitude spectrale multipliée par un masque passe-haut Image filtrée
2023-2024 4