S-114.3812 Laskennallinen Neurotiede Laskuharjoitus 2 4.12.2006 Heikki Hyyti 60451P
Tehtävä 1 Tehtävässä 1 piti tehdä lineaarista suodatusta kuvalle. Lähtötietoina käytettiin kuvassa 1 näkyvää harmaasävyistä maisemakuvaa. Kuva 1: Harmaasävykuva, jota käytetään tehtävässä suodatuksen lähtötietona. Kuvaa piti suodattaa Gabor-suotimen avulla. Tein suotimeksi Matlab-koodin: function G = gabor(sx,sy,f,theta,gamma); % G = gabor-suodin % Sx = x-suuntainen varianssi % Sy = y-suuntainen varianssi % f = sinifunktion taajuus x:n suhteen % theta = suotimen kulma % gamma = suotimen vaihe for x = -fix(sx):fix(sx) for y = -fix(sy):fix(sy) xprime = double(x * cos(theta) + y * sin(theta)); yprime = double(y * cos(theta) - x * sin(theta)); % Ikkunafunktioon kuuluisi kerroin 1/(2*pi*Sx*Sy) mutta koska kuva % kuitenkin skaalataan 0 ja 1 välille, niin ei sitä kannata tässä % välissä kertoa, koska tarkkuus vain huononisi. window = exp( -5 * ( (xprime/sx)^2 + (yprime/sy)^2 ) ); % Oikeasti exponenttifunkiolla pitäisi olla kerroin -0.5, mutta % tässä on käytetty 10x jyrkempää suodinta. G(fix(Sx)+x+1,fix(Sy)+y+1) = window * cos(2*pi*f*xprime + gamma);
Kuvassa 3 on esitetty tulokset, jotka saatiin seuraavalla matlab-listauksella: clear; figure(1); load testimage imagesc(testimage); colormap gray; figure(2); % oma gabor-funktioni. G = gabor(sx,sy,f,theta,gamma) % Sx ja Sy ovat suotimen x ja y suuntaiset hajonnat. % f on siniaallon taajuus % theta on suotimen kulma % gamma on siniaallon vaihesiirtymä G = gabor(20,20,0.07,7*pi/8,pi/2); Imagesc(abs(G)) colormap gray; figure(3); Y = filter2(g,testimage); y = abs(y); % skaalataan kuvan y kertoimet 0 ja 1 välille. y2 = y./ max(max(y)); % ja tulostetaan käänteinen kuva, jotta mustetta kuluisi vähemmän. A = imagesc(1-y2); colormap gray; saveas(a,'tulos.png') Edellisessä listauksessa on käytetty tekemääni gaborsuodinta 20x20 kokoisena. Siihen on moduloitu taajuudella 0.07 siniaaltoa. Taajuus on suhteutettu suotimen kokoon niin, että 0 vastaa yhtä aaltoa ja 1 maksimaalista aaltoilua. Lisäksi tässä on kokeellisesti haettu sellaiset parametrit suotimelle, että sillä saataisiin mahdollisimman hyvin erisuuntaiset reunat esille kuvasta 1. Suotimella konvoloidaan koko kuvan 1 yli niin, että jokaiselle pisteelle lasketaan koko suotimen aiheuttama muutos. Tästä saadaan kuvassa 3 näkyvät tulokset. Siinä on laskettu 4 eri theta kulmaa Gabor-suotimeeni. Ja suotimella on tehty lineaarinen suodatus alkuperäisestä kuvasta 1. Kuva 2: Kuvassa on 45 astetta vaakatasosta poikkeutettu suodin tehtävässä käytetyillä parametreilla. Kuvan 3 kuvat näkyisivät muuten mustalla pohjalla, mutta niiden arvoja on käsitelty niin, että arvot on ensin skaalattu 0 ja 1 välille ja sitten on piirretty 1-arvo. Näin saadaan hieman mustetta säästettyä ilman, että kuvien selkeys heikkenee liikaa.
Suodin 0 astetta Suodin 45 astetta Suodin 90 astetta Suodin 135 astetta Kuva 3: Kuvassa on neljä pienempää kuvaa, kaikki suodatettu kuvasta 1. Jokaisen pikkukuvan alla lukee senhetkisen theta-kulman arvo asteiksi muutettuna. Lisäksi tehtävässä piti tutkia keski ja reunaosia erottelevia suotimia. Tämä on tehty edellistä koodia muokkaamalla niin, että gabor suotimesta on tehty dog-suodin seuraavanlaisesti: function G = dog(sx,sy); for x = -fix(sx):fix(sx) for y = -fix(sy):fix(sy) window = exp( -10.0 * ( (x/sx)^2 + (y/sy)^2 ) ); outside = 0.6 * exp( -5.0 * ( (x/sx)^2 + (y/sy)^2 ) ); G(fix(Sx)+x+1,fix(Sy)+y+1) = window - outside;
Kuvassa 4 on tämä suodin piirrettynä absoluuttiarvoilla ja 3d-mallina. Kuvassa 5 on edellisellä suotimella suodatettu kuva. Kuva 4: Kuvassa on On-center - off-surround tyyppinen suodin. Kuva 5: Kuvassa näkyy kuvan 4 suotimella suodatettu alkuperäinen kuvassa 1 näkyvä kuva.
Tehtävä 2 Tehtävässä 2 laskettiin tiedostosta c2p3.mat löytyvän stim(x,y,t) ja counts(t) riippuvuutta toisistaan. Tiedosto löytyy osoitteesta: http://people.brandeis.edu/~abbott/book/exercises/c2/data/c2p3.mat Stim(x,y,t)-matriisin kuvista (x,y) laskettiin aikakeskiarvot jokaista counts(t)-vektorin piikkiä kohti viivästettynä yhdestä kahteentoista aikayksikköön (15,6ms). Tähän käytettiin seuraavaa Matlab-koodia: clear; % ladataan data % counts = piikkien määrä jokaista aikayksikköä kohti % stim(x,y,t) 16x16 kuva jokaista aikayksikköä kohti load c2p3; stim = double(stim); for n=1:12; % piikki n-yksikköä kuvan jälkeen for x = 1:16; for y = 1:16; % lasketaan yhden pikselin x,y aikakeskiarvo painotettuna % n-aikayksikköä kuvan jälkeen tulleella piikkien määrällä. summa = 0; countsumma = 0; for t = 1:length(counts); countindex = t + n; if (countindex <= length(counts)) summa = summa + stim(x,y,t)*counts(countindex); countsumma = countsumma + counts(countindex); keskiarvo(x,y) = summa / countsumma; figure(n); colormap gray; I = imagesc(keskiarvo,[-0.1 0.1]); title(['keskiarvo ' int2str(n) ' aikayksikköä ennen piikkiä.']); saveas(i, [int2str(n) '.png']); Tulokset on skaalattu välille -0.1 ja 0.1 jotta jokainen kuva olisi perustasoltaan nollassa ja kuvia olisi helpompi vertailla. Kaikki 12 kuvaa on yhdistetty seuraavaan kuviin 6 ja 7. Kuvassa 6 on viivästykset 1-6 ja kuvassa 7 on viivästykset 7-12. Niistä on havaittavissa selvästi se, että tämä seurattu neuroni aktivoituu nopeasti on-center off-surround tyyppisesti ja sitten tilanne vaihtuu nopeasti päinvastaiseksi ja alkaa vaimentua.
Kuva 6: Keskiarvo kuvista piikkien määrään nähden 1-6 aikayksikköä viivästäen.
Kuva 7: Keskiarvo kuvista piikkien määrään nähden 7-12 aikayksikköä viivästäen.