24.11.2013 Views

Konvertering av rasterbild till vektorbild för datorstödd ... - KTH

Konvertering av rasterbild till vektorbild för datorstödd ... - KTH

Konvertering av rasterbild till vektorbild för datorstödd ... - KTH

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Konvertering</strong> <strong>av</strong> <strong>rasterbild</strong><br />

<strong>till</strong> <strong>vektorbild</strong> <strong>för</strong> <strong>datorstödd</strong><br />

illustration och animation<br />

J O H A N K O T L I N S K I<br />

Examensarbete<br />

Stockholm, Sverige 2006


<strong>Konvertering</strong> <strong>av</strong> <strong>rasterbild</strong><br />

<strong>till</strong> <strong>vektorbild</strong> <strong>för</strong> <strong>datorstödd</strong><br />

illustration och animation<br />

J O H A N K O T L I N S K I<br />

Examensarbete i datalogi om 20 poäng<br />

vid Programmet <strong>för</strong> medieteknik<br />

Kungliga Tekniska Högskolan år 2006<br />

Handledare på CSC var Lars Kjelldahl<br />

Examinator var Lars Kjelldahl<br />

TRITA-CSC-E 2006:095<br />

ISRN-<strong>KTH</strong>/CSC/E--06/095--SE<br />

ISSN-1653-5715<br />

Kungliga tekniska högskolan<br />

Skolan <strong>för</strong> dat<strong>av</strong>etenskap och kommunikation<br />

<strong>KTH</strong> CSC<br />

100 44 Stockholm<br />

URL: www.csc.kth.se


Sammanfattning<br />

Idag sker mycket <strong>av</strong> arbetet inom illustration och animation med hjälp<br />

<strong>av</strong> datorer. Allt fler delar <strong>av</strong> arbetsprocessen sker digitalt, ofta med hjälp<br />

<strong>av</strong> något grafiskt vektorformat. De flesta illustratörer väljer dock fortfarande<br />

att skissa med papper och penna. Processen att konvertera den ursprungliga<br />

blyertsskissen <strong>till</strong> vektorgrafik är ett ofta tröttsamt och tidsödande arbete.<br />

Detta examensarbete har som syfte att utveckla en applikation <strong>för</strong> att<br />

hjälpa illustratörer att konvertera sina skisser <strong>till</strong> vektorgrafik på ett enkelt<br />

sätt. Många <strong>av</strong> de tekniska problemen inom arbetet ligger nära traditionella<br />

områden som OCR (optical character recognition) och kartdigitalisering.<br />

Tyngdvikten i arbetet ligger på att utvärdera, implementera och anpassa<br />

befintliga algoritmer, samt att konstruera kompletterande metoder där så<br />

krävs.<br />

Resultatet <strong>av</strong> arbetet är en Windows-applikation som konverterar inskannade<br />

skisser i rasterformat <strong>till</strong> vektorgrafik (EPS-format). Applikationen har<br />

ett grafiskt gränssnitt som är rimligt lättanvänt och ger användaren direkt<br />

återkoppling vid parameterändringar.


Abstract<br />

Conversion of raster image to vector image for computer aided<br />

illustration and animation<br />

These days, many illustrators and animators use computers in their daily<br />

work. Drawing programs based on vector graphics are in common use. For<br />

various reasons, most illustrators s<strong>till</strong> prefer to sketch using traditional pen<br />

and paper. The sketches must then be digitised and converted to vector<br />

format for further editing. Doing this conversion manually can be a tedious<br />

and time-consuming task.<br />

The aim of this project is to create an application for converting scanned<br />

sketches to vector graphics in a simple and efficient way. The application<br />

is supposed to help illustrators and animators. Many of the problems encountered<br />

are familiar from similar problem areas (e.g. OCR, CAD, GIS).<br />

Existing algorithms are evaluated, implemented and adapted, and complementing<br />

methods are created when necessary.<br />

The end result of the project is a Windows application that converts digitised<br />

hand-drawn sketches to vector graphics. The application has a graphical<br />

user interface that is easy to use and gives direct feedback on parameter<br />

changes.


Förord<br />

I denna rapport beskrivs mitt examensarbete vid Nada, <strong>KTH</strong>. Arbetet är<br />

gjort inom ämnesområdet datalogi. Uppdragsgivare är Ola Persson, som arbetar<br />

som frilansare inom illustration och animation. Ola är initiativtagare<br />

<strong>till</strong> projektet och har varit ett ovärderligt stöd under det kontinuerliga arbetet.<br />

Jonna Olsson har i ett parallellt examensarbete undersökt MDI-aspekter,<br />

designat användargränssnitt och varit <strong>till</strong> stor hjälp <strong>för</strong> mig i att slut<strong>för</strong>a detta<br />

arbete. Björn Eiderbäck och Lars Kjelldahl har ställt upp som handledare<br />

och rådgivare. Ett stort tack går ut <strong>till</strong> de illustratörer och animatörer som<br />

bidragit med synpunkter och värdefulla insikter angående projektet; ingen<br />

nämnd, ingen glömd. Ett sista tack får gå <strong>till</strong> min hund Nixon, som har varit<br />

ett troget sällskap under rapportskrivandet, och <strong>till</strong> min flickvän Rebecca<br />

som finansierat det.


Innehåll<br />

1 Inledning 1<br />

1.1 Bakgrund . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />

1.2 Syfte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.3 Metodik . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.4 Avgränsning . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />

1.5 Rapportens struktur . . . . . . . . . . . . . . . . . . . . . . . 3<br />

2 En introduktion <strong>till</strong> vektorisering 4<br />

2.1 Vad är vektorisering? . . . . . . . . . . . . . . . . . . . . . . . 4<br />

2.2 Olika typer <strong>av</strong> vektorisering . . . . . . . . . . . . . . . . . . . 5<br />

2.3 Användning i näringsliv och forskning . . . . . . . . . . . . . . 5<br />

2.3.1 Computer-Aided Design . . . . . . . . . . . . . . . . . 5<br />

2.3.2 Geographic Information Systems . . . . . . . . . . . . 5<br />

2.3.3 Optical Character Recognition . . . . . . . . . . . . . . 6<br />

2.3.4 Illustration och animation . . . . . . . . . . . . . . . . 6<br />

2.4 Översikt över befintliga vektoriserare . . . . . . . . . . . . . . 7<br />

2.5 Speciella behov hos illustratörer . . . . . . . . . . . . . . . . . 8<br />

2.5.1 Estetik . . . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.5.2 Inmaterial . . . . . . . . . . . . . . . . . . . . . . . . . 8<br />

2.5.3 Maner . . . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

2.5.4 Gränssnitt . . . . . . . . . . . . . . . . . . . . . . . . . 10<br />

3 Teori 11<br />

3.1 Binärisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />

3.1.1 Otsu-binärisering . . . . . . . . . . . . . . . . . . . . . 13<br />

3.1.2 Lokal kontrast-metoden . . . . . . . . . . . . . . . . . 13<br />

3.2 Vektorisering . . . . . . . . . . . . . . . . . . . . . . . . . . . 14<br />

3.2.1 Att <strong>för</strong>tunna eller ej . . . . . . . . . . . . . . . . . . . 17<br />

3.3 Bezierkurvor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

3.3.1 Historik . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />

3.3.2 Matematik . . . . . . . . . . . . . . . . . . . . . . . . . 18


3.3.3 Användningsområden . . . . . . . . . . . . . . . . . . . 19<br />

3.3.4 Från polylinje <strong>till</strong> bezierkurva . . . . . . . . . . . . . . 19<br />

3.4 PostScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />

4 Lösning 21<br />

4.1 Desaturering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

4.2 Binärisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21<br />

4.2.1 Global binärisering . . . . . . . . . . . . . . . . . . . . 23<br />

4.2.2 Lokalt adaptiv binärisering . . . . . . . . . . . . . . . . 23<br />

4.3 Hålifyllning . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />

4.4 Generering <strong>av</strong> <strong>av</strong>ståndskarta . . . . . . . . . . . . . . . . . . . 24<br />

4.5 Ythantering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />

4.6 Förtunning . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27<br />

4.7 <strong>Konvertering</strong> <strong>till</strong> polylinjer . . . . . . . . . . . . . . . . . . . . 27<br />

4.7.1 Knytpunktslinjer . . . . . . . . . . . . . . . . . . . . . 28<br />

4.7.2 Frilagda linjer . . . . . . . . . . . . . . . . . . . . . . . 29<br />

4.7.3 Cirklar . . . . . . . . . . . . . . . . . . . . . . . . . . . 29<br />

4.8 Borttagning <strong>av</strong> korta linjer . . . . . . . . . . . . . . . . . . . . 30<br />

4.9 Borttagning <strong>av</strong> överflödiga punkter . . . . . . . . . . . . . . . 31<br />

4.10 Hantering <strong>av</strong> <strong>för</strong>greningar . . . . . . . . . . . . . . . . . . . . 32<br />

4.10.1 T-<strong>för</strong>greningar . . . . . . . . . . . . . . . . . . . . . . . 32<br />

4.10.2 Falska Y-<strong>för</strong>greningar . . . . . . . . . . . . . . . . . . . 33<br />

4.11 Knäsplittring . . . . . . . . . . . . . . . . . . . . . . . . . . . 36<br />

4.12 <strong>Konvertering</strong> <strong>till</strong> bezierkurvor . . . . . . . . . . . . . . . . . . 36<br />

4.13 Export <strong>till</strong> PostScript . . . . . . . . . . . . . . . . . . . . . . . 37<br />

5 Resultat och diskussion 38<br />

5.1 Prestanda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

5.2 Kvalitativa resultat . . . . . . . . . . . . . . . . . . . . . . . . 38<br />

5.3 Exempelbilder . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

5.4 Slutsats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />

6 Förslag <strong>för</strong> vidareutveckling 50<br />

6.1 Stöd <strong>för</strong> varierande bildupplösning . . . . . . . . . . . . . . . . 50<br />

6.2 Förbättrat användargränssnitt . . . . . . . . . . . . . . . . . . 50<br />

6.3 Multiplattformsstöd . . . . . . . . . . . . . . . . . . . . . . . . 50<br />

Litteratur<strong>för</strong>teckning 51


Kapitel 1<br />

Inledning<br />

1.1 Bakgrund<br />

Att göra tecknad film kan idag innebära mycket digitalt arbete, då mer och<br />

mer <strong>av</strong> animationsprocessen blir <strong>datorstödd</strong>. Samma sak gäller <strong>för</strong> illustratörer:<br />

mer och mer <strong>av</strong> arbetet kan ut<strong>för</strong>as med hjälp <strong>av</strong> datorn. Men fortfarande<br />

arbetar många illustratörer och animatörer med papper och penna<br />

i den inledande skissfasen. Skisserna görs med blyertspenna på papper, och<br />

digitaliseras (t.ex. med skanner) <strong>för</strong> vidare bearbetning i datorn.<br />

Att manuellt konvertera en inskannad blyertsskiss <strong>till</strong> en färdig vektorgrafikbild<br />

kan vara både tidsödande och tråkigt. Det finns ett antal program i<br />

dagsläget <strong>för</strong> att stödja animation och illustration. Vi har dock inte hittat<br />

något <strong>till</strong>gängligt program som stödjer denna del <strong>av</strong> processen på ett <strong>till</strong>fredsställande<br />

sätt. För att snabba upp denna icke-kreativa del <strong>av</strong> att illustrera<br />

eller producera tecknad film kan det vara bra med ytterligare datorstöd.<br />

Exjobbet har ut<strong>för</strong>ts i samarbete med Jonna Olsson, som har stått <strong>för</strong><br />

MDI-delen <strong>av</strong> detta projekt. Hon har varit ansvarig <strong>för</strong> att ut<strong>för</strong>a användartester<br />

och utforma gränssnitt med hjälp <strong>av</strong> participatory design-metoden.<br />

Hon har varit en mycket viktig hjälp med att se <strong>till</strong> att applikationen blivit<br />

praktiskt användbar <strong>för</strong> slutanvändare.<br />

Uppdragsgivare <strong>för</strong> projektet är Ola Persson, frilansare som arbetar med<br />

animation och illustration i 2D och 3D. Ola arbetar bland annat <strong>för</strong> webbyråer<br />

och TV/film-producenter, däribland Speedway, TV4, MediTV och<br />

Kanal 5.<br />

1


1.2 Syfte<br />

Syftet med arbetet är att skapa en applikation som hjälper illustratörer och<br />

animatörer att konvertera inskannade skisser <strong>till</strong> vektorgrafik. Applikationens<br />

ändamål är att spara tid genom att enkelt och snabbt generera vektorgrafik i<br />

ett format lämpligt <strong>för</strong> vidare bearbetning. Ett sekundärt mål är att applikationen<br />

ska vara lättanvänd. Antalet parametrar och inställningsmöjligheter<br />

ska om möjligt hållas nere.<br />

1.3 Metodik<br />

Utvecklingsarbetet har skett enligt XP-metodiken (extreme programming).<br />

