Pragovna segmentacija (treshold) je najpreprostejša segmentacijska metoda, s katero želimo ločiti objekte na sliki od ozadja. Pri tej pragovni segmentaciji se pripadnost posamezne točke določi s pomočjo praga. Če bi imeli prag 80, bi točka s sivino 75 predstavljala objekt, točka s sivino 90 pa ozadje (če bi bilo ozadje svetlejše od objekta). Pragovna operacija ima lahko globalni prag (prag je enak za vse točke), prag pa je lahko tudi variabilen (prag se razlikuje od točke od točke). Da točka predstavlja ozadje predstavimo z vrednostjo 0, če pa predstavlja objekt naj bo njena vrednost 1.
Seveda za pragovno operacijo niso primerne vse slike. Najbolje se obnesejo slike, ki imajo v histogramu dva med seboj jasno ločena vrha, kjer prvi vrh predstavlja objekt, drugi pa ozadje. Prag v takem primeru postavimo v dolino med vrhoma.
V gornjem primeru smo prag postavili ročno, kar je za uporabo dokaj nepraktično. K sreči obstajajo metode in algoritmi, ki prag postavijo sami. Primer takega algoritma lahko najdemo tudi v knjigi Digital Image Processing: a practical introduction using Java, str. 255. Algoritem je iterativen in je z vsakim korakom bližji optimalnemu pragu. Algoritem predpostavlja,da robne točke algoritma predstavljajo ozadje.
Implementirajte algoritem za avtomatsko določanje praga function prag=avtomatski_prag(slika), kjer funkcija izračuna prag za vhodno sliko. Predpostavite, da je vhodna slika že sivinska.
V funkciji testiraj_filtre.m izračunajte vektorja a in b s filtri cheby1, cheby2, butter za visoko-prepustno sito. Izberite enako lomno frekvenco in enake rede filtra. Narišite amplitudi frekvenčnih odzivov za vsak filter posebej. Vsi grafi naj bodo popolnoma označeni (x os, y os, itd.) ter prikazani na eni sliki (uporabite ukaz subplot). V komentar programa za vsak filter napišite, kako se obnaša njegova frekvenčna karakteristika. Napišite tudi, kakšne razlike med njimi opazite.
Gotovo vsi poznate tonski način izbiranja številke na telefonu (DTMF – Dual Tone Multiple Frequency). V bistvu za vsako pritisnjeno tipko telefon pošlje kratek zvočni signal sestavljen iz dveh čistih sinusov po naslednjem sistemu.
Najprej preizkusite generator signalov DTMF:
SIS:Vaja09:Digitalni filtri:generateDTMF - Naložil: Narmotur
, ki je napisan v Matlabu. Funkcija vrne vektor zvočnega signala, ki ga lahko poslušate s funkcijo sound (vzorčevalna frekvenca je 8000 Hz).Napišite program zaporedje=razpoznaj_DTMF(x), ki bo z uporabo pasovno prepustnih filtrov poskušal prepoznati, kakšno zaporedje telefonskih tipk je bilo pritisnjeno v vhodnem signalu x. Uporabite 7 pasovno prepustnih filtrov (tipe in rede filtrov izberite sami), ki bodo prepuščali le bolj ali manj ozko frekvenčno okolico zgoraj navedenih frekvenc (697 Hz, 770 Hz , 852 Hz, itd.). V kolikor amplituda pri dveh filtriranih signalih presega določeni prag, vemo katera tipka je bila pritisnjena. Namesto funkcije filt uporabite funkcijo filtfilt, ki izniči vpliv zakasnitve filtrov.
Signal, ki ga dobite z generatorjem signalov DTMF, ne vsebuje nikakršnega šuma. V realnosti pa lahko vaš program vsebuje tudi govor ali šum. Testni program na sistemu bo preizkusil vaš program z različnimi stopnjami šuma. Šum se ponavadi naredi tako, da signalu prištejemo naključne vrednosti. Nivo dodanega šuma merimo s faktorjem SNR (razmerje signal/šum), ki ga merimo v decibelih (dB). Nižja, ko je vrednost SNR, močneje je šum prisoten. Pri SNR = 20 dB je šum po moči stokrat šibkejši od signala. Pri SNR = 10 dB je šum po moči desekrtat šibkejši od signala. Ko je SNR=0 dB, je moč šuma enaka moči signala.
Na sistemu za vaje se bo signalu iz generatorja DTMF šum dodal s funkcijo awgn:
signalPlusSum = awgn(signal,10,'measured')
.
Število doseženih točk bo bo pri tej nalogi odvisno od robustnosti vašega programa s testnimi primeri. Za pravilo delujoč program, ki dela pri šumu 20 dB dobite 15 točk. 20 dodatnih točk pa bo mogoče doseči z odpornostjo na šum – najboljša rešitev bo nagrajena z 10 dodatnimi točkami (skupaj torej 25 točk), druga najboljša z 9, tretja z 8 in tako naprej, dokler ne zmanjka točk.
Pozor! Naloga morate rešiti v časovnem prostoru.
Na spletu lahko najdemo alternativno izvedbo pesmice Čuk se je oženil. Napišite funkcijo function zaporednje=zaporedje_tonov(signal, fvz), ki uporablja ST-DFT, da ugotovite zaporedje tonov v njej.
Najpreprostejša rešitev bo ta, da za vsak stolpec v matriki B pogledate pri kateri frekvenci imate maksimalno amplitudo, nato pa frekvenco povežete s tonom. Trenutke tišine določite tako, da zahtevate, da maksimalna aplituda presega nek poprej določen prag.
Izdelajte funkcijo B=my_stdft(x,WINDOW), kjer je x vhodni signal, WINDOW pa dolžina enega kosa (soda vrednost). Izhod je 2D kompleksna matrika z izračunano STDFT.
Pri računanju predpostavite 50 % prekrivanje, vsak kos pred uporabo FFTja pomnožite s Hammingovim oknom. Pri FFTju uporabite za dolžino signala 256. Na pozabite izločiti nepotrebnih podatkov v rezultatu FFTja.
Vaši rezultati se bodo primerjali z rezultati že vgrajene funkcije – primerjale se bodo amplitude saj je imaginarna komponenta negativna naši (max(abs(abs(B1)-abs(B2))))!
V primeru, da imamo signal, v katerem nastopa relativno malo frekvenc, lahko pretvorbo v frekvenčni prostor izkoristimo tudi za izgubno stiskanje podatkov (za ta namen se pogosteje uporablja kosinusna in valčna transformacija).
V našem primeru bomo poskusili stisniti tone, ki nastopajo pri prejšnji nalogi. Postopek stiskanja pa bo naslednji:
signal pretvorimo v frekvenčni prostor, delali bomo v pravokotnih koordinatah
obe amplitudi (kosinus in sinus) pri frekvencah, pri katerih je absolutna amplituda kosinusov manjša od podanega praga, postavimo na 0
podatke stisnemo z uporabo naslednjih pravil:
Primer: X=[9 3+2i 0 0 5+3i 0 8+9i....] bi stisnili v vektor [9 0 3 2 0 4 5 3 0 2 8 9].
Napišite še postopek za dekompresijo, ki bo ponovno razširil stisnjeni posnetek. Za pretvorbo iz frekvenčnega v časovni prostor uporabite funkcijo ifft.
Oddati morate postopek za kompresijo in dekompresijo, oddajte pa tudi tekstovno datoteko, v kateri opišite, kako se je kompresija obnesla (kakšen signal, prag, dosežena kvaliteta, razmerje velikosti) .
Zgradba vašega programa naj bo naslednja:
POZOR! Podatki, ki so zrcaljeni čez polovico so tudi konjugirani (imaginarnemu delu se spremeni predznak. npr. če X(2)=2+3i, potem X(end)=2-3i). Uporabite vgrajeno funkcijo conj.
Ko glasbeniki igrajo na glasbila, ustvarjajo tone. Vsak ton je definiran s točno določeno frekvenco (npr. ton a1 ima frekvenco 440 Hz). Frekvence tonov lahko razberemo iz “tabele tonskih frekvenc”.
V kolikor nam glasbena teorija ne leži najbolje ali pa nimamo absolutnega posluha, lahko posamezen ton ugotovimo s pomočjo DFT-ja. Pogoj za to je, da v signalu nastopa le en ton. V tem primeru lahko signal pretvorimo v frekvenčni prostor, ter poiščemo frekvenco, pri kateri je amplituda največja (v polarnih koordinatah). S pomočjo tabele tonskih frekvenc lahko nato ugotovimo, ta kateri ton gre.
Napišite funkcijo ton=ugotovi_ton(signal, fvz), ki kot vhod sprejme posnet signal in vzorčevalno frekvenco, kot izhod pa vrne ton (v obliki niza – npr. ‘C1′). Pričakujete lahko tone od C1 do C2. V kolikor najdena frekvenca ne ustreza natančno tonu, vrnite ton, ki je najbližji zaznani frekvenci.
Za test lahko uporabite posnetke tonov A, C, E, ki so bili pobrani s te strani.
Napišite funkcijo za konvolucijo z uporabo FFT y=moja_konvolucija(x, h) (3t). Dolžina izhodnega signala mora biti enaka vsoti dolžin signala x ter impulznega odziva h zmanjšane za 1 (length(x)+length(h)-1) (n:-3t). Da boste kompatibilni z matlabovo funkcijo conv, uporabite še drugi parameter pri fft, ki pove, kako dolžino signala naj uporabi (dodajo se ničle na začetek in konec signala).
DFT nam nudi odlično orodje za opazovanje obnašanja nekega sistema. Impulzni odziv h=[0.03806, 0.14645, 0.30866, 0.5, 0.69134, 0.85355, 0.96194, 1, 0.96194, 0.85355, 0.69134, 0.5, 0.30866, 0.14645, 0.03806] s pomočjo funkcije fft pretvorite v frekvenčni prostor (1t). Izrišite amplitude in faze, pri čemer naj bodo na osi X vrednosti med [0 1) (2t). V komentar funkcije zapišite, za kakšen filter gre in kako se obnaša – katere frekvence imajo amplitudo blizu 0 (1t). Z rdečo črto označite točno mesto na grafu, kjer se amplitude začnejo zrcaliti (1t).
Grafa naj bosta na eni sliki. Pazite, da bodo osi pravilno označene (ob napaki -5t)!
Vse skupaj naj se naredi v funkciji izrisi_sistem.
Napišite DFT s pomočjo skalarnega produkta. Ustvarite torej funkcijo X=moj_dft(x, Fvz) (7t), kjer je x vektor v časovnem prostoru in Fvz vzorčevalna frekvenca. Vaš rezultat mora biti primerljiv z rezultatom matlabovega FFT (tako v realnem kot v imaginarnem delu rezultata)! Bodite pozorni na to, da je dolžina FFTja N vzorcev, dolžina rezultata vaše funkcije pa bo N/2+1, zato sistem tudi pričakuje tako dolžino. Dolžina naj bo potenca števila 2. Uporaba matlabovih funkcij fft, fft2, fftn, fftw… ni dovoljena!
V funkciji izrišite amplitudo in fazo rezultata v frekvenčnem prostoru (3t). Na osi X naj bodo pravilno označene frekvence, na osi Y pa amplitude oz. faze. Ne pozabite na oznake osi. Oba grafa naj bosta prikazana na eni sliki (uporabite funkcijo subplot)!