Laboration 1 Grafisk teknik (TNM059) Introduktion till Matlab R. Lenz och S. Gooran (VT2007)
Introduktion: Denna laboration är en introduktion till Matlab. Efter denna laboration ska ni kunna följande: Olika variabeltyper Punktvis operation, skalärprodukt och numerisk integral Förstå hur bilder representeras i Matlab Olika bildvisningsfunktioner och colormap Skriva funktioner i Matlab Slippa onödiga for-loopar i Matlab Nedsampling och uppsampling av bilder och hur olika interpolationsfunktioner påverkar resultatet Alla bilder som ni kommer att behöva finns under S:/TN/M/TNM059/Lab1. 1. Variabeltyper: 1.1 Skapa variabeln a genom a=5. Kolla vad a har för variabeltyp med hjälp av kommandot whos. Vad är resultatet av a/4? Skriv b=uint8(a) och kolla vad b har för variabeltyp. Vad är nu resultatet av b/4? Beskriv skillnaderna! 1.2 Läs in bilden kvarn.tif med hjälp av imread och kalla den för myimage1. Visa bilden med imshow. Normalisera bilden genom att dela bilden med 255 och kalla resultatet för myimage2. Varför 255? Visa myimage2 med imshow(myimage2) och imshow(double(myimage2)) i två olika fönster! Vad händer? 1
Normalisera nu bilden genom följande, myimage3=double(myimage1)/255, och visa myimage3 i ett nytt fönster. Beskriv vad som hände genom att studera variabeltyperna för dessa bilder. 2. Bildvisning och colormap 2.1 Skriv följande, >> imshow(myimage3/3) där myimage3 är bilden från föregående uppgift. Vad händer? Varför? 2.2 Kör nu, >> figure; >> imagesc(myimage3/3) >> colormap gray Vad händer nu? Vad gör colormap gray? 2.3 Olika färger kan beskrivas med hjälp av deras RGB värden i en vektor. T.ex. [0 0 0] är svart, [1 1 1] är vit, [1 0 0] är ren röd, och [0.5 0.5 0.5] är grå. Kör följande: >> map=([1 0 0; 0 1 1; 0.5 0.2 0.3; 1 0 0.6]) >> image([1, 2 ; 3, 4]) >> colormap(map) 2
Kör nu enligt: >> map=([1 0 1; 0 1 0.2; 0.5 0.2 0.3; 1 0 0.6]) >> image([1, 2 ; 3, 4]) >> colormap(map) Och >> map=([1 0 1; 0 1 0.2; 0.5 0.2 0.3; 1 0 0.6]) >> image([1, 2, 3, 4]) >> colormap(map) Och >> map=([1 0 1; 0 1 0.2; 0.5 0.2 0.3; 1 0 0.6]) >> image([1, 2]) >> colormap(map) Försök nu med dessa exempel att förstå hur map, image och colormap fungerar. Visa nu följande fyra färger som ett 2 x 2 rutmönster i ett fönster. 1. Gult (Röd + Grön), upp till vänster 2. Cyan (Grön + Blå), upp till höger 3. Mörkgrå, ner till vänster 4. Ljusgrå, ner till höger 2.4 Visa nu bilder med hjälp av funktionen imtool. Försök att förstå hur funktionen fungerar. Zooma in och ut din bild! 3. Punktvis operation, skalär produkt och numerisk integral 3.1 Definiera två vektorer v1 och v2 enligt nedan. >> v1=[1 2 3 4 5]; Detta kommando kan även skrivas som >> v1=1:5; >> v2=[5 4 3 2 1]; Detta kommando kan även skrivas som >> v2=5:-1:1; Begrunda nu var och ett av följande kommandon och beskriv vad de gör. >> v= v1*v2; Varför får du ett felmeddelande? >> s1=v1*v2 ; 3
Beskriv varför kommandot är korrekt nu? Varför är s1 en skalär och försök övertyga dig om att s1 är skalärprodukten mellan v1 och v2. Prova gärna v1 *v2 också! Kommentarer? Kör nu: >> v=v1.*v2; Vad är v? >> s2=sum(v); Som ni säkert har noterat är s1 och s2 lika. D.v.s. vi har beräknat skalärprodukten på två olika sätt. 3.2 Följande integral kan beräknas analytiskt enligt följande. π / 2 1 sin( x )cos( x) dx = 2 0 π / 2 0 1 sin(2x) dx = 4 π / 2 [ cos(2x) ] = 0. 5 Kör nu enligt följande för att beräkna samma integral med en av de enklaste numeriska metoderna. >> x=0:0.01:pi/2; >>p=sin(x).*cos(x); >>I1=sum(p); Begrunda nu vad varje rad gör i ovanstående kommandon. Med vilken faktor måste I1 multipliceras för att resultatet ska representera integralen? Varför? 0 Kör nu enligt följande: >> x=0:0.001:pi/2; >>p=sin(x).*cos(x); >I2=sum(p); Med vilken faktor ska I2 multipliceras? Är det I1 eller I2 som approximerar integralen bättre? Varför? 4
Beräkna nu följande integral numeriskt. Använd ett steg av 0.001. 1 0 x sin( x) dx 2 x + 1 Svaret är 0.24197482721717. Försök att hitta felet om ert resultat inte stämmer överens med detta tills ni lyckas hitta det rätta svaret. Några kommentarer? 4. Vektorer, bilder och funktioner 4.1 Skapa vektorn v enligt, >> v= 1:10 och studera hur följande kommandon fungerar. >> v(1:4) >> v(1:2:4) >> v(1:2:end) >> v(1:3:end) >> v(3:3:end) >> v(:) Observera att i de flesta programmeringsspråk måste man skriva funktioner med t.ex. forloopar för att göra ovanstående kommandon. I Matlab slipper man oftast detta. 4.2 I denna uppgift ska du anta att ovanstående kommandon inte existerar i Matlab. Nu med hjälp av for- loop skriv en funktion myvector som tar in fyra parametrar v, a, b och n där v är en vektor och a, b och n är heltal. Funktionen ska returnera följande: v(a:b:n) T.ex. myvector([1 3 4 5 6 8],2,2,6) ska returnera [3 5 8]. När du har säkerställt att din funktion fungerar prova nu följande, >> myvector([1 3 4 5 6 8],2,2,8) Och >> myvector([1 3 4 5 6 8],0,2,6) Vad händer? 5
Modifiera ditt program så att de två ovanstående kommandon fungerar t.ex. genom följande: Om a är icke positivt heltal då ska den sättas till 1 och om n är större än vektorns längd ska den sättas till vektorns längd. Se t.ex. size eller length. 4.3 Kör följande, >> myimage=imread( kvarn.tif ); >> myimage=double(myimage)/255; >> myimage1=myimage(1:2:end, 1:2:end); >> imshow(myimage1) >>figure; >> imshow(myimage1(:)) >>myimage2=myimage; >>myimage2(:,100)=1; >>figure; >>imshow(myimage2) Hur stor (pixel x pixel) är myimage och myimage1? Kör nu, >> myimage2=myimage(1:3:end, 1:4:end); >> imshow(myimage2) I mån av tid: skriv en Matlab funktion (med hjälp av for- loopar) som utför ovanstående kommandon, se uppgift 3.2 ovan. 5. Nedsampling och uppsampling 5.1 Läs in färgbilden Butterfl.tif och visa dess tre RGB kanaler i tre olika fönster. Glöm inte att konvertera bilden till double och sedan normalisera. Konvertera sedan RGB bilden till gråskalebild, genom t.ex. (R+G+B)/3 och döp den till mygray. 5.2 Sampla ner mygray från föregående uppgift på två olika sätt: 1. Genom att ta varannan rad och kolumn. 2. Genom att ta medelvärdet av varje 2x2 område i bilden och spara värdet som pixelvärdet i den nedsamplade bilden. (Lämpligast är att skriva en funktion som gör det) 6
Sampla upp nu den nersamplade bilden till dess ursprungliga storlek med funktionen, imresize. När det gäller interpolationen använd alla tre möjliga alternativen och diskutera skillnaderna. De tre möjliga interpolationerna är 'nearest' (default), bilinear och bicubic. 5.3 Läs in färgbilden Butterfl.tif och döp den till mycolorimage. Sampla ner och upp bilden med följande kommando: >> imresize(imresize(mycolorimage,0.5),2); Visa bilden! Jämför denna bild med originalbilden. Vad gjorde ovanstående kommando och hur ser resultatbilden ut? 5.4 Separera nu färgbilden till följande tre bilder R+G+B, R-G och R+G-2B, där R, G och B är färgbildens tre kanaler. Sampla ner R-G och R+G-2B och sampla upp dem igen med nearest och döp dem till bild2 respektive bild3, men behåll R+G+B som den var och döp den till bild1. Återskapa nu den nya bildens RGB kanaler med hjälp av bild1, bild2 och bild3. Visa nu den nya färgbilden och jämför med originalbilden samt bilden från 5.3. Diskutera resultatet. Ledning: Observera att följande gäller, R + G + B = bild1 R G = bild 2 R + G 2B = bild3 Att återskapa R, G och B med hjälp av bild1, bild2 och bild3 innebär att uttrycka R, G och B med hjälp av bild1, bild2 och bild3 genom att lösa ovanstående ekvationssystem. 7