Den överlägset största <strong>för</strong>delen med XP har varit att vi satt upp ett schema<br />

med täta iterationer, där vi fått kontinuerlig feedback från uppdragsgivaren.<br />

Det har varit ett naturligt sätt att arbeta, eftersom det liknar hur kreativa<br />

människor som t.ex. vår uppdragsgivare arbetar. Det har också gjort det<br />

lättare <strong>för</strong> oss att fokusera på det problem som har varit viktigast <strong>för</strong> stunden,<br />

och undvika att sväva ut på tekniska stickspår som kanske inte varit så viktiga<br />

<strong>för</strong> slutresultatet.<br />

Utvecklingen <strong>av</strong> applikationen har skett i Visual Studio, MFC och C++.<br />

Tanken har från början varit att hålla isär gränssnitt och bildbehandling, så<br />

att applikationen ska gå att portera mellan olika plattformar.<br />

1.4 Avgränsning<br />

Projektet är <strong>av</strong>gränsat <strong>till</strong> att understödja vektorisering <strong>av</strong> inskannade skisser.<br />

En mycket tydlig <strong>av</strong>gränsning är att programmet inte ämnar att vara<br />

en generell konverterare, utan att det ska möta just de specifika kr<strong>av</strong> som<br />

illustratörer och animatörer har. Samtidigt är det värt att understryka att<br />

applikationen inte är ämnad att växa ut <strong>till</strong> att bli en fullfjädrad animationsstudio.<br />

En ytterligare <strong>av</strong>gränsning följer <strong>av</strong> att projektet ut<strong>för</strong>s inom ramen <strong>för</strong><br />

ett examensarbete på 20 poäng. På grund <strong>av</strong> tidsbegränsningen detta innebär,<br />

är det rimligt att anta att applikationen främst kommer ge en fingervisning<br />

om vilka möjligheter som finns inom området. Kanske kan den också<br />

fungera som prototyp <strong>för</strong> fortsatt arbete med en mer komplett applikation.<br />

2


1.5 Rapportens struktur<br />

Rapporten inleds med en överblick över vektorisering: inom vilka områden<br />

vektorisering spelar en betydande roll, samt vad det finns <strong>för</strong> särskilda aspekter<br />

att tänka på när man ska göra en vektoriserare <strong>för</strong> illustratörer.<br />

I kapitlet ”Teori” följer en översikt över vissa termer inom datorgrafik och<br />

bildbehandling som jag tror kan vara nödvändiga <strong>för</strong> att kunna ta sig igenom<br />

resten <strong>av</strong> rapporten.<br />

I kapitlet ”Lösning” följer redogörelsen <strong>för</strong> min lösning, med betoning på<br />

de bildanalys- och vektor-algoritmer jag har använt. För en redogörelse <strong>för</strong><br />

utformningen <strong>av</strong> användargränssnittet måste jag hänvisa <strong>till</strong> Olsson (2005).<br />

Kapitlet ”Resultat och diskussion”innehåller en redogörelse <strong>för</strong> de resultat<br />

som uppnåtts, samt en sammanfattning <strong>av</strong> de slutsatser jag tycker man kan<br />

dra utifrån detta arbete.<br />

Slutligen presenterar jag i kapitlet ”Förslag <strong>för</strong> vidareutveckling” några<br />

idéer <strong>för</strong> hur man kan vidareutveckla de metoder som presenteras här.<br />

Så långt som möjligt har jag <strong>för</strong>sökt översätta de engelska uttryck som<br />

<strong>för</strong>ekommer inom ämnesområdet <strong>till</strong> passande svenska uttryck. Ibland har<br />

detta inte varit möjligt, då det inte finns bra svenska översättningar som har<br />

samma precisa innebörd som den engelska benämningen. I dessa fall har jag<br />

valt att behålla det engelska uttrycket, alternativt att ge både den svenska<br />

och engelska termen.<br />

3


Kapitel 2<br />

En introduktion <strong>till</strong><br />

vektorisering<br />

2.1 Vad är vektorisering?<br />

I datorgrafikens värld är vektorisering liktydigt med konvertering från rastergrafik<br />

<strong>till</strong> vektorgrafik. 1 Ett annat uttryck <strong>för</strong> vektorisering är raster- <strong>till</strong><br />

vektor-konvertering.<br />

Rastergrafik beskriver en bild genom att den delas upp i ett rutnät. Varje<br />

ruta <strong>till</strong>delas ett värde som kan beskriva t.ex. intensitet. Dessa rutor brukar<br />

kallas bildpunkter eller pixlar. Rasterdata får man vid t.ex. skanning och<br />

fotografering med digitalkamera. Eftersom en <strong>rasterbild</strong> måste lagras med<br />

information om varje pixel så kräver de generellt sett stort lagringsutrymme.<br />

När den geometriska upplösningen dubblas kommer datamängden fyradubblas,<br />

eftersom antalet pixlar dubblas både horisontellt och vertikalt.<br />

Vektorgrafik representerar bilder med olika geometriska mönster, som linjer,<br />

ytor och kurvor. Fördelen med vektorgrafik jäm<strong>för</strong>t med rastergrafik är<br />

att <strong>vektorbild</strong>er är mer resurssnåla, och att de lämpar sig mycket bättre <strong>för</strong><br />

vidare bearbetning. Vektorbilder kan enkelt roteras, skalas om, osv., utan<br />

någon kvalitets<strong>för</strong>lust. Jäm<strong>för</strong>t med rastergrafik är det ett mycket lämpligt<br />

format <strong>för</strong> t.ex. ingenjörer och illustratörer att arbeta i.<br />

1 Utan<strong>för</strong> datorgrafikens värld är autovektorisering en sorts processorberoende optimeringsteknik<br />

som härstammar från superdatorer. Det är dock inte vad detta projekt handlar<br />

om.<br />

4


2.2 Olika typer <strong>av</strong> vektorisering<br />

Man kan dela upp olika vektoriseringsmetoder efter dess grad <strong>av</strong> automatisering.<br />

Automatisk vektorisering är när ett datorprogram vektoriserar <strong>rasterbild</strong>er<br />

helt automatiskt, utan påverkan <strong>av</strong> användare.<br />

Halvautomatisk vektorisering är när ett datorprogram kan vektorisera<br />

<strong>rasterbild</strong>er, men kräver ett visst understöd från användaren. Det kan<br />

röra sig om att användaren markerar start- och ändpunkt på en linje,<br />

och programmet sedan vektoriserar linjen automatiskt.<br />

Manuell vektorisering kan ske t.ex. med hjälp <strong>av</strong> <strong>till</strong> exempel ett digitalt<br />

ritbord eller mus.<br />

Vilken variant man väljer är helt beroende <strong>av</strong> <strong>till</strong>ämpning. Manuell vektorisering<br />

har givetvis högst noggrannhet, men också det som är mest kostsamt<br />

i termer <strong>av</strong> arbetsinsats. Helautomatisk vektorisering kräver ingen översyn<br />

men ger ett mindre <strong>till</strong><strong>för</strong>litligt resultat.<br />

Denna applikation kommer ligga någonstans mellan automatisk och halvautomatisk<br />

vektorisering. Idealet är att vektoriseringen ska ske automatiskt,<br />

men ibland kommer användaren vilja ändra inställningar.<br />

2.3 Användning i näringsliv och forskning<br />

Vilka områden inom datalogin använder redan idag vektorisering, eller närliggande<br />

metoder?<br />

2.3.1 Computer-Aided Design<br />

Computer-Aided Design (CAD) innehåller en bred uppsjö <strong>av</strong> datorbaserade<br />

verktyg som syftar <strong>till</strong> att stödja bland annat ingenjörer och arkitekter i arbetet<br />

med teknisk design. Detta område är själva vaggan <strong>för</strong> all vektorgrafik<br />

(läs mer om detta i kapitel 3.3). Vektorisering används här <strong>för</strong> att konvertera<br />

skisser och riktningar på fysiskt papper <strong>till</strong> digital form. Graden <strong>av</strong> automatisering<br />

beror på <strong>till</strong>ämpning.<br />

2.3.2 Geographic Information Systems<br />

Geographic Information Systems (GIS) är datorsystem genom vilka man kan<br />

hantera geografisk information. Enkelt uttryckt kan man säga att det är en<br />

5


smart digital karta. Ett populärt exempel på GIS är Google Earth. Tekniken<br />

används även inom lantmäteri, projektering <strong>för</strong> infrastruktur etc.<br />

Vektorisering är mycket viktigt inom GIS. Dels i fallet då man vill digitalisera<br />

en befintlig pappersbaserad karta, dels i fallet då man vill konvertera<br />

en satellitbild <strong>till</strong> något mer hanterligt format.<br />

Även med stöd <strong>av</strong> en automatisk vektoriserare, är det <strong>till</strong> stor del ett<br />

manuellt arbete att digitalisera kartor. Detta eftersom det kan finnas många<br />

olika sorters information i varje kartbild: vägar, konturer, gränser, och så<br />

vidare. Varje sorts information bör hanteras separat och delas upp i olika<br />

lager, något som kräver ett visst mått <strong>av</strong> intelligens. Mjukvaruverktygen blir<br />

dock allt mer sofistikerade, och övertar allt större delar <strong>av</strong> denna tidskrävande<br />

process (Eastern Region Geography, 2006).<br />

2.3.3 Optical Character Recognition<br />

Optical Character Recognition (OCR), handlar om datorstyrd inläsning och<br />

digitalisering <strong>av</strong> text. Det vanligaste <strong>till</strong>ämpningsområdet är att konvertera<br />

skannad text i rastergrafikformat <strong>till</strong> ren digital text, representerat i t.ex.<br />

ASCII eller Unicode. Indatatexten kan beroende på <strong>till</strong>ämpning antingen<br />

vara maskinskriven eller handskriven.<br />

OCR är ett forskningsområde med en gedigen historia. De <strong>för</strong>sta <strong>för</strong>söken<br />

att känna igen bokstäver automatiskt gjordes redan <strong>för</strong>e andra världskriget,<br />

och på 1950-talet började forskningen ta fart på allvar. På den tiden <strong>för</strong>litade<br />

man sig på specialutvecklad optik och mekaniska lösningar. Nu <strong>för</strong> tiden är<br />

det självklart att OCR sker digitalt, tack vare utvecklingen inom skanner- och<br />

datorteknik. Dagens utmaning ligger ofta i att välja och implementera redan<br />

befintliga metoder på bästa sätt, snarare än att utveckla nya (Association<br />

for Automatic Identification and Mobility, 2006).<br />

På grund <strong>av</strong> ibland stora datamängder, är automatisk vektorisering ofta<br />

ett kr<strong>av</strong>. Exempel kan vara Postens maskiner som automatiskt läser adresser<br />

<strong>för</strong> brev, eller CSN:s automatiska inläsning <strong>av</strong> blanketter. Ett annat aktuellt<br />

fall där man behöver ta hjälp <strong>av</strong> OCR, är kamerorna som läser <strong>av</strong> passerande<br />

bilar vid Stockholms vägtullar.<br />

2.3.4 Illustration och animation<br />

Det är inte bara inom ingenjörsmässiga områden som vektorisering kan komma<br />

<strong>till</strong> användning. Även inom kreativa områden som illustration, animation,<br />

arkitektur och typsnitts<strong>till</strong>verkning används vektorgrafik <strong>av</strong> många i det vardagliga<br />

arbetet.<br />

6


(a) Originalbild.<br />

(b) Vektorisering med konturlinjer.<br />

(c) Vektorisering med mittlinje.<br />

Figur 2.1: Jäm<strong>för</strong>else <strong>av</strong> mittlinjes- och konturlinjes-vektorisering.<br />

Man skulle kunna tro att nya hjälpmedel som digitala ritbräden leder<br />

<strong>till</strong> att arbetsprocessen nu går mot att bli digital från början <strong>till</strong> slut. Men<br />

något som visat sig vid intervjuer vi har gjort med fackmän, är att de allra<br />

flesta illustratörer fortfarande ritar skisser traditionellt, med papper och<br />

penna (Olsson, 2005). Dessa skisser skannas eller fotograferas sedan, <strong>för</strong> att<br />

ofta vektoriseras manuellt i datorn. Denna manuella vektorisering är både<br />

tidskrävande och enahanda.<br />

2.4 Översikt över befintliga vektoriserare<br />

Orsaken <strong>till</strong> att illustratörer vektoriserar sina skisser manuellt är inte att det<br />

saknas automatiska vektoriserare <strong>till</strong> hemdatorer. Tvärtom finns det redan<br />

ett antal befintliga verktyg <strong>för</strong> vektorisering. Hur kommer det sig att de inte<br />

används?<br />

I min studie har jag hittat ett antal vektoriserare som är <strong>till</strong> <strong>för</strong> att konvertera<br />

tekniska ritningar och kartor. Främsta skälet <strong>till</strong> att de inte är användbara<br />

<strong>för</strong> vårt syfte är att de enbart konverterar <strong>till</strong> räta linjer eller perfekta<br />

matematiska bågar.<br />

Det finns även vektoriserare som har ett mer generellt syfte, att återskapa<br />

originalbilden så bra som möjligt, fast i vektorformat. Syftet med detta är<br />

att vinna <strong>vektorbild</strong>ernas största <strong>för</strong>delar, dvs. att kunna skala och rotera<br />

bilden utan <strong>för</strong>lust, och att spara lagringsutrymme. Vektorbilderna som dessa<br />

vektoriserare genererar blir också ofta mycket lika originalet.<br />

Tyvärr är de bilder som generella vektoriserare skapar från skisser ofta<br />

inte lämpade <strong>för</strong> vidare bearbetning. Skälet <strong>till</strong> detta är att de flesta generella<br />

vektoriserare enbart följer konturlinjer, och inte mittlinjer [figur 2.1].<br />

Detta leder <strong>till</strong> att linjer blir representerade som fyllda ytor snarare än rena<br />

7


linjer, något som <strong>för</strong>hindrar illustratörer från att arbeta vidare med skisserna<br />

i datorn på ett effektivt sätt. Samma sak gäller <strong>för</strong> vektoriserare som är<br />

specialiserade <strong>för</strong> typsnittskonvertering.<br />

Det finns även ett fåtal generella vektoriserare som detekterar mittlinjer.<br />

Under våra efterforskningar lyckades vi bara hitta en som var allmänt känt<br />

och använt <strong>av</strong> illustratörer, Adobe Streamline. Programmet g<strong>av</strong> enligt oss ett<br />

mediokert resultat, var <strong>för</strong>åldrat och lämnat utan underhåll <strong>av</strong> <strong>till</strong>verkaren.<br />

2.5 Speciella behov hos illustratörer<br />

Vad är det som skiljer illustratörers vektoriseringsbehov från ingenjörer som<br />

arbetar med CAD?<br />

2.5.1 Estetik<br />

En mycket tydlig skillnad är att estetik blir viktigt på ett helt annat sätt.<br />

Uppdragsgivaren ville understryka vikten <strong>av</strong> matematik:<br />

– Ju mer matematik det är i en linje, desto mer känsla blir det i<br />

den!<br />

Idealet är att en linje beskrivs <strong>av</strong> en ren bezierkurva.<br />

Visserligen är det även i CAD viktigt att en linje blir matematiskt korrekt.<br />

Men där är syftet helt annorlunda. Fokus i CAD ligger på att autodetektera<br />

räta linjer, cirklar och bågar, medan det <strong>för</strong> illustratören mer handlar om att<br />

renodla en frihandsritad linje så långt det är matematiskt möjligt, i syftet<br />

att framhäva känslan i linjen.<br />

2.5.2 Inmaterial<br />

En annan skillnad är typen <strong>av</strong> inmaterial. I fallet med CAD är det ofta så<br />

att ritningar är mycket noggrant och tydligt renritade. Med verkliga skisser<br />

är linjer lite smutsiga, linjeintensitet kan variera mellan olika partier <strong>av</strong> bilder,<br />

linjer kan ha suddats ut och ritats dit igen, kladd på papperet, o.s.v.<br />

Visserligen går det alltid att renrita även skisser. Men det är en stor tidsvinst<br />

<strong>för</strong> illustratören om skisser inte behöver renritas särskilt noggrant, utan<br />

även lite smutsigare bilder kan godtas. (Se figur 2.2 <strong>för</strong> jäm<strong>för</strong>else mellan en<br />

blyertsskiss och en renritad tuschbild.)<br />

8


(a) Grov skiss.<br />

(b) Renritad skiss.<br />

Figur 2.2: Jäm<strong>för</strong>else mellan blyertsskiss och tuschat slutresultat.<br />

9


2.5.3 Maner<br />

Ett ord som ofta dök upp i intervjuer med illustratörer, var maner. Denna<br />

term <strong>av</strong>ser en konstnärs typiska särdrag vad gäller teknik och stil. I diskussioner<br />

tog illustratörer ofta upp hur man kan använda funktioner i datorprogram<br />

<strong>för</strong> att uppnå ett visst maner. Det är tydligt att många illustratörer<br />

idag använder illustrations- och bildbehandlingsprogram på kreativa sätt,<br />

som kanske skiljer sig från de ursprungliga tekniska ändamålen.<br />

Diskussionen om maner understryker hur <strong>för</strong>hållningssättet <strong>till</strong> ämnet<br />

skiljer sig mellan ingenjörer och illustratörer. För ingenjörer är noggrannhet<br />

och objektiv trogenhet <strong>till</strong> originalet det viktigaste, medan illustratörers verk<br />

främst bedöms subjektivt efter dess konstnärliga och estetiska uttryck. Detta<br />

är givetvis något som påverkar vilka kvalitéer som bör prioriteras hos en<br />

vektoriserare <strong>för</strong> illustratörer. Till viss del bör man t.ex. hålla öppet <strong>för</strong> att<br />

applikationen i slutändan kanske kommer användas <strong>till</strong> fler ändamål än vad<br />

som från början är tänkt.<br />

2.5.4 Gränssnitt<br />

Ytterligare något som särskiljer illustratörer, är hur applikationens gränssnitt<br />

bör utformas. Man får inte glömma bort att grundsyftet med applikationen är<br />

att spara tid. En stressad illustratör kanske inte har mer än fem, tio minuter<br />

att lägga på att testa ut ett nytt program <strong>av</strong> den här typen. Gränssnittet bör<br />

där<strong>för</strong> vara enkelt och lätt<strong>för</strong>ståeligt, och allra helst ska applikationen ge ett<br />

gott resultat utan att användaren behöver ändra några inställningar i detalj.<br />

En konsekvens <strong>av</strong> detta blir att man bör välja algoritmer som inte kräver en<br />

mängd manuella inställningar och kalibreringar från användarens sida.<br />

10


Kapitel 3<br />

Teori<br />

I detta kapitel går jag igenom olika teorier som är centrala <strong>för</strong> projektet.<br />

Binärisering (3.1) innefattar konvertering från gråskalebild <strong>till</strong> svart-vit bild,<br />

något som underlättar vidare behandling. Vektorisering (3.2) innefattar själva<br />

konverteringen från raster- <strong>till</strong> <strong>vektorbild</strong>. För att slutresultatet ska bli<br />

användbart, vill vi även konvertera vektorlinjerna <strong>till</strong> estetiskt <strong>till</strong>talande<br />

bezierkurvor (3.3). Slutresultatet sparas sedan i PostScript-format (3.4).<br />

3.1 Binärisering<br />

Binärisering, ofta även kallat tröskling, är en grundläggande och mycket ofta<br />

använd operation inom datorseende och digital bildbehandling. I typfallet<br />

utgår man ifrån en gråskalebild som man vill konvertera <strong>till</strong> en binär (svartvit)<br />

bild. Syftet är att intensitetsnivån ska representera om pixeln är en del<br />

<strong>av</strong> ett sökt objekt eller ej. I vårt fall vill vi ut<strong>för</strong>a binärisering <strong>för</strong> att särskilja<br />

bakgrunden (papperet) från de linjer som ingår i skissen. 1<br />

Att ut<strong>för</strong>a själva binäriseringen utifrån ett givet tröskelvärde är trivialt;<br />

om en pixels intensitet ligger under tröskelvärdet räknas det som en objektpixel.<br />

Att automatiskt hitta lämpliga tröskelvärden <strong>för</strong> intensiteten är<br />

betydligt svårare. På grund <strong>av</strong> problemets vikt, har ämnet studerats i decennier<br />

och ett stort antal metoder har <strong>för</strong>eslagits. Eftersom problemet har<br />

studerats så länge, kan man tycka att det redan nu borde finnas en passande<br />

lösning <strong>för</strong> varje tänkbart område. I praktiken dyker dock problem <strong>av</strong> nya ka-<br />

1 För klarhetens skull bör nämnas att tröskling och binärisering inte är synonyma begrepp.<br />

Tröskling är ett allmänt begrepp som syftar på att dela upp bilden i ett antal<br />

segment utifrån olika tröskelvärden. Vid binärisering vill man dela upp bilden i exakt två<br />

segment, varken mer eller mindre.<br />

11


aktärer upp regelbundet, och utmaningen i att automatiskt hitta passande<br />

tröskelvärden är fortfarande aktuell (Drobchenko m.fl., 2005).<br />

Sezgin och Sankur (2004) presenterar en uttömmande överblick, kategorisering<br />

och kvalitativ jäm<strong>för</strong>else mellan olika binäriseringsmetoder. Metoderna<br />

kategoriseras där i sex grupper efter vilka typer <strong>av</strong> information de utnyttjar.<br />

Histogramformsbaserade metoder utgår från egenskaper i histogrammets<br />

form, såsom toppar, dalar och krökningar. Om histogrammet exempelvis<br />

har två toppar och en dal emellan dem, bör tröskelvärdet ligga<br />

i dalen.<br />

Klusterbaserade metoder antar att histogramnivåerna kan delas upp i<br />

två separata kluster, alternativt modelleras som en blandning <strong>av</strong> två<br />

normal<strong>för</strong>delningar. Någon statistisk metod används sedan <strong>för</strong> att hitta<br />

ett lämpligt tröskelvärde. Otsus metod är ett klassiskt exempel (se<br />

3.1.1).<br />

Entropibaserade metoder liknar ofta klusterbaserade metoder, men utgår<br />

från histogrammets entropi snarare än att anta att det kan delas<br />

upp i kluster. En tolkning är att maximering <strong>av</strong> entropin också maximerar<br />

graden <strong>av</strong> informationsöver<strong>för</strong>ing.<br />

Objekt-attribut-baserade metoder söker likheter mellan originalet och<br />

den trösklade bilden. En metod är att genom<strong>för</strong>a kantdetektion på originalet<br />

och den trösklade bilden, och därefter undersöka om kanterna<br />

hamnar på samma ställe.<br />

Spatiala metoder utnyttjar, <strong>för</strong>utom histogramnivåer, även beroenden mellan<br />

närliggande pixlar. Ett enkelt exempel är att utnyttja att en pixel<br />

sannolikt <strong>till</strong>hör samma segment som dess grannar.<br />

Lokalt adaptiva metoder skiljer sig från tidigare nämnda metoder genom<br />

att inte sätta något globalt tröskelvärde som gäller <strong>för</strong> hela bilden.<br />

Istället beräknas ett separat tröskelvärde <strong>för</strong> varje pixel. Detta kan<br />

vara nödvändigt om intensiteten varierar mellan olika delar <strong>av</strong> bilden.<br />

Globala metoder kan ofta anpassas <strong>till</strong> att bli lokalt adaptiva, t.ex.<br />

genom att ut<strong>för</strong>a dem i ett lokalt fönster.<br />

Inom mitt arbete har jag bekantat mig närmare med följande binäriseringsalgoritmer:<br />

Otsu-metoden, Kittler och Illingworth-metoden samt lokal<br />

kontrast-metoden. Otsus samt Kittler och Illingworths metoder <strong>till</strong>hör gruppen<br />

klusterbaserade binäriserare, medan lokal kontrast-metoden är en enkel<br />

lokal adaptiv metod. För att ge ett exempel <strong>för</strong> respektive grupp vill jag här<br />

presentera Otsu-metoden samt lokal kontrast-metoden.<br />

12


3.1.1 Otsu-binärisering<br />

Otsus metod är en klusterbaserad trösklingsmetod som bygger på att man<br />

minimerar den viktade summan <strong>av</strong> inom-klass-variansen hos objekt- respektive<br />

bakgrunds-pixlar (Otsu, 1979). Metoden ger bra resultat när antalet<br />

pixlar i respektive klass ligger nära varandra.<br />

Otsus metod är en <strong>av</strong> de mest använda och refererade trösklingsmetoderna.<br />

Den är mycket robust, och ger goda resultat <strong>för</strong> de flesta typer <strong>av</strong><br />

indata. Ibland misslyckas den dock med att hitta ett lämpligt tröskelvärde<br />

om antalet objektpixlar understiger 5% <strong>av</strong> den totala bilden (Drobchenko<br />

m.fl., 2005).<br />

Inom-klass-variansen definieras som den viktade summan <strong>av</strong> respektive<br />

klusters varians:<br />

där<br />

σ 2 Inom(T ) = n B (T )σ 2 B(T ) + n O (T )σ 2 O(T ) (3.1)<br />

∑T −1<br />

n B (T ) = p(i) (3.2)<br />

i=0<br />

N−1<br />

∑<br />

n O (T ) = p(i) (3.3)<br />

i=T<br />

σ 2 B(T ) = variansen <strong>av</strong> bakgrundspixlarna (under tröskelvärdet) (3.4)<br />

σ 2 O(T ) = variansen <strong>av</strong> objektpixlarna (över tröskelvärdet) (3.5)<br />

och [0, N − 1] är mängden intensitetsnivåer (i vårt fall, 256).<br />

3.1.2 Lokal kontrast-metoden<br />

Vid lokal adaptiv tröskling sätter man en lokal tröskelnivå <strong>för</strong> varje enskild<br />

pixel. En enkel variant, lokal kontrast-metoden, är att <strong>för</strong> varje pixel använda<br />

ett fönster <strong>av</strong> storlek b×b ur vilket man räknar fram medelvärdet mean. Det<br />

lokala tröskelvärdet sätts <strong>till</strong> (mean−C). För ett lågt värde på C riskerar man<br />

att få mycket brus i bilden, eftersom även låga <strong>av</strong>vikelser från bakgrunden<br />

detekteras som en objektpixel. Ju högre värde på C, desto färre objektpixlar<br />

kommer detekteras (Sezgin och Sankur, 2004).<br />

13


3.2 Vektorisering<br />

Vektorisering är konsten att konvertera en <strong>rasterbild</strong> <strong>till</strong> motsvarande <strong>vektorbild</strong>.<br />

Här tar jag främst upp metoder som fokuserar på att vektorisera binära<br />

<strong>rasterbild</strong>er, med tyngdpunkt på CAD-ritningar, OCR eller handtecknade<br />

objekt.<br />

Liu och Dori (1999) presenterar en bred genomgång över vektoriseringsalgoritmer<br />

<strong>för</strong> binära dokumentbilder. Algoritmerna delas in i sex grupper:<br />

Hough Transform-baserade, <strong>för</strong>tunningsbaserade, konturbaserade, rungraph-baserade,<br />

rutnätsbaserade och sparse-pixel-baserade.<br />

Hough Transform-vektorisering<br />

Hough Transform-vektorisering kan hitta geometriska mönster genom att bilden<br />

transformeras <strong>till</strong> en ny parameterrymd. Resultatet <strong>av</strong> transformen blir<br />

att de sökta mönstren framträder som en enskild punkt i den nya parameterrymden.<br />

Ett exempel är detektion <strong>av</strong> raka linjer. Man kan anta att linjerna är<br />

parametriserade i formen ρ = x cos θ + y sin θ, där ρ är <strong>av</strong>ståndet från origo<br />

och θ är vinkeln från normalen. Man kan då transformera från (x, y)-rymden<br />

<strong>till</strong> (ρ, θ)-rymden, där linjerna framstår som punkter.<br />

Eftersom metoden främst lämpar sig <strong>för</strong> rena geometriska former är den<br />

inte användbar <strong>för</strong> det här projektet.<br />

Förtunningsbaserad vektorisering<br />

Förtunningsbaserade algoritmer är troligen den mest beprövade och använda<br />

gruppen <strong>av</strong> vektoriseringsalgoritmer.<br />

Förtunning (även känt som skelettisering) är konsten att reducera ett<br />

<strong>för</strong>grundsobjekt i en binär bild <strong>till</strong> ett skelett, som i stort representerar ursprungsobjektets<br />

form. Vid <strong>för</strong>tunning utsätter man objektet <strong>för</strong> en iterativ<br />

erosion där <strong>för</strong>grunden skalas bort gradvis från kanterna <strong>till</strong>s bara en pixel<br />

återstår. Resultatet blir att ett en pixel brett skelett bildas i mitten <strong>av</strong> det ursprungliga<br />

objektet, med objektets ursprungliga topologi och form (Figur 3.1,<br />

3.2; Fisher m.fl. (1994)).<br />

Ett problem med klassisk iterativ <strong>för</strong>tunning kan vara tidsåtgången, som<br />

är kubisk i <strong>för</strong>hållande <strong>till</strong> upplösningen på bilden. Vid klassisk iterativ <strong>för</strong>tunning<br />

<strong>för</strong>lorar man också information om linjebredd. Ett ännu allvarligare<br />

problem kanske är att <strong>för</strong>tunning ofta orsakar formdistortion vid <strong>för</strong>greningar,<br />

som man kan se i figur 3.3. Felet som uppstår vid bokstäverna X och T<br />

kallas ”necking”, medan felet som uppstår vid bokst<strong>av</strong>en V kallas ”tailing”.<br />

14


Figur 3.1: Förtunning <strong>av</strong> en rektangel.<br />

Figur 3.2: Förtunning <strong>av</strong> text.<br />

15


Figur 3.3: Formdistortion vid <strong>för</strong>tunning <strong>av</strong> <strong>för</strong>greningar.<br />

Att notera är att de skelett som produceras <strong>av</strong> <strong>för</strong>tunningsalgoritmer<br />

fortfarande är i rasterformat och där<strong>för</strong> behöver vektoriseras i ett senare steg<br />

genom kalkering linje <strong>för</strong> linje.<br />

En mycket noggrann genomgång <strong>av</strong> <strong>för</strong>tunning och olika algoritmer <strong>för</strong><br />

ändamålet finns i Lam m.fl. (1992). Tyvärr kan man kanske säga att det är en<br />

artikel som blivit aningen <strong>för</strong>åldrad. Ämnet <strong>för</strong>tunning är fortfarande under<br />

utveckling, och sedan 1992 har det hänt en del, fram<strong>för</strong>allt i forskningen om<br />

hur man kan parallellisera <strong>för</strong>tunning <strong>för</strong> att uppnå hastighets<strong>för</strong>bättringar.<br />

En nyare algoritm som är värd att nämnas är MB2 (Bernard och Manzanera,<br />

1999).<br />

Konturbaserad vektorisering<br />

Konturbaserad vektorisering strävar efter att vara snabbare och exaktare än<br />

<strong>för</strong>tunning. Idén är att hitta linjeobjektets konturlinjer, och därefter räkna ut<br />

mittenpunkterna genom att parallellt följa konturlinjerna på varsin sida <strong>av</strong><br />

linjen. Den här gruppen <strong>av</strong> algoritmer är i allmänhet snabbare än de <strong>för</strong>tunnande<br />

algoritmerna och har också lättare att hitta linjebredden. Det stora<br />

problemet med algoritmer <strong>av</strong> den här typen är hur man ska hantera <strong>för</strong>greningar.<br />

De är olämpliga <strong>för</strong> vektorisering <strong>av</strong> stökiga kurvor och linjer som<br />

korsar varandra, alltså är de troligen inte lämpliga <strong>för</strong> det här examensarbetet.<br />

Run-graph-baserad vektorisering<br />

Run-graph-baserad vektorisering bygger på att man konverterar bilden <strong>till</strong><br />

en ”run graph”-representation i ett <strong>för</strong>beredande steg. En run graph är en<br />

enkel vektorrepresentation som delar upp bilden i horisontella och vertikala<br />

16


linjer. Ett ”run” är antingen vertikalt eller horisontellt, och representerar den<br />

maximala sekvensen <strong>av</strong> svarta pixlar i den riktningen. Ett run kan definieras<br />

med riktning, startpunkt och längd.<br />

Run-graph-baserad vektorisering är ofta snabbare än <strong>för</strong>tunnande, men<br />

är bäst lämpad <strong>till</strong> att vektorisera raka linjer och där<strong>för</strong> kanske inte helt<br />

lämpad <strong>till</strong> det här projektet.<br />

Rutnätsbaserad vektorisering<br />

Rutnätsbaserade metoder syftar på att dela upp hela bilden i ett rutnät och<br />

att detektera mönster enbart genom att titta efter svarta pixlar i rutornas<br />

skärning. Metoden är främst ämnad att vektorisera bilder på t.ex. logiska<br />

diagram, och är inte lämpad att hantera frihandslinjer.<br />

Sparse-pixel-vektorisering<br />

Sparse-pixel-vektorisering (SPV) syftar på att alla pixlar inte undersöks vid<br />

vektoriseringen. Algoritmen följer enbart en en pixel bred linje inuti <strong>för</strong>grundsarean.<br />

Inte ens varje pixel inom den linjen undersöks, utan algoritmen stegar<br />

dessutom fram med en variabel steglängd. På grund <strong>av</strong> att relativt få pixlar<br />

måste undersökas blir algoritmen också snabb. Eftersom steglängden kan<br />

varieras, har algoritmen också en möjlighet att stega över <strong>för</strong>greningar.<br />

Något som talar emot algoritmen, är att <strong>för</strong>fattarna själva menar att<br />

den inte är helt robust och kräver en del efterbearbetning. Speciellt kan det<br />

bli problem vid kanter och <strong>för</strong>greningar, att det blir vissa glapp mellan de<br />

olika vektorerna. Tombre m.fl. (2000) rapporterar även att SPV tenderar att<br />

detektera falska <strong>för</strong>greningar och dubbellinjer.<br />

En undersökning om hur man lämpligast väljer parametrar <strong>till</strong> SPV finns<br />

i Wenyin m.fl. (1999).<br />

3.2.1 Att <strong>för</strong>tunna eller ej<br />

Tombre och Tabbone (2000) jäm<strong>för</strong> <strong>för</strong>tunnande och konturföljande vektorisering.<br />

Det som talar <strong>för</strong> <strong>för</strong>tunnande algoritmer är att de är bevisat robusta<br />

och precisa, medan det som talar emot dem är att linjeändar och <strong>för</strong>greningar<br />

kan bli <strong>för</strong>vridna. Slutsatsen är att konturföljning är det bättre alternativet<br />

i de fall man på <strong>för</strong>hand har god kännedom om indata, men att man<br />

generellt hellre bör använda <strong>för</strong>tunning och hantera de <strong>för</strong>vanskningar som<br />

uppstår med efterbehandling. I deras mening är den mest lovande idén att introducera<br />

modeller <strong>av</strong> ”ideala” <strong>för</strong>greningar (T-<strong>för</strong>greningar, L-<strong>för</strong>greningar,<br />

X-<strong>för</strong>greningar, Y-<strong>för</strong>greningar, . . . ) och <strong>för</strong> varje <strong>för</strong>grening se om det går<br />

17


att applicera någon <strong>av</strong> ideal<strong>för</strong>greningarna. Samma åsikt uttrycks i Tombre<br />

m.fl. (2000).<br />

3.3 Bezierkurvor<br />

3.3.1 Historik<br />

Bezierkurvan är en ekvation som har en mängd användningsområden, bland<br />

annat inom datorgrafik. Ekvationen utvecklades på oberoende håll; under<br />

1959 <strong>av</strong> P. de Casteljau, och 1962 <strong>av</strong> Pierre Beziér, som var anställd på<br />

Renaults CAD/CAM-<strong>av</strong>delning (Watt, 2000; Schneider, 1988).<br />

3.3.2 Matematik<br />

p 0<br />

p 3<br />

p 1<br />

p 2<br />

Figur 3.4: Bezierkurva.<br />

En kubisk bezierkurva representeras <strong>av</strong> fyra punkter: en startpunkt p 0 ,<br />

en ändpunkt p 3 och två kontrollpunkter p 1 , p 2 . [Figur 3.4] Kurvan börjar i p 0<br />

och går i riktning mot p 1 , och anländer i p 3 i riktning från p 2 . Oftast kommer<br />

inte kurvan passera genom kontrollpunkterna; de är bara där <strong>för</strong> att ange<br />

riktningen. Intuitivt kan man uppfatta <strong>av</strong>ståndet mellan p 0 och p 1 som ”hur<br />

länge” kurvan rör sig mot p 1 , innan den börjar svänga <strong>av</strong> mot p 3 .<br />

Den parametriska formen <strong>av</strong> ekvationen är:<br />

B(t) = p 0 (1 − t) 3 + 3p 1 t(1 − t) 2 + 3p 2 t 2 (1 − t) + p 3 t 3 , t ∈ [0, 1] (3.6)<br />

Kurvan lämnar p 0 vid t = 0, och anländer i p 3 vid t = 1.<br />

18


3.3.3 Användningsområden<br />

Bezierkurvor används inom en bred mängd områden. Relevant <strong>för</strong> den här<br />

rapporten är att de är grundläggande <strong>för</strong> den utritningsmodell som används<br />

i Adobe PostScript. Bezierkurvor är också standard i formgivningsprogram<br />

som Adobe Illustrator, Macromedia Freehand och Fontographer, samt en<br />

mängd vanliga 3D-program.<br />

Bezierkurvor är inte det enda sättet att skapa vackra vektorformer. Hur<br />

kommer det sig att just den har blivit så populär? Några <strong>av</strong> dess främsta<br />

meriter är att den underliggande matematiken är enkel, samt att kopplingen<br />

mellan de fyra styrpunkterna och den resulterande kurvan är intuitiv även<br />

<strong>för</strong> personer utan matematiska kunskaper. I praktiken är bezierkurvor ett<br />

smidigt men också kraftfullt verktyg, som ger utmärkt kontroll över kurvans<br />

dynamik.<br />

3.3.4 Från polylinje <strong>till</strong> bezierkurva<br />

Samtliga vektoriseringsalgoritmer jag tidigare nämnt genererar polylinjer. I<br />

det här examensarbetet är det även ett kr<strong>av</strong> från uppdragsgivaren att linjerna<br />

ska renodlas och konverteras <strong>till</strong> bezierkurvor. Skälet är att bezierkurvor både<br />

är vackrare och enklare att bearbeta manuellt än polylinjer.<br />

Det finns vissa generella problem med att konvertera polylinjer <strong>till</strong> bezierkurvor.<br />

Ett problem är att det ofta inte räcker med en bezierkurva <strong>för</strong> att<br />

representera en polylinje, på grund <strong>av</strong> naturliga begränsningar hos bezierkurvor.<br />

Det är t.ex. omöjligt att passa in bezierkurvor <strong>till</strong> polylinjer som innehåller<br />

hörn eller har fler än två böjningar (Shao och Zhou, 1996). Där<strong>för</strong> måste<br />

man kunna använda delvis approximation, där en linje kan representeras <strong>av</strong><br />

flera bezierkurvor som är kopplade <strong>till</strong> varandra. För att linjen fortfarande<br />

ska se jämn ut, är det viktigt att se <strong>till</strong> att tangenterna vid de skarvpunkter<br />

där bezierkurvor möts är riktade från varandra (Schneider, 1988).<br />

Schneiders algoritm<br />

Schneider (1988) presenterar en adaptiv algoritm <strong>för</strong> att passa in bezierkurvor<br />

<strong>till</strong> polylinjer. Algoritmen genererar en initial inpassning som sedan<br />

gradvis <strong>för</strong>bättras genom iteration. Inpassningen sker inom en felmarginal<br />

som specifieras <strong>av</strong> användaren. Denna algoritm är något <strong>av</strong> en klassisk numerisk<br />

standardalgoritm som ofta blir refererad <strong>till</strong>. Den finns också flera<br />

färdiga implementationer <strong>till</strong>gängliga under GPL.<br />

I sammanfattning fungerar Schneiders algoritm såhär: användaren anger<br />

ett tröskelvärde <strong>för</strong> hur stora <strong>av</strong>vikelser som kan tolereras från den ursprung-<br />

19


liga polylinjen. Man börjar från ena änden <strong>av</strong> polylinjen, och <strong>för</strong>söker gradvis<br />

passa in längre och längre bezierkurvor. När tröskelvärdet överskrids, delas<br />

polylinjen <strong>av</strong> och man fortsätter med en ny bezierkurva.<br />

Ett lågt tröskelvärde leder garanterat <strong>till</strong> en hög detaljnoggrannhet, men<br />

kan också innebära en överdriven användning <strong>av</strong> bezierkurvor. I vårt fall vill<br />

vi representera bilden med så få bezierkurvor som möjligt, utan att bildens<br />

betydelse går <strong>för</strong>lorad. (Se gärna diskussionen om estetik i kapitel 2.5.1.)<br />

Shaos och Zhous algoritm<br />

Shao och Zhou (1996) introducerar en metod som liknar Schneiders. Den sker<br />

i två steg; det <strong>för</strong>sta identifierar signifikanta punkter från polylinjen, och det<br />

andra genom<strong>för</strong> kurvinpassning med en iterativ viktad minsta-kvadratenmetod.<br />

Enligt <strong>för</strong>fattarnas utsago är algoritmen mycket pålitlig och robust.<br />

Algoritmen fäster särskild vikt vid att hitta lämpliga skarvpunkter och hörnpunkter,<br />

på ett mer genomtänkt sätt än Schneiders metod. Detta leder också<br />

<strong>till</strong> ett slutresultat som använder färre bezierkurvor. Just att få ett slutresultat<br />

med så få bezierkurvor som möjligt är som sagt eftersträvansvärt både<br />

tekniskt och estetiskt.<br />

3.4 PostScript<br />

PostScript är ett programmeringsspråk med vars hjälp man kan beskriva hur<br />

en sida ska se ut vid utskrift, antingen på en datorskärm eller på en skrivare.<br />

Det introducerades <strong>av</strong> Adobe Systems 1985. Allt i dokumenten, även typsnitt,<br />

specifieras i termer <strong>av</strong> raka linjer och kubiska bezierkurvor (Adobe, 2006).<br />

Encapsulated PostScript är ett standardformat <strong>för</strong> att importera och exportera<br />

PostScript-filer. Syftet med EPS-filer är att de ska kunna inkluderas<br />

som illustrationer i vanliga PostScript-dokument.<br />

En smärre brist med PostScript-standarden, <strong>för</strong> detta examensarbete, är<br />

att det inte finns något direkt stöd <strong>för</strong> linjer och kurvor med varierande bredd.<br />

Det gör att det i vissa fall blir svårt att uppnå ett perfekt slutresultat.<br />

En <strong>för</strong>del med formatet är att PostScript-filer är rena textfiler och där<strong>för</strong><br />

mycket enkla att generera.<br />

20


Kapitel 4<br />

Lösning<br />

Det här kapitlet redogör <strong>för</strong> applikationens algoritmer. För enkelhetens skull,<br />

presenteras de olika bildbehandlingsmetoderna i den ordning de ut<strong>för</strong>s i systemet.<br />

Förutom bildbehandling, ingick det även i uppdraget att implementera<br />

ett gränssnitt <strong>för</strong> att styra konverteringen. Gränssnittets utformning kommer<br />

inte beskrivas i detalj här. En närmare beskrivning går istället att hitta i<br />

Olsson (2005). För de otåliga finns en skärmdump i figur 4.1.<br />

Hela implementationen med källkod finns <strong>till</strong>gänglig på http://sf.net/<br />

projects/linetracer/.<br />

4.1 Desaturering<br />

Så snart en bild lästs in, konverteras den <strong>till</strong> 8-bitars gråskala <strong>för</strong> vidare<br />

hantering. <strong>Konvertering</strong>en görs på enklast tänkbara sätt: genom att ta medelvärdet<br />

<strong>av</strong> intensiteten <strong>för</strong> röd, blå och grön-komponenterna.<br />

Denna metod är egentligen inte formellt korrekt, eftersom de olika färgkomponenterna<br />

bidrar olika mycket <strong>till</strong> den upplevda intensiteten. Det spelar<br />

dock ingen roll i det här sammanhanget, eftersom vi kan anta att hela skissen<br />

är ritad med en och samma penna.<br />

4.2 Binärisering<br />

Vi vill nu omvandla vår gråskalebild <strong>till</strong> en binär (svart-vit) bild, där pixelintensiteten<br />

<strong>av</strong>gör om en pixel <strong>till</strong>hör bakgrunden eller en skissad linje.<br />

21


Figur 4.1: Gränssnittet.<br />

22


4.2.1 Global binärisering<br />

Det enklaste sättet att implementera binärisering är att sätta ett globalt tröskelvärde,<br />

och klassificiera alla pixlar med intensitet ovan detta tröskelvärde<br />

som bakgrund, och alla under som skissad linje.<br />

Jag började med att implementera Otsus metod <strong>för</strong> global tröskelvärdesdetektion.<br />

Otsu-metoden visade sig vara enkel att implementera, beräkningsmässigt<br />

snabb, och fungerade så bra som man kan <strong>för</strong>vänta sig. Jag testade<br />

även att implementera Kittler och Illingworths iterativa metod (Kittler och<br />

Illingworth, 1986). Den g<strong>av</strong> dock ingen tydlig <strong>för</strong>bättring på verkliga skisser,<br />

och då Otsu-metoden g<strong>av</strong> intryck <strong>av</strong> att vara robustare valde jag att behålla<br />

den.<br />

4.2.2 Lokalt adaptiv binärisering<br />

För vårt problem visade det sig snart att det inte är <strong>till</strong>räckligt att endast<br />

ha ett globalt tröskelvärde. I verkliga skisser är det normalt att linjer skiljer<br />

betydligt i svärta, beroende på hur mycket energi, tryck och noggrannhet<br />

tecknaren lagt i dem. Med enbart ett globalt tröskelvärde, riskerar tydliga<br />

men svaga linjer att falla under tröskelvärdet. Jag behövde där<strong>för</strong> komplettera<br />

Otsu-metoden med ytterligare en metod <strong>för</strong> att plocka upp dessa linjer.<br />

Jag valde att implementera lokal kontrast-metoden (se 3.1.2) med en fönsterstorlek<br />

<strong>av</strong> 7x7 pixlar.<br />

Att notera är att lokal kontrast-metoden här enbart används <strong>för</strong> att hitta<br />

svaga linjer som <strong>av</strong> Otsu-metoden detekterats som vita pixlar, men borde<br />

varit svarta. Någon ändring från svarta pixlar <strong>till</strong> vita sker ej.<br />

Prestandamässigt går detta steg i processen relativt långsamt, på grund<br />

<strong>av</strong> att man måste göra 49 läsaccesser per pixel. Det är troligen acceptabelt att<br />

binäriseringsprocessen tar relativt lång tid, eftersom den <strong>för</strong>hoppningsvis blir<br />

lyckad från <strong>för</strong>sta början, och därefter inte behöver göras om på grund <strong>av</strong> att<br />

användaren ändrar inställningar. För högre upplösningar och bildstorlekar<br />

riskerar dock detta beräkningssteg bli en flaskhals.<br />

4.3 Hålifyllning<br />

Vid tester på verkliga skisser, hände det ibland att de svarta streck som<br />

detekterades innehöll enstaka vita pixlar. Ofta var det på grund <strong>av</strong> dubbelstreck,<br />

att användaren gjort flera pennstreck <strong>för</strong> att rita ut en och samma<br />

linje. Vidare behandling skulle resultera i att även den slutliga <strong>vektorbild</strong>en<br />

innehöll dubbelstreck. För att bättre fånga användarens intention, implementerade<br />

jag en enkel algoritm <strong>för</strong> att omvandla dubbelstreck <strong>till</strong> enkelstreck.<br />

23


Algoritmen fyller i samtliga slutna vita ytor vars storlek är mindre än tio<br />

pixlar.<br />

I gränssnittet lade jag in ett skjutreglage med texten ”Hole Filling” <strong>för</strong><br />

att kunna ändra den maximala storleken på de ytor som ska tas bort. I<br />

användartester visar det sig dock att detta reglage sällan eller aldrig används.<br />

Antingen misstolkas texten, eller så behöver värdet inte justeras i praktiken.<br />

4.4 Generering <strong>av</strong> <strong>av</strong>ståndskarta<br />

I detta steg bygger vi en <strong>av</strong>ståndskarta (distance map) där varje värde anger<br />

<strong>av</strong>ståndet <strong>till</strong> närmsta bakgrundspixel i den binära bilden som producerats i<br />

<strong>för</strong>egående steg. Denna information kan vara användbar i kommande beräkningar<br />

(t.ex. <strong>av</strong>snitt 4.10.2).<br />

0 0 0 1 0<br />

0 1 1 1 0<br />

1 1 1 1 0<br />

1 1 1 1 1<br />

1 1 1 0 0<br />

(a) Indata. 1 indikerar<br />

<strong>för</strong>grundspixel.<br />

0 0 0 3 0<br />

0 3 3 4 0<br />

3 4 6 7 0<br />

3 6 8 10 3<br />

3 6 9 0 0<br />

(b) Första passet.<br />

0 0 0 3 0<br />

0 3 3 3 0<br />

3 4 6 3 0<br />

3 6 4 3 3<br />

3 6 3 0 0<br />

(c) Andra passet.<br />

Figur 4.2: Generering <strong>av</strong> <strong>av</strong>ståndskarta.<br />

Jag har valt att använda en algoritm som arbetar i två pass. Första<br />

passet hanterar pixlar radvis från övre vänstra <strong>till</strong> nedre högra hörnet. Förgrundspixlar<br />

sätts <strong>till</strong> det minsta värdet <strong>av</strong> följande: värdet ovan<strong>för</strong> plus 3,<br />

värdet <strong>till</strong> vänster plus 3, värdet snett ovan<strong>för</strong> <strong>till</strong> vänster plus 4 samt värdet<br />

snett ovan<strong>för</strong> <strong>till</strong> höger plus 4. [figur 4.2b]<br />

Andra passet går i motsatt riktning, och arbetar radvis från nedre högra<br />

<strong>till</strong> övre vänstra hörnet. Förgrundspixlar sätts <strong>till</strong> det minsta värdet <strong>av</strong><br />

följande: nuvarande värde, värdet <strong>till</strong> höger plus 3, värdet nedan<strong>för</strong> plus 3,<br />

värdet snett nedåt <strong>till</strong> höger plus 4 samt värdet snett nedåt <strong>till</strong> vänster plus<br />

4. [Figur 4.2c]<br />

Skälet <strong>till</strong> att öka värdena med 3 och 4 istället <strong>för</strong> med 1 och √ 2 är att<br />

det i vissa fall är enklare att arbeta med heltal än flyttal. Det är ofta det<br />

relativa värdet som är viktigt, snarare än det absoluta <strong>av</strong>ståndet <strong>till</strong> närmsta<br />

bakgrundspixel.<br />

24


4.5 Ythantering<br />

Under projektets gång, blev det tydligt att många skisser inte bara innehåller<br />

linjer, utan även fyllda ytor. Sådana kan produceras <strong>av</strong>siktligt, där detaljer<br />

som hår, pupiller etc. fyllts i <strong>av</strong> användaren. Det finns även fall då ytor<br />

bildas o<strong>av</strong>siktligt, <strong>till</strong> exempel i det fall flera linjer går ihop och <strong>till</strong>sammans<br />

bildar en yta. I det fall man <strong>för</strong>söker detektera en yta som en linje, kommer<br />

konturinformation oundvikligen gå <strong>för</strong>lorad, om man (som i vårt fall) inte<br />

har möjlighet att kompensera genom att variera linjetjockleken.<br />

Det som i vårt fall är intressant i ytor, är ytans konturer, snarare än<br />

att ytan ska vara fylld med färg. Jag konstruerade följande algoritm <strong>för</strong> att<br />

ersätta ytor med dess konturlinjer:<br />

1. Kopiera källbitmappen <strong>till</strong> en arbetsbitmapp. [Figur 4.3a]<br />

2. Erodera arbetsbitmappen radie max gånger. [Figur 4.3b]<br />

3. Ta bort de svarta ytor i arbetsbitmappen som är mindre än area min .<br />

4. Ut<strong>för</strong> dilation på arbetsbitmappen radie max gånger. [Figur 4.3c]<br />

5. Ut<strong>för</strong> logiskt OCH på källbitmappen med den inverterade arbetsbitmappen.<br />

[Figur 4.3d]<br />

6. Ut<strong>för</strong> kantdetektion på arbetsbitmappen (dvs. ta bort alla svarta pixlar<br />

som bara har svarta grannar). [Figur 4.3e]<br />

7. Ut<strong>för</strong> logiskt ELLER på källbitmappen med arbetsbitmappen. Resultatet<br />

erhålls nu i källbitmappen. [Figur 4.3f]<br />

radie max är den maximalt <strong>till</strong>åtna linjeradien. Linjer eller ytor med större<br />

radie än radie max skall behandlas som ytor. area min är den undre storleksgränsen<br />

på vilka ytor som ska ersättas med konturlinjer. För denna applikation<br />

är radie max satt <strong>till</strong> två, medan area min är satt <strong>till</strong> 30.<br />

Fördelen med algoritmen är att den är stabil och enkel att implementera.<br />

Man kan dock få problem vid hanteringen <strong>av</strong> kantiga ytor, då spetsarna riskerar<br />

att bli <strong>av</strong>rundade. Algoritmen fyller så att säga inte ända ut i spetsarna.<br />

En intressant bieffekt <strong>av</strong> den här algoritmen är att den öppnar upp applikationen<br />

<strong>för</strong> fler användningsområden än att hantera skisser. Eftersom<br />

applikationen inte längre är begränsad <strong>till</strong> att enbart använda streckbilder,<br />

kan man även behandla t.ex. fotografier med acceptabelt resultat. Applikationen<br />

har redan används <strong>till</strong> att behandla fotografier in<strong>för</strong> presentationer <strong>av</strong><br />

vetenskapliga undersökningar; genom att konvertera fotografier <strong>till</strong> enkla <strong>vektorbild</strong>er<br />

kan man skydda de fotograferade människornas identitet, samtidigt<br />

som fotografiets innebörd (människors position, gester o.s.v.) bibehålls.<br />

25


(a) Källbitmapp.<br />

(b) Eroderad arbetsbitmapp.<br />

(c) Arbetsbitmapp efter borttagning<br />

<strong>av</strong> små ytor och dilation.<br />

(d) Källbitmapp efter logiskt<br />

OCH med den inverterade arbetsbitmappen.<br />

(e) Arbetsbitmapp efter kantdetektion.<br />

(f) Källbitmapp efter logiskt EL-<br />

LER med arbetsbitmappen.<br />

Figur 4.3: Exempelsteg <strong>för</strong> omvandling <strong>av</strong> ytor <strong>till</strong> slutna konturlinjer.<br />

26


4.6 Förtunning<br />

Målet med <strong>för</strong>tunning är att tunna ut alla linjer så att dess bredd inte är<br />

större än maximalt en pixel. Detta är ett nödvändigt <strong>för</strong>beredande steg <strong>för</strong><br />

att sedan kunna göra om linjerna <strong>till</strong> polylinjer.<br />

Augmented Fast Marching Method<br />

Jag började med att implementera ”Augmented Fast Marching Method”(AF-<br />

MM), en algoritm som genererar skelett <strong>för</strong> planära objekt (Telea och van<br />

Wijk, 2002). Algoritmen är inte helt olik traditionell <strong>för</strong>tunning, men är snabbare<br />

och har även <strong>för</strong>delen att den bibehåller information om linjebredd. Den<br />

går <strong>till</strong>väga så att pixlar sätts upp längs med objektets kanter, och att pixlarna<br />

sedan får marschera in mot mitten <strong>av</strong> objektet. Pixlarnas <strong>av</strong>ståndsvärde<br />

<strong>till</strong> kanten ökar med ett givet värde <strong>för</strong> varje steg. Linjers mittpunkter detekteras<br />

när pixlar från ej angränsande kanter krockar med varandra.<br />

Tyvärr visade det sig att AFMM ibland genererade skelett som var två<br />

pixlar breda, något som ledde <strong>till</strong> problem vid efterföljande konvertering från<br />

skelett <strong>till</strong> polylinje. Jag överg<strong>av</strong> där<strong>för</strong> AFMM <strong>till</strong> <strong>för</strong>mån <strong>för</strong> mer klassiska<br />

iterativa <strong>för</strong>tunningsmetoder.<br />

Zhang-Suen, Stentiford<br />

Jag implementerade nu Zhang-Suens och Stentifords klassiska algoritmer <strong>för</strong><br />

linje<strong>för</strong>tunning, i dess enklaste former (Zhang och Suen, 1984; Stentiford och<br />

Mortimer, 1983). Jag lät dock bli att implementera Stentifords olika <strong>för</strong>hanteringssteg,<br />

eftersom de främst är ämnade <strong>för</strong> <strong>för</strong>tunning <strong>av</strong> handskriven text.<br />

I slutändan valde jag att använda Stentiford, då den lär vara bättre ämnad<br />

<strong>för</strong> linjer som följer kurvor, medan Zhang-Suen lär vara bättre lämpad<br />

<strong>för</strong> raka linjer (WinTopo, 2006). För den som är intresserad <strong>av</strong> ytterligare<br />

<strong>för</strong>bättringar finns en algoritm som kombinerar Stentiford, Zhang-Suen och<br />

Holt beskriven i Parker (1996).<br />

4.7 <strong>Konvertering</strong> <strong>till</strong> polylinjer<br />

I detta steg konverteras bilden från raster- <strong>till</strong> vektorgrafik. Algoritmerna<br />

som används här har jag skrivit själv, även om det troligtvis är andra som<br />

har uppfunnit liknande algoritmer långt tidigare.<br />

Uppgiften här är att hitta de en pixel breda linjer som finns på vår <strong>rasterbild</strong>,<br />

och konvertera dem linje <strong>för</strong> linje. Grundtanken är att hitta linjernas<br />

ändpunkter, och därefter följa linjens bana pixel <strong>för</strong> pixel <strong>till</strong> dess ände. Saken<br />

27


kompliceras <strong>av</strong> att vi har vissa specialfall. Till exempel <strong>till</strong>hör vissa pixlar<br />

flera linjer (de är s.k. knytpunkter), medan andra linjer saknar ändpixlar<br />

(cirklar).<br />

4.7.1 Knytpunktslinjer<br />

En knytpunkt definierar jag här som en punkt som är ändpunkt <strong>för</strong> minst<br />

tre separata linjer. En knytpunktslinje definieras omvänt som en linje som<br />

har sin ände i en knytpunkt.<br />

Detektion<br />

X<br />

X<br />

X<br />

P<br />

X<br />

X<br />

(a) Indata.<br />

1 2<br />

P 3<br />

4 5<br />

(b) Varje<br />

<strong>för</strong>grundspixel<br />

får ett unikt<br />

värde.<br />

1 1<br />

P 3<br />

4 3<br />

(c) Närliggande<br />

<strong>för</strong>grundspixlar<br />

sätts <strong>till</strong><br />

samma värde.<br />

Figur 4.4: Identifiering <strong>av</strong> knytpunkt P.<br />

Min idé <strong>för</strong> hur man kan identifiera en knytpunkt är att hitta hur många<br />

linjer som skjuter ut ur en given <strong>för</strong>grundspunkt. Om tre eller fler linjer<br />

skjuter ut från punkten, räknas det som en knytpunkt.<br />

Detektionsalgoritmen jag har använt illustreras i figur 4.4. Indata (figur<br />

4.4a) visar omgivningen kring den möjliga <strong>för</strong>grundspunkten P, där X<br />

markerar <strong>för</strong>grundspixlar. I figur 4.4b ges varje <strong>för</strong>grundspixel ett unikt värde.<br />

I figur 4.4c går vi ett varv medsols runt <strong>för</strong>grundspixlarna; om flera pixlar<br />

i rad har samma värde, sätts de <strong>till</strong> samma. Efter detta steg återstår att räkna<br />

samman hur många olika värden som finns i matrisen. Om fler än två<br />

olika värden finns, är punkten P en knytpunkt. 1, 3 och 4 är tre olika värden;<br />

alltså är P en knytpunkt!<br />

Hantering<br />

Vid detektion <strong>av</strong> en knytpunktspixel, tas den bort från indata-bitmappen,<br />

och sparas istället undan i en separat knytpunkts-bitmapp. Syftet med det,<br />

är att se <strong>till</strong> att alla <strong>för</strong>grundspixlar i indatabilden <strong>till</strong>hör exakt en linje, och<br />

att inga linjer gränsar <strong>till</strong> en annan linje. Detta gör det enkelt att kalkera<br />

linjer.<br />

28


När alla knytpunkter hittats, går vi igenom dem en efter en, och kalkerar<br />

samtliga linjer som utgår från respektive knytpunkt. (Se metodbeskrivning i<br />

algoritm 1.)<br />

Algoritm 1 Kalkering <strong>av</strong> knytpunktslinjer.<br />

1: for all knots in knot image do<br />

2: create new polyline line<br />

3: set pos x,y to knot position<br />

4: add pos x,y to line<br />

5: while neighbors to pos x,y exist on input image do<br />

6: pick closest neighbor (orthogonal neighbors preferred over diagonal)<br />

7: set pos x,y to neighbor position<br />

8: add pos x,y to line<br />

9: clear pixel at pos x,y<br />

10: end while<br />

11: if any neighbor to pos x,y exists on knot image then<br />

12: pick closest knot neighbor<br />

13: add knot neighbor position to line<br />

14: end if<br />

{completed trace of line}<br />

15: end for<br />

4.7.2 Frilagda linjer<br />

En frilagd linje är här en linje som har en ändpunkt som är skild från startpunkten,<br />

och som inte skär några andra linjer. Frilagda linjer är relativt enkla<br />

att hantera, tack vare att vi i <strong>för</strong>egående steg gjort oss <strong>av</strong> med alla besvärliga<br />

knytpunkter.<br />

Detektion <strong>av</strong> ändpunkt sker med samma metod som i <strong>av</strong>snitt 4.7.1, med<br />

skillnaden att ändpunkter <strong>till</strong> frilagda linjer har en och endast en linje som<br />

skjuter ut ur punkten. Hanteringen är också en enklare variant <strong>av</strong> den som<br />

beskrivs i <strong>av</strong>snitt 4.7.1, med skillnaden att man här inte behöver göra någon<br />

särskild hantering <strong>för</strong> knytpunkter. (Se metodbeskrivning i algoritm 2.)<br />

4.7.3 Cirklar<br />

Cirklar definieras här som en linje som startar och slutar i samma punkt. Alla<br />

linjer som inte är knytpunktslinjer eller frilagda linjer kan antas vara cirklar.<br />

Efter <strong>för</strong>egående beräkningssteg kan vi utgå från att det bara finns cirklar<br />

kvar i indata-bitmappen. Min metod <strong>för</strong> cirkelkalkering beskrivs i algoritm 3.<br />

29


Algoritm 2 Kalkering <strong>av</strong> frilagda linjer.<br />

1: for all pos x,y do<br />

2: if pos x,y is a line end then<br />

3: create new polyline line<br />

4: add pos x,y to line<br />

5: clear pixel at pos x,y<br />

6: while neighbors to pos x,y exist do<br />

7: pick closest neighbor<br />

8: set pos x,y to neighbor position<br />

9: add pos x,y to line<br />

10: clear pixel at pos x,y<br />

11: end while<br />

{completed trace of line}<br />

12: end if<br />

13: end for<br />

Ett brist är att det inte sker någon särskild hantering <strong>för</strong> att se <strong>till</strong> att<br />

riktningarna vid linjens båda ändpunkter blir motsatta. Vid bezierkonvertering<br />

riskerar det att bli en kant i från början jämna cirklar.<br />

4.8 Borttagning <strong>av</strong> korta linjer<br />

(a) Utan borttagning.<br />

(b) Med borttagning.<br />

Figur 4.5: Borttagning <strong>av</strong> korta linjer.<br />

