Diskretna Fourierova transformacija je ključna pri analizi in obdelavi slik, saj omogoča prepoznavanje struktur, odkrivanje vzorcev, filtriranje ter stiskanje slik. V tej nalogi se bomo osredotočili na zaznavanje robov, ki je osnovni postopek računalniškega vida in pogosto služi kot predpriprava za naprednejše naloge, kot je zaznavanje objektov na slikah.
Diskretna Fourierova transformacija
Diskretna Fourierova transformacija (DFT) preslika diskreten signal iz časovne domene v frekvenčno domeno:
kjer je vrednost signala v časovni domeni, pa koeficient v frekvenčni domeni, ki vsebuje informacije o amplitudi in fazi posamezne frekvenčne komponente.
Obratno, inverzna diskretna Fourierova transformacija (IDFT) prevede signal nazaj iz frekvenčne domene v časovno:
Dvodimenzionalna diskretna Fourierova transformacija in njen inverz
Dvodimenzionalna diskretna Fourierova transformacija (2D DFT) preslika 2D mrežo sivinskih vrednosti slike iz prostorske domene v frekvenčno domeno. Koeficienti v Fourierovi domeni predstavljajo jakost in pogostost gradnikov slike, podobno kot frekvence v zvočnem signalu izražajo višino tonov.
2D DFT je definirana kot:
kjer predstavlja vrednost slikovne točke na koordinatah , je višina slike, širina, pa koeficient v frekvenčni domeni.
Izračun 2D DFT je možno razdeliti na zaporedje dveh 1D DFT:
kar omogoča učinkovito implementacijo s hitro Fourierovo transformacijo (FFT).
Obratna transformacija (2D IDFT) je definirana kot:
Za lažjo analizo se koeficiente pogosto prestavi tako, da je DC komponenta na sredini slike, kar je običajno izvedeno s premikom (angl. shift) Fourierove transformiranke, na primer z numpy funkcijo roll
.
Odstranjevanje anomalij v sliki
Po uporabi IDFT se lahko v izhodni sliki pojavijo kompleksne vrednosti, ker Fourierova transformacija uporablja kompleksna števila. Spreminjanje koeficientov v Fourierovi domeni (npr. z uporabo filtrov) lahko povzroči, da se imaginarne komponente prenesejo nazaj v prostorsko domeno. Dodatno se zaradi omejene natančnosti pri računanju lahko pojavijo napake, prav tako pa filtri lahko premaknejo vrednosti slikovnih točk izven dovoljenega območja .
Za odpravo teh anomalij obdržimo le realni del slikovnih točk, imaginarni del zavržemo. Nato vrednosti omejimo na dovoljeni interval s funkcijo:
V tem primeru nastavimo in , saj morajo intenzitete slikovnih točk ostati v intervalu .
Visokoprepustni filter
Visokoprepustni filter (high-pass filter) odstrani počasne spremembe v sliki in ohrani hitre prehode, kot so robovi. Filter v Fourierovi domeni definiramo kot:
Tukaj in predstavljata stopnjo spremembe v stolpcu oziroma vrstici, pa je prag, ki določa, katere frekvence ohranimo. Nizek prag ohrani več podrobnosti, visok prag poudari le izrazite robove.
Filter ima enake dimenzije kot slika () in je centriran v točki . Upoštevamo premik proti središču slike:
Tako zgradimo filter za vse točke in .
Merjenje podobnosti med slikami
Pri filtriranju slike se del informacij izgubi. Podobnost med vhodno in obdelano sliko lahko ovrednotimo z medsebojno informacijo, ki meri, koliko informacije ostane po obdelavi. Večja vrednost pomeni večjo podobnost.
Medsebojna informacija med vhodno sliko in obdelano sliko je podana z:
Verjetnosti za izračun entropije ocenimo iz histogramov sivinskih vrednosti. Slike običajno vsebujejo odtenkov sive. Verjetnost, da ima točka v sliki sivino v intervalu , ocenimo z:
Na enak način določimo verjetnosti na obdelani sliki. Vezane verjetnosti, ki upoštevajo sočasno pojavitev sivinskih vrednosti na obeh slikah, so:
kjer predstavlja število točk, ki imajo sivino v intervalu na vhodni sliki in v intervalu na obdelani sliki.
Funkcija za detekcijo robov z uporabo Fourierove transformacije
Uvod
Funkcija detect_edges_fft
implementira detekcijo robov z uporabo Fourierove transformacije in visokoprepustnega filtriranja. Vrne medsebojno informacijo med vhodno in obdelano sliko.
Uvoz knjižnice
import numpy as np
Za obdelavo slike in računanje Fourierove transformacije uporabimo knjižnico numpy
.
Definicija funkcije
def detect_edges_fft(slika: np.array, prag: int) -> float:
Funkcija detect_edges_fft
sprejme sivinsko sliko in prag za visokoprepustni filter ter vrne medsebojno informacijo med vhodno in obdelano sliko.
Dimenzije in normalizacija slike
N, M = slika.shape
slika = slika / 255.0
Določimo dimenzije slike in jo normaliziramo na interval .
Fourierova transformacija in premik v središče
F = np.fft.fft2(slika)
x_center = N // 2
y_center = M // 2
F_shifted = np.roll(F, (x_center, y_center), (0, 1))
Izvedemo 2D diskretno Fourierovo transformacijo. Po transformaciji premaknemo počasne komponente iz robov v središče slike z uporabo funkcije np.roll
.
Definicija visokoprepustnega filtra
filter_fft = np.zeros((N, M))
for n in range(N):
for m in range(M):
if ((((n - N // 2) / N) ** 2 + ((m - M // 2) / M) ** 2) >= prag ** 2):
filter_fft[n][m] = 1
Zgradimo visokoprepustni filter velikosti slike. Pogoj:
ohrani hitre spremembe, počasne pa odstrani.
Filtriranje v Fourierovi domeni
F_shifted_filtered = F_shifted * filter_fft
Fourierovo predstavitev slike pomnožimo s filtrom, s čimer odstranimo počasne komponente.
Obraten premik Fourierove predstavitve
F_filtered = np.roll(F_shifted_filtered, (-x_center, -y_center), (0, 1))
Po filtriranju Fourierovo predstavitev premaknemo nazaj v začetni položaj.
Inverzna Fourierova transformacija
slika_obdelana = np.fft.ifft2(F_filtered)
Izvedemo inverzno Fourierovo transformacijo, da dobimo obdelano sliko v prostorski domeni.
Odstranjevanje anomalij
slika_obdelana = np.real(slika_obdelana)
slika_obdelana = np.clip(slika_obdelana, 0, 1)
Ohranimo le realne komponente in omejimo intenzitete slikovnih točk na interval .
Entropija vhodne slike
G = 256
I_v, _ = np.histogram(slika.ravel(), bins=G, range=(0, 1))
total = N * M
P_v = I_v / total
P_v_nonzero = P_v[P_v > 0]
H_v = -np.sum(P_v_nonzero * np.log2(P_v_nonzero))
Izračunamo entropijo vhodne slike:
pri čemer je verjetnost posamezne sivinske ravni.
Entropija obdelane slike
I_o, _ = np.histogram(slika_obdelana.ravel(), bins=G, range=(0, 1))
P_o = I_o / total
P_o_nonzero = P_o[P_o > 0]
H_o = -np.sum(P_o_nonzero * np.log2(P_o_nonzero))
Na enak način izračunamo entropijo obdelane slike:
Vezana entropija
I_vo, _, _ = np.histogram2d(slika.ravel(), slika_obdelana.ravel(), bins=G, range=[[0, 1], [0, 1]])
P_vo = I_vo / total
P_vo_nonzero = P_vo[P_vo > 0]
H_vo = -np.sum(P_vo_nonzero * np.log2(P_vo_nonzero))
Izračunamo vezano entropijo:
Medsebojna informacija
MI = H_v + H_o - H_vo
return MI
Končni rezultat je medsebojna informacija:
ki meri podobnost med vhodno in obdelano sliko.
Sklep
Predstavljena metoda za odkrivanje robov z diskretno Fourierovo transformacijo učinkovito izkorišča frekvenčni pristop k obdelavi slik. Ključne prednosti te metode vključujejo:
- Globalni pristop: Fourierova transformacija omogoča obdelavo celotne slike naenkrat, za razliko od lokalnih metod, ki obdelujejo posamezne dele slike
- Kontroliran način filtriranja: Visokoprepustni filter z nastavljenim pragom omogoča natančno kontrolo nad tem, katere frekvence ohranimo
- Kvantitativno vrednotenje: Uporaba medsebojne informacije omogoča objektivno merjenje uspešnosti filtriranja
Metoda je posebej primerna za slike z izrazitimi robovi in strukurami, kjer frekvenčni pristop omogoča jasno ločevanje med počasnimi spremembami (ozadje) in hitrimi prehodi (robovi). Čeprav je računsko nekoliko zahtevnejša od enostavnih prostorskih filtrov, ponuja večjo fleksibilnost in boljši nadzor nad procesom filtriranja.