0% ont trouvé ce document utile (0 vote)
21 vues4 pages

Note 3-M31 (Code)

Le document présente des exemples de filtrage d'images en utilisant OpenCV avec Python, en se concentrant sur la détection des contours via des méthodes comme Sobel et Canny. Il inclut également des techniques de filtrage passe-bas et passe-haut à l'aide de transformations de Fourier. Des visualisations des résultats sont fournies pour illustrer les effets des différents filtres appliqués aux images.

Transféré par

Anass ibn tahaikt
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
21 vues4 pages

Note 3-M31 (Code)

Le document présente des exemples de filtrage d'images en utilisant OpenCV avec Python, en se concentrant sur la détection des contours via des méthodes comme Sobel et Canny. Il inclut également des techniques de filtrage passe-bas et passe-haut à l'aide de transformations de Fourier. Des visualisations des résultats sont fournies pour illustrer les effets des différents filtres appliqués aux images.

Transféré par

Anass ibn tahaikt
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi