Numerisk analys och datalogi, KTH
Tony Lindeberg
2D1420 DATORSEENDE GK:
ALLMÄNNA LABANVISNINGAR
DETTA DOKUMENT GER EN ALLMÄN BAKGRUNDSINFORMATION TILL LABORATIONERNA I DATORSEENDEKURSEN, SAMT SPECIFIK INFORMATION AVSEENDE BILDHANTERING I MATLAB. LÄS GENOM TEXTEN OCH TILLGODOGÖR DIG INNEHÅLLET INNAN DU BÖRJAR LABORERA.
Laborationerna går ut på att praktiskt studera ett antal grundläggande tekniker i bildbehandling, bildanalys och datorseende samt att lösa enkla problem med hjälp av dessa. För att undvika att programmeringen tar alltför mycket tid, har vi valt att använda Matlab som interaktiv programmeringsmiljö och visualiseringsverktyg. Eftersom laborationerna omfattar visning av gråtonsbilder, och i vissa moment även färginformation, behöver du därmed ha tillgång till Matlab på en dator med sådana visningsmöjligheter.
Lättast använder du dig av arbetsstationerna i Nadas terminalsalar. Du kan naturligtvis också göra laborationerna på en annan dator där du har tillgång till Matlab. I så fall är det dock värt att notera att vissa av de testbilder som tillhandahålls i kursen ligger lagrade på Matlabs interna binära format. Kursledningen kan ej garantera att dessa kommer att kunna användas på andra datorer än de SUN-datorer som finns i Nadas ordinarie UNIX-miljö. Vidare sker redovisningarna på datorer i Nadas terminalsalar.
Dock finns ett antal andra bilder lagrade på ett mer minneskrävande ASCII-format. Om du använder Matlab på i en annan datormiljö och drabbas av inkompatibilitetsproblem med det binära formatet, kan dessa bilder vara lättare att överföra mellan olika datorsystem.
Om du vill överföra filer från Nadas datorsystem till din egen dator kan du förslagsvis använda dig av ett ftp-program, och ansluta dig till Nadas ftp-server ftp.nada.kth.se med ditt användarnamn på Nada, varefter du navigerar dig fram till kurskatalogen
/misc/info/NADA-kurser/datorseende-gkoch överför filerna i de aktuella underkatalogerna (för mer detaljerad information om konton och kurskataloger, se kommande avsnitt).
Om du har ett personligt konto på Nadas datorer skall du använda detta för kursen. Kontakta i annat fall Nadas servicecenter Delphi (tag med giltigt ID-kort).
Pekare till all studentinformation om kursen finns samlad under
/info/dsgk03Bl.a. finns här en modulfil
/info/dsgk03/module/dsgk03som laddas automatiskt efter att du anslutit dig till kursen medelst
course join dsgk03Anslut dig till kursen om du inte redan gjort detta!
Till kursen finns en kursmapp
/info/NADA-kurser/datorseende-gksom innehåller följande filer och mappar:
Bilden i en sådan fil thisimage.mat är lagrad som en Matlab-variabel och laddas från Matlab medelst
load thisimageEfter att du laddat denna fil kan du variabelns namn t.ex. genom att använda kommandot who.
Bilden i en sådan fil thatimage.m representeras i form av en Matlab-funktion och laddas t.ex. genom
x = thatimage;Om du råkar glömma det avslutande semi-kolonet förstår du varför du inte skall göra det i fortsättningen.
Bilden i en sådan fil, animage.jpg eller animage.tiff, läses in medelst
hund1 = double(imread('animage.jpg'));
hund2 = double(imread('animage.tiff'));
/info/NADA-kurser/datorseende-gk/Functions
/info/NADA-kurser/datorseende-gk/Images-m
/info/NADA-kurser/datorseende-gk/Images-mat
OBS! Funktionsbiblioteket och bildkatalogerna kan komma att uppdateras under kursens gång. De filer som avser en viss laboration låses dock (så när på eventuella bug-fixar) när denna laboration delats ut. Av denna anledning kan de kursdeltagare som väljer att göra laborationerna vid andra datorer behöva uppdatera filer som de kopierat från kursmappen.
En laboration bedöms antingen som godkänd eller underkänd. Om laborationen underkänns blir du ombedd att komplettera samt att redovisa (hela) laborationen vid ett senare tillfälle.
Under redovisningen skall du kunna svara på frågor av allmän och specifik natur angående den metodik som används samt frågor som innebär att du måste reproducera (delar av) laborationsuppgifterna. Lättast hanterar du det senare genom att spara dina Matlab-kommandon i ett Matlab-script (se nedan).
Före redovisningen skall du ha dokumenterat dina svar på frågorna i laborationsanvisningarna skriftligt. Beskrivningen skall omfatta en sammanfattning av resultaten och slutsatserna därav på ett sådant sätt att texten kan läsas rimligt fristående från laborationsinstruktionen.
Den (kortfattade) labrapport som du på detta sätt sammanställer fungerar som ett kompletterande inlärningsmoment och ger dig träning i att dokumentera experimentellt arbete. Typiskt kan ett par A4-sidor text samt utskrifter av de viktigaste resultatbilderna räcka. Kom väl förberedd till redovisningen.
Vi använder programmet bok för att administrera bokningen av redovisningstillfällen. Du bokar tid för redovisning genom att på Nadas UNIX-datorer skriva kommandot
bok new dsgk03och följa instruktionerna. (När du startar detta program får du bl.a. se en lista med vilka bokningstider som är tillgängliga.) Notera att endast den första lediga tiden kan bokas för varje redovisningspass. Efter att du bokat en tid kan du kan du se vilka tider du bokat medelst
bok show dsgk03Om du behöver avboka en tid, gör du detta med
bok remove dsgk03
Observera att du måste ha registrerat dig på kursen med programmet res för att kunna boka redovisningstid med bok. Om du inte har gjort detta tidigare, registera dig genom att ange kommandot
res checkin dsgk03och avvakta att databasen i res uppdateras. (Denna uppdatering kan ta någon dag. Inte bara av denna anledning är det därför viktigt att du registrerar dig snarast efter kursstarten!) När registeringen aktiverats, kan du använda bok.
Som angivits i på föreläsningarna, kan du få bonuspoäng på tentamen om du redovisar laborationerna före vissa tidpunkter. Mer detaljerad information om detta finns i kursprogrammet och på kursens WWW-sida.
Om du inte är bekant med Matlab sedan tidigare, kan du vilja läsa genom ``Användarhandledning till Matlab'', vilken finns att köpa på Nadas studentexpedition. Du kan också läsa genom det första avsnittet i kapitel 2 i ``Matlab's User's Guide'' samtidigt som du provar några av exemplen på din dator. Notera dock att Matlab har en viss inbyggd hjälpfunktionalitet baserad på kommandot help. Därför kan det gå att använda systemet baserat enbart på denna funktionalitet samt den kortfattade introduktion som följer nedan.
För att kunna visa bilder med det Matlab-system som körs på Nadas UNIX-datorer, måste du ha en arbetsstation eller en X-terminal med grånivå- eller färgskärm. Om du har ett kurskonto, bör X-windows startas upp automatiskt.
Innan du startar Matlab för första gången, skall du kontrollera sökvägarna. På Nadas UNIX-system kontrollerar du att
echo $MATLABPATH
ger en utskrift som
innehåller de sökvägar som anges
på sida module load /info/dsgk03/module/dsgk03Därefter startar du Matlab genom att skriva
matlabEfter en kort stund kommer ett fönster med en logotyp att snabbt visas på din skärm, medan du får ett hälsningsmeddelande i ditt terminalfönster med en prompt. Om så inte är fallet, kontrollera att ovanstående instruktioner följts.
Om du använder en skärmbaserad version av Matlab och om systemet är långsamt i Unix-miljön, kan du snabba upp interaktiviteten genom att använda terminalbaserad interaktion istället. Starta då upp Matlab medelst:
matlab -nojvm
För att ladda en av de binära bilder som ligger i kursens bilddatabas skriver du
load canoe256Med kommandot who kan du nu se att följande variabler definierats i Matlab
Canoe zmax zminHär innehåller variabeln Canoe en bild. Du kan titta på denna genom att använda visningsfunktionen showgrey, vilken skrivits speciellt för denna laborationskurs
showgrey(Canoe)
För att ladda in en av de bilder som lagrats på det ASCII-baserade textformatet, kan du skriva
phone = phonecalc256;Denna operation tilldelar värdet av bilden till variabeln phone, och semikolonet undertrycker utskriften av resultatet av tilldelningen. (Som du märker, kräver detta format betydligt längre inläsningstid.) Om du vill kan du titta på resultatet med
showgrey(phone)Du kan också titta på en annan sådan bild med den kortare notationen
showgrey(nallo128)Som du ser är kontrasten dålig i den nedre delen av denna bild. I första laborationen skall vi undersöka olika bildförbättringsmetoder för att framhäva information som annars kan vara svår att se.
Har du egna bilder som du vill bearbeta, kan du använda Matlabs inbyggda funktion ``imread'' som kan läsa ett antal vanliga bildformat, inkluderande tiff- och jpeg-formaten - se ``help imread''. En sådan bild läser du
rawpic = imread('image.tif');Observera att en konverting krävs med kommandot double innan du kan använda utdata från funktionen ``imread'' som en ``vanlig'' bild.
floatpic = double(rawpic);
showgrey(floatpic);
Konvertering mellan olika bildformat kan du i Nadas datormiljö genomföra med programmet ``convert'', som kan konvertera bilder mellan en rad olika filformat helt enkelt genom att du anger ändelsen på det filformat du vill konvertera till. 1
module add gnomeDu kan också använda det interaktiva programmet ``xv'' till att konvertera mellan bildformat samt till att grabba bilder från skärmen (följ menyinstruktionerna).
convert image.gif image.tiff
convert onepage.ps onepage.tiff
Om du använder många stora bilder, kan det finnas risk att du slår i minnestaket. För att städa bort alla gamla bilder, skriv
clearoch kontrollera med who att samtliga variabler raderats. Du kan ta bort visningsfönstret med
closeeller genom att avsluta Matlab med
exitPå de kommande sidorna följer en kort inledning till Matlab avsedd för studenter som inte sedan tidigare är bekanta med detta system. För en van användare är antagligen det mesta av denna information överflödig. även vana användare kan dock vara betjänta av informationen under avsnitten ``Syntax och beräkningseffektivitet'', ``Koordinatsystem'' samt ``Minnesanvändning''. För att underlätta laborationsredovisningarna, bör du speciellt följa anvisningarna i avsnittet ``Skript''.
MATLAB är ett system som ursprungligen utvecklades för att hantera matriser med en kompakt notation. I och med att man kan representera bilder som matriser, kan MATLAB i detta avseende användas för bildoperationer.
MATLAB är dock mest lämpat för bildoperationer som enkelt kan uttryckas i matrisform. Som ni kanske kommer att märka, har detta påverkat utformningen av laborationerna i denna kurs.
MATLABs inbyggda hjälpfunktionalitet fungerar i stort sett på följande sätt: Om du skriver
helpfår du en lista på ett sjuttiotal ämnen under vilka alla inbyggda kommandon (och en kort beskrivning av vissa begrepp) är samlade. Denna lista är hierarkiskt organiserad. Om du skriver
help ämnedär ämne är någon av rubrikerna i den översiktliga listan, får du en lista på kommandon associerade till detta ämne. Slutligen skriver man
help kommandoför specifik information om ett visst kommando. Några av de kommandon/ämnen som kommer att vara mest relevanta i denna kurs är arith, axis, clear, close, colon, color, colormap, diary, figure, for, function, help, if, image, input, keyboard, linspace, load, ones, paren, pause, plot, print, punct, relop, save, script, showgrey, size, slash, title, while, och zeros. Prova!
Variabler i MATLAB kan sparas på filer med kommandot
save filnamn x y zvilket leder till att en binär represention av variablerna x, y och z skrivs till filen filename.mat. Dessa kan sedan läsas in till en annan MATLAB-session genom
load filnamnNotera att tidigare variabler med samma namn skrivs över (utan föregående varning). För att se vilka variabler som är definierade, anger man
whoStorleksinformation om alla definierade variabler erhålles via
whos
Bilder visas på skärmen via MATLABs inbyggda kommando image eller det mer användarvänliga gränssnittet showgrey (för svartvita bilder). De bilder som visas på skärmen, liksom histogram och annan grafisk utmatning, visas i speciella grafikfönster. Det första grafikfönstret skapas så fort det behövs. Ytterligare fönster för att samtidigt visa flera bilder kan öppnas genom
figureAll grafisk utmatning visas i det aktuella fönstret. Detta är normalt sett det senast öppnade fönstret, eller det fönster som senast aktiverats, t.ex. genom att du lyft fram det i förgrunden. Om du vill att ett visst fönster, säg det med nummer id, skall bli det aktuella skriver du
figure(id)Kommandot
closetar bort det aktuella fönstret medan
close(id)tar bort fönstret med nummer id. Med kommandot subplot kan du montera flera illustrationer i samma figur, se
help subplotMed kommandot
title(sprintf('Titel: (arg1, arg2) = (%d, %f)', intarg, floatval))kan du ge en illustrativ titel på din figur inkluderande parametervärden som använts för att generera denna.
Det som visas i ett grafikfönster kan skrivas ut på en laserskrivare med namn skrivarnamn medelst
print -PskrivarnamnDu kan också spara grafik i POSTSCRIPTformat på en fil med filnamn genom
print -deps filnamnInnan man skriver ut en bild kan man vilja komplettera med en rubrik samt ta bort eller lägga till koordinataxlar. Kommandot
title textsträngtilldelar den aktuella figuren rubriken textsträng. Koordinataxlar i aktuell figur utritas med
axis onsamt tas bort med
axis off
I vissa lägen kan det vara önskvärt att spara både inmatningen och utmatningen från en MATLAB-session i en loggbok. Detta görs genom att skriva
diary filnamnvilket får MATLAB att kopiera all inmatning och utmatning (synlig på skärmen) till filen filnamn. När väl en loggbok har öppnats, kan du stänga av och återstarta utmatningen till denna medelst diary off och diary on.
Ett MATLAB-skript är en fil bestående av en serie MATLAB-kommandon. En skriptfil måste ha ett namn av formen skriptnamn.m. När du skriver
skriptnamni MATLAB-intepretatorn (eller i ett annat skript eller funktion) exekveras serien av kommandon i skriptfilen på samma sätt som om du skulle ha skrivit dessa kommandon direkt i MATLABs kommandointerpretator (efter prompten). Detta innebär att skriptet kan påverka (och ofta avsiktligt påverkar) variablerna i MATLABs arbetsutrymme.
För att snabba upp redovisningsproceduren bör du skapa skript så att de viktigaste stegen i laborationen lätt kan reproduceras. I detta sammanhang kan du notera att exekveringen av skriptet bör avbrytas i strategiska lägen för att tillåta närmare inspektion av mellanresultat. Detta kan du göra med anrop av keyboard, pause och input. (I många lägen är det första att föredra, eftersom det ger tillgång till MATLABs arbetsutrymme vid läget för avbrottet.)
Ett i många lägen praktiskt sätt att skapa skriptfiler är genom att först undersöka metodiken i den interaktiva interpretatorn med loggboken påslagen, editera loggboken efter det att utmatningen till denna stängts av (använd den editor du föredrar, tex emacs) samt successivt uppdatera scriptet tills det kan köras i sin helhet. (För att undvika interferens med vissa globala variabler kan du behöva återställa dessa medelst clear variabelnamn före varje testkörning,)
MATLABs funktioner ser i många avseenden ut som skript. Skillnaden är att de
En funktion som tar två argument som indata och returnerar ett argument som utdata har en funktionsdeklaration av formen
funktion utdata = funktionsnamn(indata1, indata2)medan deklarationen av en funktion som returnera tre argument som utdata utan att använda något argument som indata skrivs
funktion [utdata1, utdata2, utdata3] = funktionsnamn()I funktionsfilen behandlas argumenten som vanliga MATLAB-variabler. Resultatet returneras genom att tilldela ett värde till utdataargumentet (se nedan).
För att MATLAB skall kunna finna en viss fil, såsom en fil med sparade MATLAB-variabler, ett MATLAB-skript eller en MATLAB-funktion, måste denna fil finnas antingen på MATLABs aktuella arbetsmapp eller ingå i MATLABs lista av sökvägar.
Du kan undersöka vilken som är MATLABs aktuella arbetsmapp med kommandot pwd samt ställa om denna med cd. Du kan också inifrån MATLAB se vilken som är systemets aktuella sökväg samt ställa om denna med kommandot path. (Om du behöver hjälp, använd help-funktionen.)
Om du bygger ett eget bibliotek med MATLAB-funktioner och MATLAB-skript, kan du vilja inkludera mapparna med dessa bland MATLABs sökvägar. På Nadas UNIX-datorer kan du göra detta genom att uppdatera $MATLABPATH i din .login-fil eller genom att skapa en egen modulfil (se /info/dsgk03/module/dsgk03 för ett exempel på hur man skapar modulfiler).
MATLAB har en enkel kommandoradseditor som gör att du kan editera din tidigare inmatning istället för att skriva om varje kommandorad från början. Bl.a. finns följande (emacs-liknande) kommandon
Här betyder
ctrl
-P
uppåt till föregående kommandorad ctrl
-N
nedåt till nästa kommandorad ctrl
-B
en position bakåt ctrl
-F
en position framåt ctrl
-A
till radens början ctrl
-E
till radens slut ctrl
-D
radera aktuell position ctrl
-K
radera till radens slut
Om du vill hitta en speciell kommandorad,
säg den där du tilldelade variabel
thisvar ett värde genom att skriva ett längre uttryck,
kan du finna denna rad på ett snabbare sätt genom
att först skriva in thisvar på kommandoraden
och därefter använda
ctrl
-P upprepade gånger.
Då genomlöper kommandoradseditorn endast
de kommandorader som inleds med denna teckenkombination.
Om ett kommando (vanligtvis en rad) avslutas med ett semikolon ``;'', så undertrycks utskriften av resultatet. Detta är praktiskt nödvändigt då man hanterar stora bilder, vilka annars kommmer att fylla din skärm och ta en avsevärd tid att skriva ut. Utan överdrift är detta nödvändigt också i skript och funktioner.
Om en inmatningsrad (t.ex. i ett script eller en funktion) inleds med ett procenttecken + av informationen på denna rad, Bl.a. baseras MATLABs inbyggda help-funktion på sådana kommentarrader. Kommandot
help matlabfildär matlabfil.m är en skript- eller funktionsfil skriver ut den första obrutna sekvensen av kommentarrader i denna fil. Du kan därmed använda help-funktionen även för dina egna funktioner och skript. Kom dock bara ihåg att första raden i en funktionsfil måste innehålla funktionsdeklarationen (se ovan).
Om ett kommando eller en definition sträcker sig över mer flera rader måste du avsluta varje rad med tre punkter ``...'' för att tala om att kommandot fortsätter på nästa rad. Om du missar detta, kan du få svårtolkade felutskrifter.
Notationen i MATLABs är främst avpassad för att hantera matriser och vektorer med en kompakt notation. Det finns ett flertal speciella konstruktioner för att undvika explicita loopar. Eftersom MATLAB är ett interpreterande system, skall du därför använda dessa konstruktioner i största möjliga mån. Några exempel:
x = (1 : 2 : 97)
x = linspace(1, 97, 48)
x(1 : 5 : 16)
17 * ones(3, 4)
ones(2 : 3) * ones(3 : 4)
y = [[ones(1, 2), zeros(1, 2); linspace(1, 2, 4); 1 2 3, 4]' ...
17*linspace(3, 81, 4)' * [0.1 0.2]]
Om du någon gång måste skriva en explicit loop, kan du undvika att din rutin blir onödigt långsam genom att (där så är möjligt) allokera det minne som behövs utanför loopen. Jämför exempelvis följande två konstruktioner
clear x; for n = 1:10000 x(n) = n*n; end for n = 1:10000 x(n) = n*n; endI detta fall kommer den första loopen att kräva betydligt mer CPU-tid än den senare, eftersom vektorn x reallokeras i varje iteration i den första loopen, medan den redan har tillräcklig längd när den andra loopen gås genom.
Ingen av ovanstånde lösningar är naturligtvis bra. Det sätt som denna typ av tilldelning bör genomföras på i MATLAB är via den inbyggda funktionaliteten:
tmp = (1 : 1 : 10000);
x = tmp .* tmp;
I bildbearbetningssammanhang
används flera konventioner för koordinatsystem.
På föreläsningarna, liksom i boken av Sonka,
används ett Cartesiskt koordinatsystem med
horisontell högerriktad
-axel och uppåtriktad vertikal
-axel.
Koordinatsystemet som används i den kompletterande
boken av Gonzalez och Woods samt
i MATLAB är dock roterat 90 grader medsols i förhållande till detta,
d.v.s. den första koordinataxeln är nedåtriktad och och
den andra koordinataxeln är horisontellt riktad åt höger.
Hur matriser definieras och accessas i MATLAB framgår av nedanstående exempel. Detta exempel visar också hur det ascii-baserade bildformatet är definierat som en funktion som returnerar en bildmatris som utdata
function pixels = matlabcoordimage()
% Test image with imax = 3, jmax = 4 and pixel values
% pixels(i, j) = 10*i + j
% where i and j are Matlab indeces as they
% are used for accessing matrix elements
pixels = [11 12 13 14; ...
21 22 23 24; ...
31 32 33 34];
För att skapa en motsvarande bild i matlab så
att värdena istället
avspeglar bildpositionerna i Cartesiska koordinater skriver man:
function pixels = cartesiancoordimage()
% Test image with xmax = 4, ymax = 3 and pixel values
% f(x, y) = 10*x + y
% where x and y are Cartesian coordinates
% as they appear on the screen
pixels = [13 23 33 43; ...
12 22 32 42; ...
11 21 31 41];
Notera de goda förutsättningarna för sammanblandningar.
I och med att man i vissa programmeringsmiljöer accessar
vektorer med början på index noll,
medan andra börjar på indexvärde ett
(MATLAB använder det senare),
finns det ytterligare en frihetsgrad.
Om du drabbas av problem, stanna upp och tänk till!
Bildinformation kräver stora mängder datorminne, både vid extern lagring på skivminne och i datorns interna arbetsminne. När du avlusar algoritmer, underlättas arbetet ofta väsentligt om du använder små testbilder.
Undvik i görligaste mån att lagra större bilder på din användararea i form av sparade MATLAB-variabler, POSTSCRIPT-bilder eller liknande. Grafer och bilder som kan regenereras med rimlig effektivitet ``sparas'' effektivast i termer av de MATLAB-script som ursprungligen genererade dem.
Om du definierar många bilder i MATLAB kommer din MATLAB-process att använda en stor mängd internminne. Du kan frigöra minnet allokerat av en variabel x genom att skriva clear x. Om x är din senast definierade variabel, så kommer storleken av din MATLAB-process att minska omedelbart.
This document was generated using the LaTeX2HTML translator Version 98.1p7 (June 18th, 1998)
Copyright © 1993, 1994, 1995, 1996,
Nikos Drakos,
Computer Based Learning Unit, University of Leeds.
Copyright © 1997, 1998,
Ross Moore,
Mathematics Department, Macquarie University, Sydney.
The command line arguments were:
latex2html -split 2 lab0-03.tex
The translation was initiated by Tony Lindeberg on 2003-01-16