1 TDT4105 Informasjonsteknologi, grunnkurs Eksempler Rune Sætre (satre@idi.ntnu.no)
2 Kommunedata Sør-Trøndelag 25 kommuner Navn Innbyggere Areal (km 2 ) Tekstfil med 25 linjer Må representere dette i programmet Datastruktur Mulige løsninger? Agdenes 1745 318 Bjugn 4570 384 Frøya 4326 241 Hemne 4232 670 Hitra 4340 686 Holtålen 2048 1210 Klæbu 5894 186 Malvik 12677 169 Meldal 3903 613 Melhus 15114 695 Midtre-Gauldal 6050 1861 Oppdal 66912 274 Orkdal 11365 594 Osen 1025 387 Rennebu 2629 948 Rissa 6543 622 Roan 994 375 Røros 5581 1956 Selbu 3996 1235 Skaun 6756 224 Snillfjord 992 508 Trondheim 173486 342 Tydal 886 1329 Ørland 5133 74 Åfjord 3229 955 2
3 Datastruktur En struktur for hver kommune Felter Navn Innbyggere Areal En vektor med strukturer for fylket Lager funksjon som leser fil-data inn i slik datastruktur Inndata: Filnavn Utdata: Vektor med strukturer 3
4 function kommuner = leskommunefil( filnavn ) leskommunefil.m fid = fopen( filnavn, 'r', 'native', 'utf8'); % 'UTF-8' / 'latin1' / ASCII %% utf8 i Matlab-versjon R2013a if fid == -1 kommuner = -1; else indeks = 1; while ~feof(fid) % leser linje fra filen fillinje = fgetl(fid); % putter data inn i struktur kommuner(indeks) = lagpost(fillinje); % indeks for evt. neste post indeks = indeks + 1; end % while status = fclose(fid); if status ~= 0 kommuner = -1; end end % if fid ok end % function 4
5 function post = lagpost(tekst) % putter data for en kommune inn i struktur % plukker ut kommunenavn [post.navn, resten] = strtok(tekst); % plukker ut innbyggertall og areal talldata = str2num(resten); post.innbyggere = talldata(1); post.areal = talldata(2); end % function function post = lagpost2(tekst) % alternativ måte å gjøre det % plukker ut kommunenavn [post.navn, resten] = strtok(tekst); % plukker ut innbyggertall [tall, resten] = strtok(resten); post.innbyggere = str2num(tall); % plukker ut areal [tall, resten] = strtok(resten); post.areal = str2num(tall); end % function leskommunefil.m 5
6 6
7 Befolkningstetthet i Sør-Trøndelag Summere innbyggertall i alle kommuner Summere areal i alle kommuner Tetthet = sum(innbyggere) / sum(areal) Lager funksjon som gjør dette: Inndata: Vektor med strukturer (kommunedataene) Utdata: Befolkningstetthet 7
8 befolkningstetthet.m 8
9 Alternativ løsning: Parallelle vektorer 9
10 10
11 function [knavn, kdata] = leskommunefil_alt2( filnavn ) 11 fid = fopen( filnavn, 'r', 'native', 'utf-8'); if fid == -1 disp('får ikke åpnet filen') else indeks = 1; while ~feof(fid) % leser linje fra filen fillinje = fgetl(fid); % plukker ut dataelementene [navn, resten] = strtok(fillinje); talldata = str2num(resten); % putter data inn i datastrukturene knavn{indeks} = navn; kdata(indeks, 1) = talldata(1); kdata(indeks, 2) = talldata(2); % indeks for evt. neste post indeks = indeks + 1; end % while status = fclose(fid); if status ~= 0 disp('kan ikke lukke filen') end end % if end % function
12 12
13 Noen bildeeksempler Representasjon: To-dimensjonal tabell Rader x kolonner med verdi for hver bildeelement (piksel) Gråtonebilder 0 = sort, 255 = hvitt, gråtoner mellom Bilder har fargekart som definerer hvilken farge hver pikselverdi skal ha. 13
14 Problem: Lite kontrast Utnytter ikke toneomfanget Mørkeste piksel: 31 Lyseste piksel: 233 14
15 Løsning Skalerer 31-233 til 0-255 (pikselverdi-31)*255/(233-31) 31 -> 0 233 -> 255 NB! Bildetabellene våre har datatype uint8 Arithmetic operations that involve both integers and floatingpoint always result in an integer data type. Det er lett å regne feil (se øverst til høyre) Typekonvertering (type cast) B = cast(a,newclass) minpiksel = cast( minpiksel, 'double'); Gjør om ( 31 ) til double-representasjon 15
16 makskontrast.m 16
17 Resultat 17
18 Bilde med støy (hvite piksler) 18
19 Filtrere støy med medianfilter Observasjon: Støypikslene skiller seg (stort sett) mye ut Idé: Erstatte støypikslene med en riktigere verdi fra omgivelsene Alle piksler har 8 naboer (unntatt kantpikslene som vi ignorerer) Får nabolag på 3x3-piksler Bruke gjennomsnittet av nabolaget (støypikslene trekker ) Sortere pikselverdiene i nabolaget og bruke medianen (støypikslene blir marginalisert) Median-filter Fjerner støy Mister litt bildekvalitet (utenom støypikslene) 19
20 Utsnitt fra panna 20
21 Detalj (for en piksel) 21
22 medianfilter.m 22
23 Resultat 23
24 Kant-filter Ser på nabolaget rundt hver piksel (3x3) En maske for å oppdage horisontale kanter Gx = (z 7 +2z 8 + z 9 ) (z 1 + 2z 2 + z 3 ) En maske for å oppdage vertikale kanter G y = (z 3 +2z 6 + z 9 ) (z 1 + 2z 4 + z 7 ) Kantstyrken i hvert punkt G = G x + G y Dette kalles en Sobel-operator Finne alternative måter å finne kanter 24
25 Eksempel 25
26 kantfilter.m 26
27 Resultat 27