Filtres Passe-Bas et Passe-Haut
L'un des principaux avantages de la transformation de Fourier est qu'elle permet d'effectuer des filtres passe-haut et passe-bas.
Après avoir appliqué la transformation de Fourier :
il est nécessaire de créer un masque de filtrage
Filtrage Passe-Bas (Flou)
Un filtre passe-bas élimine les composantes haute fréquence, ce qui entraîne une image floue. Masque passe-bas :
rows, cols = image.shape
: retrieves the number of rows and columns from the grayscale image;crow, ccol = rows // 2, cols // 2
: computes the center coordinates of the image;mask = np.zeros((rows, cols), np.uint8)
: creates a mask of zeros with the same dimensions as the image;mask[crow-30:crow+30, ccol-30:ccol+30] = 1
: sets a 60×60 square region at the center of the mask to 1, allowing only the low-frequency components (near the center of the frequency domain) to pass through while filtering out high-frequency details.
Filtrage passe-haut (Détection des contours)
Un filtre passe-haut supprime les composantes basses fréquences et met en valeur les contours. Masque passe-haut :
highpass_mask = np.ones((rows, cols), np.uint8)
: initialise un masque de uns avec les mêmes dimensions que l'image, ce qui signifie que toutes les fréquences sont initialement autorisées à passer ;highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
: définit un petit carré de 10×10 au centre (région des basses fréquences) à zéro, bloquant ainsi effectivement ces fréquences.
Application du filtre
Après avoir créé le masque, il faut appliquer un filtre et transformer la photo de nouveau dans le domaine spatial :
dft_filtered = dft_shift * mask
: applique le masque du domaine fréquentiel (par exemple, passe-bas ou passe-haut) par multiplication élément par élément avec la DFT décalée de l'image ;dft_inverse = np.fft.ifftshift(dft_filtered)
: annule le décalage appliqué précédemment pour ramener les composantes fréquentielles à leurs positions d'origine ;image_filtered = np.fft.ifft2(dft_inverse)
: calcule la Transformée de Fourier Inverse pour reconvertir les données fréquentielles filtrées dans le domaine spatial ;image_filtered = np.abs(image_filtered)
: prend la valeur absolue pour éliminer toute composante imaginaire résiduelle, produisant ainsi une image filtrée à valeurs réelles.
Swipe to start coding
Vous disposez d'une image de mouton dans la variable image
et d'une image dans le domaine fréquentiel dans la variable dft_shift
:
- Obtenez la forme de la matrice
image
et stockez-la dans les variablesrows
etcols
; - Calculez le point central et stockez-le dans
crow
etccol
; - Définissez
low_mask
comme un tableau de zéros de forme(rows, cols)
et de typenp.uint8
; - Sélectionnez la région centrale 20x20 de
low_mask
et remplissez-la avec1
. - Définissez
high_mask
comme un tableau de uns de forme(rows, cols)
et de typenp.uint8
; - Sélectionnez la région centrale 20x20 de
high_mask
et remplissez-la avec0
; - Appliquez
low_mask
ethigh_mask
àdft_shift
et stockez les fréquences filtrées danslowpass_dft_filtered
ethighpass_dft_filtered
respectivement ; - Effectuez la transformation inverse pour
lowpass_dft_filtered
:- Effectuez le décalage inverse et stockez le résultat dans
lowpass_dft_inverse
; - Effectuez la transformation inverse et stockez l'image dans
image_lowpass
; - Supprimez les valeurs négatives de
image_lowpass
.
- Effectuez le décalage inverse et stockez le résultat dans
- Effectuez la transformation inverse pour
highpass_dft_inverse
:- Effectuez le décalage inverse et stockez le résultat dans
lowpass_dft_inverse
; - Effectuez la transformation inverse et stockez l'image dans
image_highpass
; - Supprimez les valeurs négatives de
image_highpass
.
- Effectuez le décalage inverse et stockez le résultat dans
Solution
Merci pour vos commentaires !