Första steget efter raster- <strong>till</strong> vektor-konverteringen är att ta bort korta<br />

linjer. Syftet med detta är att städa bort o<strong>av</strong>siktliga linjer som uppkommit<br />

<strong>till</strong> följd <strong>av</strong> smuts och fläckar på papperet, eller linjer som är bieffekter <strong>av</strong><br />

30


Algoritm 3 Kalkering <strong>av</strong> cirklar.<br />

1: for all startpos x,y do<br />

2: if pixel at startpos x,y is set then<br />

3: create new polyline line<br />

4: add startpos x,y to line<br />

5: clear pixel at pos x,y<br />

6: set pos x,y to startpos x,y<br />

7: while neighbors to pos x,y exist do<br />

8: pick closest neighbor<br />

9: set pos x,y to neighbor position<br />

10: add pos x,y to line<br />

11: clear pixel at pos x,y<br />

12: end while<br />

13: add startpos x,y to line {start point equals stop point}<br />

{completed trace of line}<br />

14: end if<br />

15: end for<br />

skeletteringsalgoritmen. För att behålla konnektiviteten i bilden tas endast<br />

svanslinjer 1 eller fritt hängande linjer bort. [Figur 4.5]<br />

Minsta <strong>till</strong>åtna linjelängd kan ställas om med en skjutregel i gränssnittet.<br />

Grundinställningen är fyra punkter.<br />

4.9 Borttagning <strong>av</strong> överflödiga punkter<br />

För att snabba upp vidare behandling, minskar vi nu datamängden genom<br />

att ta bort överflödiga punkter från polylinjerna. Algoritmen nöjer sig med<br />

att behålla var fjärde punkt i linjerna. Enligt Schneider (1988) är detta i<br />

praktiken <strong>till</strong>räckligt <strong>för</strong> att behålla all information från skeletteringen.<br />

Jag gjorde ett <strong>för</strong>sök med att ta bort fler punkter än så, som en sorts<br />

linje<strong>för</strong>enkling. Min tanke var att man vid t.ex. raka sträckor i linjen borde<br />

kunna gå ner <strong>till</strong> ännu större <strong>av</strong>stånd mellan punkterna. Det visade sig dock<br />

att allt <strong>för</strong> glesa punkter orsakade buggar vid den kommande bezierkurvekonverteringen.<br />

Algoritmen som används där (beskriven i 4.12) är ganska<br />

känslig och behöver många indatapunkter <strong>för</strong> att fungera väl.<br />

1 Svanslinje definieras här som en linje som är sammankopplad med andra linjer i en<br />

och endast en ändpunkt.<br />

31


4.10 Hantering <strong>av</strong> <strong>för</strong>greningar<br />

I detta steg sker särskild behandling <strong>för</strong> T- och Y-<strong>för</strong>greningar. Ett skäl <strong>till</strong><br />

att detta behövs är att sådana <strong>för</strong>greningar ofta <strong>för</strong>vanskas vid <strong>för</strong>tunningen.<br />

Det sker också <strong>för</strong> att <strong>för</strong>bereda <strong>för</strong> den kommande bezierkonverteringen, så<br />

att den kan ge ett så bra slutresultat som möjligt.<br />

De metoder som används i det här kapitlet har jag utformat med syftet<br />

att lösa de specifika problem som uppstår vid vektorisering <strong>av</strong> handritade<br />

linjeskisser. För andra typer <strong>av</strong> indata (t.ex. tekniska ritningar) är de metoder<br />

och konstanter jag kommit fram <strong>till</strong> kanske inte så lämpliga.<br />

4.10.1 T-<strong>för</strong>greningar<br />

A<br />

B<br />

C<br />

Figur 4.6: En T-<strong>för</strong>grening med tre polylinjer A, B och C.<br />

Figur 4.6 är ett exempel på en T-<strong>för</strong>grening där de tre linjerna A, B och<br />

C möts. Illustratörens syfte med linjerna A och B är inte att de ska vara<br />

två separata linjer, utan att de ska tolkas som en linje AB. Ett problem vid<br />

T-<strong>för</strong>greningar är att <strong>för</strong>greningspunkten mellan linjerna A, B och C ofta är<br />

<strong>för</strong>vanskad på grund <strong>av</strong> ”necking”. (Förgreningspunkten drar ofta åt linjen<br />

C, snarare än att följa linjerna A och B.)<br />

Detektion<br />

Första steget är att <strong>av</strong>göra om korsningen verkligen är en T-korsning. Det<br />

görs genom att analysera linjernas riktning från <strong>för</strong>greningspunkten g. Vektorn<br />

a 1 ⃗a 2 , där a 1 är den punkt i linjen A som är närmast g, antas representera<br />

linjens riktning. [Figur 4.7]<br />

Förgreningen antas vara en T-<strong>för</strong>grening, där A och B bör sammanfogas<br />

<strong>till</strong> linjen AB, om<br />

32


a 2 a 1 b 1 b 2<br />

g<br />

c 1<br />

c 2<br />

Figur 4.7: Detektion <strong>av</strong> T-<strong>för</strong>grening.<br />

a 1 ⃗a 2 ,<br />

⃗ b 1 b 2 och<br />

c 1 ⃗c 2 analyseras.<br />

där â, ˆb, ĉ, motsvarar enhetsvektorerna <strong>för</strong><br />

Åtgärd<br />

â · ˆb < −0.8, och (4.1)<br />

â · ĉ > −0.75, och (4.2)<br />

ˆb · ĉ > −0.75 (4.3)<br />

a 1 ⃗a 2 ,<br />

⃗ b 1 b 2 ,<br />

c 1 ⃗c 2 .<br />

När detektionen lyckats, vill vi korrigera <strong>för</strong>greningspunkten g så att den<br />

bättre följer linjerna A och B. Min lösning är att flytta punkten g så att den<br />

hamnar i skärningspunkten mellan de tänkta linjerna a 1 b 1 och gc 1 .<br />

4.10.2 Falska Y-<strong>för</strong>greningar<br />

Falsk Y-<strong>för</strong>grening är min egen benämning på ”tailing”, en vanlig <strong>för</strong>vanskning<br />

vid skelettering. Den syftar på när de resulterande polylinjerna visar<br />

en tydlig Y-<strong>för</strong>grening, med tre skilda polylinjer, när originalbilden i själva<br />

verket består <strong>av</strong> två linjer som gradvis glider ihop <strong>till</strong> en. [Figur 4.8]<br />

Detektion<br />

Detektion <strong>av</strong> falska Y-<strong>för</strong>greningar sker på samma sätt som detektion <strong>av</strong> T-<br />

<strong>för</strong>greningar. Förgreningen antas vara en falsk Y-<strong>för</strong>grening, där A och B<br />

gradvis går samman <strong>till</strong> linjen C [Figur 4.9], om<br />

â · ĉ < k, och (4.4)<br />

ˆb · ĉ < k (4.5)<br />

33


(a) Original. Två linjer går ihop <strong>till</strong><br />

en, och bildar ett V.<br />

(b) Resulterande polylinjer. Tydlig<br />

Y-form.<br />

Figur 4.8: Exempel på falsk Y-<strong>för</strong>grening (”tailing”).<br />

A<br />

B<br />

C<br />

Figur 4.9: Y-<strong>för</strong>grening. Linjerna A och B går ihop <strong>till</strong> linjen C.<br />

34


där<br />

