Laagdoorlaat- en Hoogdoorlaatfilters
Een van de belangrijkste voordelen van de Fourier-transformatie is dat deze ons in staat stelt om high-pass en low-pass filtering toe te passen.
Na het toepassen van de Fourier-transformatie:
moeten we een filter masker maken
Low-pass filtering (vervagen)
Een low-pass filter verwijdert hoge-frequentie componenten, wat resulteert in een vervaagd beeld. Low-pass masker:
rows, cols = image.shape
: haalt het aantal rijen en kolommen op uit de grijswaardenafbeelding;crow, ccol = rows // 2, cols // 2
: berekent de coördinaten van het midden van de afbeelding;mask = np.zeros((rows, cols), np.uint8)
: maakt een masker van nullen met dezelfde afmetingen als de afbeelding;mask[crow-30:crow+30, ccol-30:ccol+30] = 1
: stelt een vierkant gebied van 60×60 in het midden van het masker in op 1, waardoor alleen de laagfrequente componenten (dicht bij het midden van het frequentiedomein) worden doorgelaten en hoge-frequentiedetails worden gefilterd.
Hoogdoorlaatfiltering (Randdetectie)
Een hoogdoorlaatfilter verwijdert laagfrequente componenten en versterkt randen. Hoogdoorlaatmasker:
highpass_mask = np.ones((rows, cols), np.uint8)
: initialiseert een masker van enen met dezelfde afmetingen als de afbeelding, wat betekent dat alle frequenties aanvankelijk worden doorgelaten;highpass_mask[crow-5:crow+5, ccol-5:ccol+5] = 0
: stelt een klein vierkant van 10×10 in het midden (laagfrequent gebied) in op nul, waardoor deze frequenties effectief worden geblokkeerd.
Het filter toepassen
Na het aanmaken van het masker moet het filter worden toegepast en de afbeelding terug worden getransformeerd naar het ruimtelijk domein:
dft_filtered = dft_shift * mask
: past de frequentiedomeinmasker toe (bijvoorbeeld low-pass of high-pass) door elementgewijze vermenigvuldiging met de verschoven DFT van de afbeelding;dft_inverse = np.fft.ifftshift(dft_filtered)
: draait de eerder toegepaste verschuiving terug om de frequentiecomponenten naar hun oorspronkelijke posities te brengen;image_filtered = np.fft.ifft2(dft_inverse)
: berekent de Inverse Fourier-transformatie om de gefilterde frequentiedata terug te zetten naar het ruimtelijk domein;image_filtered = np.abs(image_filtered)
: neemt de absolute waarde om eventuele resterende imaginaire componenten te verwijderen, wat resulteert in een reëelwaardige gefilterde afbeelding.
Swipe to start coding
Je krijgt een afbeelding van het schaap in de variabele image
en een afbeelding in het frequentiedomein in de variabele dft_shift
:
- Verkrijg de vorm van de
image
matrix en sla deze op in de variabelenrows
encols
; - Bereken het middelpunt en sla deze op in
crow
enccol
; - Definieer de
low_mask
als een array van nullen met de vorm(rows, cols)
en het typenp.uint8
; - Kies het 20x20 centrale gebied van
low_mask
en vul dit met1
. - Definieer de
high_mask
als een array van enen met de vorm(rows, cols)
en het typenp.uint8
; - Kies het 20x20 centrale gebied van
high_mask
en vul dit met0
; - Pas
low_mask
enhigh_mask
toe opdft_shift
en sla de gefilterde frequenties respectievelijk op inlowpass_dft_filtered
enhighpass_dft_filtered
; - Voer een inverse transformatie uit voor
lowpass_dft_filtered
:- Voer inverse shifting uit en sla op in
lowpass_dft_inverse
; - Voer een inverse transformatie uit en sla de afbeelding op in
image_lowpass
; - Verwijder negatieve waarden voor
image_lowpass
.
- Voer inverse shifting uit en sla op in
- Voer een inverse transformatie uit voor
highpass_dft_inverse
:- Voer inverse shifting uit en sla op in
lowpass_dft_inverse
; - Voer een inverse transformatie uit en sla de afbeelding op in
image_highpass
; - Verwijder negatieve waarden voor
image_highpass
.
- Voer inverse shifting uit en sla op in
Oplossing
Bedankt voor je feedback!