Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Filtres Passe-Bas et Passe-Haut | Traitement d'Images avec OpenCV
Principes Fondamentaux de la Vision par Ordinateur

bookFiltres 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 :

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

il est nécessaire de créer un masque de filtrage

Filtrage Passe-bas (Flou)

Un filtre passe-bas supprime les composantes haute fréquence, ce qui donne une image floue. Masque passe-bas :

rows, cols = image.shape 
crow, ccol = rows // 2, cols // 2 

mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
  • rows, cols = image.shape : récupère le nombre de lignes et de colonnes de l'image en niveaux de gris ;
  • crow, ccol = rows // 2, cols // 2 : calcule les coordonnées du centre de l'image ;
  • mask = np.zeros((rows, cols), np.uint8) : crée un masque de zéros ayant les mêmes dimensions que l'image ;
  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1 : définit une région carrée de 60×60 au centre du masque à 1, ce qui permet uniquement le passage des composantes basses fréquences (près du centre du domaine fréquentiel) tout en filtrant les détails haute fréquence.

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)
highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
  • 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é 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 est nécessaire d'appliquer un filtre et de transformer la photo dans le domaine spatial :

dft_filtered = dft_shift * mask

dft_inverse = np.fft.ifftshift(dft_filtered) # Inverse shifting
image_filtered = np.fft.ifft2(dft_inverse) # Inverse transformation
image_filtered = np.abs(image_filtered) # Remove negative values
  • 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 afin de 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.
Tâche

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 variables rows et cols ;
  • Calculez le point central et stockez-le dans crow et ccol ;
  • Définissez low_mask comme un tableau de zéros de forme (rows, cols) et de type np.uint8 ;
  • Sélectionnez la région centrale 20x20 de low_mask et remplissez-la avec 1.
  • Définissez high_mask comme un tableau de uns de forme (rows, cols) et de type np.uint8 ;
  • Sélectionnez la région centrale 20x20 de high_mask et remplissez-la avec 0 ;
  • Appliquez low_mask et high_mask à dft_shift et stockez les fréquences filtrées dans lowpass_dft_filtered et highpass_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 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.

Solution

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3
single

single

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Suggested prompts:

Can you explain the difference between high-pass and low-pass filtering in more detail?

How do I choose the size of the mask for filtering?

What are some practical applications of these filters in image processing?

close

Awesome!

Completion rate improved to 3.45

bookFiltres Passe-Bas et Passe-Haut

Glissez pour afficher le menu

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 :

dft = np.fft.fft2(image)
dft_shift = np.fft.fftshift(dft)

il est nécessaire de créer un masque de filtrage

Filtrage Passe-bas (Flou)

Un filtre passe-bas supprime les composantes haute fréquence, ce qui donne une image floue. Masque passe-bas :

rows, cols = image.shape 
crow, ccol = rows // 2, cols // 2 

mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
  • rows, cols = image.shape : récupère le nombre de lignes et de colonnes de l'image en niveaux de gris ;
  • crow, ccol = rows // 2, cols // 2 : calcule les coordonnées du centre de l'image ;
  • mask = np.zeros((rows, cols), np.uint8) : crée un masque de zéros ayant les mêmes dimensions que l'image ;
  • mask[crow-30:crow+30, ccol-30:ccol+30] = 1 : définit une région carrée de 60×60 au centre du masque à 1, ce qui permet uniquement le passage des composantes basses fréquences (près du centre du domaine fréquentiel) tout en filtrant les détails haute fréquence.

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)
highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
  • 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é 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 est nécessaire d'appliquer un filtre et de transformer la photo dans le domaine spatial :

dft_filtered = dft_shift * mask

dft_inverse = np.fft.ifftshift(dft_filtered) # Inverse shifting
image_filtered = np.fft.ifft2(dft_inverse) # Inverse transformation
image_filtered = np.abs(image_filtered) # Remove negative values
  • 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 afin de 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.
Tâche

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 variables rows et cols ;
  • Calculez le point central et stockez-le dans crow et ccol ;
  • Définissez low_mask comme un tableau de zéros de forme (rows, cols) et de type np.uint8 ;
  • Sélectionnez la région centrale 20x20 de low_mask et remplissez-la avec 1.
  • Définissez high_mask comme un tableau de uns de forme (rows, cols) et de type np.uint8 ;
  • Sélectionnez la région centrale 20x20 de high_mask et remplissez-la avec 0 ;
  • Appliquez low_mask et high_mask à dft_shift et stockez les fréquences filtrées dans lowpass_dft_filtered et highpass_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 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.

Solution

Switch to desktopPassez à un bureau pour une pratique réelleContinuez d'où vous êtes en utilisant l'une des options ci-dessous
Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 2. Chapitre 3
single

single

some-alt