{<br />

−0.7 om C är en svanslinje,<br />

k =<br />

−0.8 om C:s båda ändar är sammanfogade med andra linjer.<br />

(4.6)<br />

k sätts <strong>till</strong> ett mer inklusivt värde om linjen C är en svanslinje, eftersom det<br />

i de fallen är betydligt mer vanligt med falska Y-<strong>för</strong>greningar.<br />

Åtgärd<br />

(a) En falsk Y-<strong>för</strong>grening<br />

med tydlig tailing.<br />

(b) Resultat. Den tidigare<br />

punkten p har tagits bort<br />

och linjerna är ej längre<br />

sammankopplade.<br />

(c) q a och q b kopplas <strong>till</strong><br />

punkten q c , som bildar nya<br />

grenpunkten q.<br />

Figur 4.10: Borttagning <strong>av</strong> punkter som uppstått <strong>till</strong> följd <strong>av</strong> tailing.<br />

Vi vill nu motverka eventuell tailing i den funna falska Y-<strong>för</strong>greningen.<br />

Detta görs med hjälp <strong>av</strong> den <strong>av</strong>ståndskarta som byggdes i <strong>av</strong>snitt 4.4. Vi<br />

börjar med att <strong>för</strong> varje polylinje ap, bp, cp [Figur 4.10a] räkna ut medianlinjebredden<br />

vid samtliga punkter. Vi tar därefter bort de punkter runt punkten<br />

p, vars linjebredd är större än respektive linjes medianbredd. (Se algoritm 4.)<br />

Efter att ha tagit bort punkter som uppstått på grund <strong>av</strong> tailing, är det<br />

möjligt att linjerna inte längre sitter ihop. [Figur 4.10b] Jag använder två<br />

olika metoder <strong>för</strong> att koppla ihop linjerna igen, beroende på om linjen qc är en<br />

svanslinje eller ej. Om qc inte är en svanslinje, gör vi en enkel koppling mellan<br />

punkterna q a och q c samt q b och q c . Linjen qc lämnas intakt. [Figur 4.10c]<br />

Om qc är en svanslinje, väljer vi istället att kopiera över punkterna i linjen qc<br />

<strong>till</strong> linjerna qa och qb, och sedan ta bort linjen qc helt. Slutresultatet blir att<br />

vi istället <strong>för</strong> tre linjer qa, qb, qc får två linjer aqc, bqc. Detta ger ett bättre<br />

35


Algoritm 4 Borttagning <strong>av</strong> punkter som uppstått <strong>till</strong> följd <strong>av</strong> tailing.<br />

1: for all line in polylines ap, bp, cp do<br />

2: removed points count = 0<br />

3: set median width to the median line width of all points in line<br />

4: set curr point to p<br />

5: while line width at curr point > median width and<br />

removed points count < 6 do<br />

6: remove curr point from line<br />

7: set curr point to next point in line<br />

8: increase removed points count<br />

9: end while<br />

10: end for<br />

resultat vid den kommande bezierkonverteringen, eftersom de två linjerna då<br />

kommer glida samman på ett vackert sätt och mötas i ändpunkten c.<br />

4.11 Knäsplittring<br />

I detta steg markeras eventuella knän (dvs. skarpa vinklar) i polylinjerna, så<br />

att den kommande bezierkonverteringen ska kunna göra ett bättre jobb med<br />

att bryta upp polylinjer.<br />

a<br />

p<br />

b<br />

Figur 4.11: Detektion <strong>av</strong> knäpunkt.<br />

En punkt p definieras som en knäpunkt om<br />

där A = ⃗pa, B = ⃗ pb. [Figur 4.11]<br />

 · ˆB > −0.3 (4.7)<br />

4.12 <strong>Konvertering</strong> <strong>till</strong> bezierkurvor<br />

Nu är det <strong>till</strong> sist dags att konvertera våra polylinjer <strong>till</strong> bezierkurvor. För<br />

detta valde jag att implementera Schneiders metod, en ofta använd iterativ<br />

algoritm. (Se <strong>av</strong>snitt 3.3.4 <strong>för</strong> beskrivning.) Jag har även <strong>för</strong>bättrat algoritmen<br />

så att den tar stöd <strong>av</strong> de knäpunkter som räknats fram i <strong>för</strong>egående<br />

<strong>av</strong>snitt, <strong>för</strong> att bryta upp linjer på så lämpliga ställen som möjligt.<br />

36


Ett problem med Schneiders metod är att den i vissa fall inte tycks vara<br />

helt stabil. Den kräver rätt många och täta punkter i polylinjerna <strong>för</strong> att<br />

fungera bra. För vissa polylinjer kan den generera kurvor som ser mycket<br />

konstiga ut, och <strong>av</strong>viker markant från den ursprungliga linjen. Särskilt gäller<br />

det <strong>för</strong> kortare polylinjer med få punkter, då man satt en mycket låg<br />

feltolerans. I framtiden kan det vara intressant att <strong>för</strong>söka implementera någon<br />

annan algoritm. T.ex. Shao och Zhou (1996) beskriver en algoritm som<br />

lär vara stabilare och ge bättre resultat än Schneiders metod, och som inte<br />

behöver någon särskild behandling <strong>för</strong> att hitta lämpliga brytpunkter.<br />

En mängd exempelbilder som visar resultatet <strong>av</strong> bezierkonverteringen<br />

finns i <strong>av</strong>snitt 5.3.<br />

4.13 Export <strong>till</strong> PostScript<br />

Det <strong>av</strong>slutande steget är att exportera den resulterande <strong>vektorbild</strong>en <strong>till</strong> Encapsulated<br />

PostScript-format. Detta steg är mest en ren implementationsfråga,<br />

och kommer där<strong>för</strong> inte beskrivas i detalj.<br />

Något som bör hållas i åtanke här, är att vissa linjer bör exporteras <strong>till</strong>sammans<br />

som en sammansatt linje. Jag tänker här på linjer som fortsätter in<br />

i varandra, och där<strong>för</strong> uppfattas som samma linje. Exempel på sådana linjer<br />

är de motriktade linjer som uppkommer vid T-<strong>för</strong>greningar, och långa linjer<br />

som styckas upp vid bezierkonverteringen. Skälet <strong>till</strong> att sådana linjer bör<br />

exporteras som en sammansatt linje är att de då blir enklare att bearbeta<br />

vidare manuellt.<br />

Om en ändpunkt <strong>till</strong>hör två separata linjer, bör linjerna exporteras <strong>till</strong>sammans.<br />

Om en ändpunkt <strong>till</strong>hör fler än två separata linjer, bör de linjer<br />

som har motsatt riktning kring ändpunkten exporteras <strong>till</strong>sammans.<br />

Programlista 4.1: PostScript-exempel. En sammansatt linje med två bezierkurvor.<br />

Linjen går från punkten (1,1) genom (2,2) <strong>till</strong> (3,1).<br />

1 1 moveto<br />

1 2 1 2 2 2 curveto<br />

3 2 3 2 3 1 curveto<br />

s t r o k e<br />

37


Kapitel 5<br />

Resultat och diskussion<br />

5.1 Prestanda<br />

Algoritmerna som beskrivits har implementerats i C++ och testkörts på en<br />

bärbar PC med en 1.5 GHz Intel Pentium M-processor och 760 MB RAM.<br />

Tidsåtgången har befunnits vara kvadratisk mot upplösningen på bilden.<br />

Storlek i pixlar Beräkningstid (s)<br />

400x300 1<br />

1500x1200 3<br />

2600x2600 10<br />

5200x5200 60<br />

Tabell 5.1: Tidsåtgång<br />

5.2 Kvalitativa resultat<br />

En informell jäm<strong>för</strong>else mellan denna applikation och andra vektoriserare<br />

visar att applikationen står sig väl i konkurrensen.<br />

Jäm<strong>för</strong>t med de program som är specialiserade mot CAD och GIS är<br />

applikationen mycket mer lämplig <strong>för</strong> att konvertera skisser, då den stödjer<br />

konvertering <strong>till</strong> bezierkurvor. Den är också mer tidsbesparande än de<br />

vektoriserare som enbart kalkerar konturer.<br />

En ny konkurrent är Live Trace-funktionen i Adobe Illustrator CS2, som<br />

släpptes i arbetets slutskede och visade sig vara ungefär likvärdig med vår applikation.<br />

Tydligt är att Live Trace har bättre knähantering, detekterar olika<br />

linjebredder och ger ett allmänt stabilt och buggfritt intryck. Vår applikation<br />

har dock bättre binärisering och ythantering, samt erbjuder mer direkt<br />

38


återkoppling. För att göra en mer rättvisande jäm<strong>för</strong>else krävs antagligen<br />

användartester.<br />

En tydlig brist är att vår applikation beter sig mycket olika <strong>för</strong> olika<br />

upplösningar på indata. Den beter sig som bäst när indata har en upplösning<br />

på mellan 150 och 300 DPI. Under 150 DPI får algoritmerna <strong>för</strong> få pixlar att<br />

arbeta med [figur 5.2], över 300 DPI tar de <strong>för</strong> lång tid. Ett enkelt sätt att<br />

åtgärda det problemet kan vara att lägga <strong>till</strong> funktionalitet <strong>för</strong> att skala om<br />

bilden i början <strong>av</strong> hanteringen.<br />

5.3 Exempelbilder<br />

På följande sidor presenterar jag några exempel <strong>för</strong> hur vektoriseringen kan<br />

falla ut.<br />

Den brinnande katten är ritad <strong>av</strong> Frans Carlqvist, den irländska fågelvätten<br />

<strong>av</strong> Ola Persson. Fotografiet är taget <strong>av</strong> Mats Andrén.<br />

5.4 Slutsats<br />

Arbetet har resulterat i en applikation <strong>för</strong> att stödja illustratörer i processen<br />

att konvertera handritade skisser <strong>till</strong> vektorformat. Applikationen ger mycket<br />

lovande resultat. Trots att merparten <strong>av</strong> algoritmerna är väl beprövade från<br />

andra områden, indikerar resultaten att man kan få speciella <strong>för</strong>delar genom<br />

att kombinera och anpassa algoritmerna på ett sätt som är speciellt ämnat att<br />

<strong>till</strong>godose illustratörers behov. Troligen kommer de metoder som utvecklats<br />

här vara överlägsna mer generella vektoriseringsmetoder, så länge det gäller<br />

just att konvertera skisser <strong>av</strong> illustratörer och animatörer.<br />

39


Figur 5.1: 359x295 pixlar, 72 DPI. Original. Bilden är något beskuren.<br />

Figur 5.2: 359x295 pixlar, 72 DPI. Resultatet har blivit mindre lyckat. Eftersom<br />

ingen kompensation gjorts <strong>för</strong> den låga upplösningen, har algoritmerna<br />

fått <strong>för</strong> få pixlar att arbeta med.<br />

40


Figur 5.3: 1494x1228 pixlar, 300 DPI. Original. Bilden är något beskuren.<br />

41


Figur 5.4: 1494x1228 pixlar, 300 DPI. Resultatet har blivit betydligt mer<br />

lyckat än i figur 5.2. En del <strong>av</strong> linjerna i originalet har varit <strong>till</strong>räckligt breda<br />

<strong>för</strong> att bli tolkade som ytor, och har där<strong>för</strong> genererat dubbellinjer. Det är<br />

osäkert om användaren önskar det resultatet eller ej, där<strong>för</strong> bör man kunna<br />

ställa om tröskelnivån <strong>för</strong> maximal linjebredd i gränssnittet.<br />

42


Figur 5.5: Samma som figur 5.4. Bezierkurvornas ändpunkter är markerade.<br />

43


Figur 5.6: 945x778 pixlar, 300 DPI. Original. Bilden är något beskuren.<br />

44


Figur 5.7: 945x778 pixlar, 300 DPI. Ett i praktiken användbart resultat, även<br />

om viss efterbearbetning krävs. Applikationen är specialiserad på att hantera<br />

illustrationer <strong>av</strong> denna typ.<br />

45


Figur 5.8: Samma som figur 5.7. Bezierkurvornas ändpunkter är markerade.<br />

46


Figur 5.9: 400x300 pixlar. Original.<br />

47


Figur 5.10: 400x300 pixlar. Efter manuella justeringar <strong>av</strong> binäriseringsparametrarna,<br />

kan man få användbara resultat även vid konvertering <strong>av</strong> fotografier.<br />

48


Figur 5.11: Ungefär samma som figur 5.10. Bezierkurvornas ändpunkter är<br />

markerade.<br />

49


Kapitel 6<br />

Förslag <strong>för</strong> vidareutveckling<br />

6.1 Stöd <strong>för</strong> varierande bildupplösning<br />

En tydlig brist i programmet är att både slutresultat och beräkningstid varierar<br />

dramatiskt med upplösning och bildstorlek. Ett effektivt sätt att komma<br />

runt detta problem kan vara att implementera ett skalningsfilter som sätts<br />

in direkt efter desatureringen.<br />

6.2 Förbättrat användargränssnitt<br />

Implementera de <strong>för</strong>bättringar <strong>till</strong> gränssnittet som <strong>för</strong>eslås i Olsson (2005).<br />

6.3 Multiplattformsstöd<br />

Många illustratörer använder Mac hellre än Windows. Där<strong>för</strong> kan det vara<br />

en god idé att skriva om gränssnittet med stöd <strong>av</strong> något multiplattforms-<br />

GUI-ramverk, <strong>till</strong> exempel wxWidgets/wxPython.<br />

50


Litteratur<strong>för</strong>teckning<br />

Adobe. Postscript turns 20, maj 2006. URL http://www.adobe.com/<br />

products/postscript/pdfs/postscript_is_20.pdf.<br />

Association for Automatic Identification and Mobility, 2006. Optical character<br />

recognition (ocr), sep 2000. URL http://www.aimglobal.org/<br />

technologies/othertechnologies/ocr.pdf.<br />

Bernard, Thierry M. och Manzanera, Antoine. Improved low complexity<br />

fully parallel thinning algorithm. I: Proc. Int. Conf. on Image Analysis<br />

and Processing, ss 215–220, Venice, Italy, september 1999. IEEE Computer<br />

Society.<br />

Drobchenko, A., Vartiainen, J., Kamarainen, J.-K., Lensu, L., och Kälviäinen,<br />

H. Thresholding based detection of fine and sparse details. I: Proc.<br />

of the IAPR Conf. on Machine Vision Applications, ss 257–260, Tsukuba<br />

Science City, Japan, 2005.<br />

Eastern Region Geography, 2006. Geographic information systems, maj 2006.<br />

URL http://erg.usgs.gov/isb/pubs/gis_poster/.<br />

Fisher, Bob, Perkins, Simon, Walker, Ashley, och Wolfart, Erik. Hypermedia<br />

image processing reference, 1994. URL http://www.cee.hw.ac.uk/hipr/<br />

html/hipr\_top.html.<br />

Kittler, J. och Illingworth, J. Minimum error thresholding. Pattern Recogn.,<br />

19(1):41–47, 1986. ISSN 0031-3203.<br />

Lam, Louisa, Lee, Seong-Whan, och Suen, Ching Y. Thinning methodologiesa<br />

comprehensive survey. IEEE Trans. Pattern Anal. Mach. Intell., 14(9):<br />

869–885, 1992. ISSN 0162-8828.<br />

Liu, Wenyin och Dori, Dov. From rasters to vectors: Extracting visual information<br />

from line drawings. Pattern Analysis and Applications, 2(1):10–21,<br />

1999.<br />

51


Olsson, Jonna. Från skiss <strong>till</strong> vektorgrafik - en studie om utökat datorstöd<br />

<strong>för</strong> animatörer och illustratörer. Examensarbete, <strong>KTH</strong>, 2005. TRITA-NA-<br />

E05117.<br />

Otsu, N. A threshold selection method from gray level histograms. IEEE<br />

Trans. Systems, Man and Cybernetics, 9:62–66, mars 1979.<br />

Parker, James R. Algorithms for Image Processing and Computer Vision.<br />

Wiley, 1996. PAR j 96:1 1.Ex.<br />

Schneider, Philip J. Phoenix: An interactive curve design system based on<br />

the automatic fitting of hand-sketched curves. Examensarbete, University<br />

of Washington, 1988.<br />

Sezgin, M. och Sankur, B. A survey over image thresholding techniques and<br />

quantitative performance evaluation. Journal of Electronic Imaging, 13(1):<br />

146–165, januari 2004.<br />

Shao, L. och Zhou, H. Curve fitting with bezier cubics. GMIP, 58:223–232,<br />

1996.<br />

Stentiford, F.W.M. och Mortimer, R.G. Some new heuristics for thinning<br />

binary handprinted characters for ocr. SMC, 13:81–84, 1983.<br />

Telea, Alexandru och van Wijk, Jarke J. An augmented fast marching method<br />

for computing skeletons and centerlines. I: VISSYM ’02: Proceedings<br />

of the symposium on Data Visualisation 2002, ss 251–ff, Aire-la-Ville, Switzerland,<br />

Switzerland, 2002. Eurographics Association. ISBN 1-58113-536-<br />

X.<br />

Tombre, K. och Tabbone, S. Vectorization in graphics recognition: to thin or<br />

not to thin. I: Proceedings of the 15th International Conference on Pattern<br />

Recognition, Barcelona (Spain), band 2, ss 91–96, september 2000.<br />

Tombre, Karl, Ah-Soon, Christian, Dosch, Philippe, Masini, Gérald, och<br />

Tabbone, Salvatore. Stable and robust vectorization: How to make the<br />

right choices. Lecture Notes in Computer Science, 1941:3–??, 2000. URL<br />

http://citeseer.ist.psu.edu/tombre99stable.html.<br />

Watt, Alan H. 3D Computer Graphics, 3rd edition. Addison Wesley, 2000.<br />

Wenyin, Liu, Wang, Xiaoyu, Tang, Long, och Dori, Dov. Impact of sparse<br />

pixel vectorization algorithm parameters on line segmentation performance.<br />

I: GREC, ss 335–344, 1999.<br />

52


WinTopo, 2006. Wintopo onlinedokumentation, maj 2006. URL<br />

http://homepage.ntlworld.com/heatons/softsoft/wintopo/help/<br />

html/vectorise.htm.<br />

Zhang, T. Y. och Suen, C. Y. A fast parallel algorithm for thinning digital<br />

patterns. Commun. ACM, 27(3):236–239, 1984. ISSN 0001-0782.<br />

53


TRITA-CSC-E 2006:095<br />

ISRN-<strong>KTH</strong>/CSC/E--06/095--SE<br />

ISSN-1653-5715<br />

www.kth.se

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!