Lågpass- och Högpassfilter
En av de viktigaste fördelarna med Fouriertransformen är att den möjliggör högpass- och lågpassfiltrering.
Efter att vi har applicerat Fouriertransformen:
vi behöver skapa en filtreringsmask
Lågpassfiltrering (suddning)
Ett lågpassfilter tar bort högfrekventa komponenter, vilket resulterar i en suddig bild. Lågpassmask:
rows, cols = image.shape
: hämtar antalet rader och kolumner från gråskalebilden;crow, ccol = rows // 2, cols // 2
: beräknar bildens mittkoordinater;mask = np.zeros((rows, cols), np.uint8)
: skapar en mask av nollor med samma dimensioner som bilden;mask[crow-30:crow+30, ccol-30:ccol+30] = 1
: sätter ett 60×60 kvadratiskt område i mitten av masken till 1, vilket tillåter endast lågfrekventa komponenter (nära mitten av frekvensdomänen) att passera medan högfrekventa detaljer filtreras bort.
Högpassfiltrering (Kantdetektering)
Ett högpassfilter tar bort lågfrekventa komponenter och förstärker kanter. Högpassmask:
highpass_mask = np.ones((rows, cols), np.uint8)
: initierar en mask av ettor med samma dimensioner som bilden, vilket innebär att alla frekvenser initialt tillåts passera;highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
: sätter en liten 10×10 ruta i mitten (lågfrekvensområde) till noll, vilket effektivt blockerar dessa frekvenser.
Applicering av filtret
Efter att masken har skapats måste vi applicera ett filter och transformera vårt foto tillbaka till det spatiala domänet:
dft_filtered = dft_shift * mask
: applicerar frekvensdomänmasken (t.ex. lågpass- eller högpass) genom elementvis multiplikation med den skiftade DFT:n av bilden;dft_inverse = np.fft.ifftshift(dft_filtered)
: återställer skiftet som tidigare applicerats för att återföra frekvenskomponenterna till sina ursprungliga positioner;image_filtered = np.fft.ifft2(dft_inverse)
: beräknar den inversa Fouriertransformen för att konvertera de filtrerade frekvensdata tillbaka till det spatiala domänet;image_filtered = np.abs(image_filtered)
: tar absolutvärdet för att ta bort eventuella kvarvarande imaginära komponenter, vilket resulterar i en realvärdesfiltrerad bild.
Swipe to start coding
Du har fått en bild av fåret i variabeln image
och en bild i frekvensdomänen i variabeln dft_shift
:
- Hämta formen på matrisen
image
och spara i variablernarows
ochcols
; - Beräkna mittpunkten och spara i
crow
ochccol
; - Definiera
low_mask
som en array av nollor med formen(rows, cols)
och typennp.uint8
; - Välj det 20x20 stora centrumområdet i
low_mask
och fyll det med1
. - Definiera
high_mask
som en array av ettor med formen(rows, cols)
och typennp.uint8
; - Välj det 20x20 stora centrumområdet i
high_mask
och fyll det med0
; - Applicera
low_mask
ochhigh_mask
pådft_shift
och spara de filtrerade frekvenserna ilowpass_dft_filtered
respektivehighpass_dft_filtered
; - Utför invers transformation för
lowpass_dft_filtered
:- Utför invers skiftning och spara i
lowpass_dft_inverse
; - Utför invers transformation och spara bilden i
image_lowpass
; - Ta bort negativa värden för
image_lowpass
.
- Utför invers skiftning och spara i
- Utför invers transformation för
highpass_dft_inverse
:- Utför invers skiftning och spara i
lowpass_dft_inverse
; - Utför invers transformation och spara bilden i
image_highpass
; - Ta bort negativa värden för
image_highpass
.
- Utför invers skiftning och spara i
Lösning
Tack för dina kommentarer!