next up previous


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.

Dator- och laborationsmiljö

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-gk
och överför filerna i de aktuella underkatalogerna (för mer detaljerad information om konton och kurskataloger, se kommande avsnitt).

Kurskonton

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).

Kursinformation

Pekare till all studentinformation om kursen finns samlad under

/info/dsgk03
Bl.a. finns här en modulfil
/info/dsgk03/module/dsgk03
som laddas automatiskt efter att du anslutit dig till kursen medelst
course join dsgk03
Anslut dig till kursen om du inte redan gjort detta!

Kursmapp

Till kursen finns en kursmapp

/info/NADA-kurser/datorseende-gk
som innehåller följande filer och mappar:
Functions
$ \,$
Ett litet bibliotek av Matlab-funktioner för att bearbeta och visa bilder.
Images-mat
$ \,$
Testbilder lagrade på Matlabs binära (och kompakta) format.

Bilden i en sådan fil thisimage.mat är lagrad som en Matlab-variabel och laddas från Matlab medelst

load thisimage
Efter att du laddat denna fil kan du variabelns namn t.ex. genom att använda kommandot who.
Images-m
$ \,$
Testbilder lagrade på ett mer minneskrävande ASCII-format.

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.
Images
$ \,$
Testbilder i JPEG- och TIFF-format.

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'));
Om sökvägslistan (omgivningsvariabeln $MATLABPATH på Nadas UNIX-system) är korrekt satt till ditt Matlab-system (sätts av /info/dsgk03/module/dsgk03 på Nadas datorer) så skall du ha tillgång till dessa funktioner och bilder efter att du startat upp Matlab. Innan du startar upp Matlab, kontrollera därför att följande sökvägar ingår (eller motsvarande för andra datorer):
/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.

Redovisningskrav

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.

Bokning av redovisningstid

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 dsgk03
och 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 dsgk03
Om du behöver avboka en tid, gör du detta med
bok remove dsgk03

Registrering

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 dsgk03
och 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.

Bonuspoäng

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.

Hantering av bilder i Matlab

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.

Uppstart

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 [*] i detta häfte. Om inte, skriv
module load /info/dsgk03/module/dsgk03
Därefter startar du Matlab genom att skriva
matlab
Efter 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

Läsning och visning av bilder

Bilder på Matlabs binärformat.

För att ladda en av de binära bilder som ligger i kursens bilddatabas skriver du

load canoe256
Med kommandot who kan du nu se att följande variabler definierats i Matlab
Canoe zmax zmin
Hä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)

Bilder på kursens ASCII-baserade funktionsformat.

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.

Egna bilder.

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');
floatpic = double(rawpic);
showgrey(floatpic);
Observera att en konverting krävs med kommandot double innan du kan använda utdata från funktionen ``imread'' som en ``vanlig'' bild.

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 gnome
convert image.gif image.tiff
convert onepage.ps onepage.tiff
Du 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).

Städa bort gamla bilder.

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

clear
och kontrollera med who att samtliga variabler raderats. Du kan ta bort visningsfönstret med
close
eller genom att avsluta Matlab med
exit
På 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''.

Kort introduktion till MATLAB

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.

Inbyggd dokumentation

MATLABs inbyggda hjälpfunktionalitet fungerar i stort sett på följande sätt: Om du skriver

help
få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 ämne
dä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 kommando
fö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!

Lagring på fil

Variabler i MATLAB kan sparas på filer med kommandot

save filnamn x y z
vilket 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 filnamn
Notera att tidigare variabler med samma namn skrivs över (utan föregående varning). För att se vilka variabler som är definierade, anger man
who
Storleksinformation om alla definierade variabler erhålles via
whos

Visning på skärm

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

figure
All 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
close
tar 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 subplot
Med 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.

Utskrift på papper

Det som visas i ett grafikfönster kan skrivas ut på en laserskrivare med namn skrivarnamn medelst

print -Pskrivarnamn
Du kan också spara grafik i POSTSCRIPTformat på en fil med filnamn genom
print -deps filnamn
Innan man skriver ut en bild kan man vilja komplettera med en rubrik samt ta bort eller lägga till koordinataxlar. Kommandot
title textsträng
tilldelar den aktuella figuren rubriken textsträng. Koordinataxlar i aktuell figur utritas med
axis on
samt tas bort med
axis off

Loggbok

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 filnamn
vilket 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.

Skript

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

skriptnamn
i 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,)

Funktioner

MATLABs funktioner ser i många avseenden ut som skript. Skillnaden är att de

En funktion med namn funktionsnamn måste lagras i en fil med namn funktionsnamn.m. Vidare måste funktionen deklareras i första raden i denna fil.

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).

Sökvägar

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).

Kommandoradseditor

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

$ <$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
Här betyder $ <$ctrl$ >$-P att du trycker på kontrolltangenten samtidigt som du skriver bokstaven ``p''. Pågående beräkningar och utskrifter kan i allmänhet avbrytas med $ <$ctrl$ >$-C.

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.

Undertryckande av utskrifter

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.

Kommentarer

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 matlabfil
dä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).

Långa kommandon och definitioner -- multipla rader

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.

Syntax och beräkningseffektivitet

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:

Som du ser går det, liksom i C, att välja notation som kan vara mer eller mindre läsbar för den mindre vane användaren. Därför, välj en programmeringsstil som är lättläst!

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;
end
I 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;

Koordinatsystem

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 $ x$-axel och uppåtriktad vertikal $ y$-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!

Minnesanvändning

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.

Om detta dokument...

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


next up previous
Tony Lindeberg
2003-01-16