Filtri Passa Basso e Passa Alto
Uno dei principali vantaggi della Trasformata di Fourier è che consente di effettuare filtraggio passa-alto e passa-basso.
Dopo aver applicato la Trasformata di Fourier:
è necessario creare una maschera di filtraggio
Filtraggio Passa-Basso (Sfocatura)
Un filtro passa-basso rimuove le componenti ad alta frequenza, producendo un'immagine sfocata. Maschera passa-basso:
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.
Filtraggio Passa-Alto (Rilevamento dei Bordi)
Un filtro passa-alto rimuove le componenti a bassa frequenza ed esalta i bordi. Maschera passa-alto:
highpass_mask = np.ones((rows, cols), np.uint8)
: inizializza una maschera di uni con le stesse dimensioni dell'immagine, il che significa che tutte le frequenze sono inizialmente consentite;highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
: imposta a zero un piccolo quadrato 10×10 al centro (regione a bassa frequenza), bloccando di fatto tali frequenze.
Applicazione del filtro
Dopo aver creato la maschera, è necessario applicare un filtro e trasformare la foto nuovamente nel dominio spaziale:
dft_filtered = dft_shift * mask
: applica la maschera nel dominio delle frequenze (ad esempio, passa-basso o passa-alto) tramite moltiplicazione elemento per elemento con la DFT traslata dell'immagine;dft_inverse = np.fft.ifftshift(dft_filtered)
: annulla la traslazione applicata in precedenza per riportare le componenti di frequenza nelle posizioni originali;image_filtered = np.fft.ifft2(dft_inverse)
: calcola la Trasformata Inversa di Fourier per convertire i dati filtrati dal dominio delle frequenze a quello spaziale;image_filtered = np.abs(image_filtered)
: prende il valore assoluto per rimuovere eventuali componenti immaginarie residue, ottenendo un'immagine filtrata a valori reali.
Swipe to start coding
Ti viene fornita un'immagine della pecora nella variabile image
e un'immagine nel dominio delle frequenze nella variabile dft_shift
:
- Ottieni la forma della matrice
image
e salvala nelle variabilirows
ecols
; - Calcola il punto centrale e salvalo in
crow
eccol
; - Definisci
low_mask
come un array di zeri con forma(rows, cols)
e tiponp.uint8
; - Seleziona la regione centrale 20x20 di
low_mask
e riempila con1
. - Definisci
high_mask
come un array di uni con forma(rows, cols)
e tiponp.uint8
; - Seleziona la regione centrale 20x20 di
high_mask
e riempila con0
; - Applica
low_mask
ehigh_mask
adft_shift
e salva le frequenze filtrate rispettivamente inlowpass_dft_filtered
ehighpass_dft_filtered
; - Esegui la trasformazione inversa per
lowpass_dft_filtered
:- Esegui l'inverso dello shift e salva in
lowpass_dft_inverse
; - Esegui la trasformazione inversa e salva l'immagine in
image_lowpass
; - Rimuovi i valori negativi da
image_lowpass
.
- Esegui l'inverso dello shift e salva in
- Esegui la trasformazione inversa per
highpass_dft_inverse
:- Esegui l'inverso dello shift e salva in
lowpass_dft_inverse
; - Esegui la trasformazione inversa e salva l'immagine in
image_highpass
; - Rimuovi i valori negativi da
image_highpass
.
- Esegui l'inverso dello shift e salva in
Soluzione
Grazie per i tuoi commenti!