Programmering för avläsning och avkodning av QR-koder i MATLAB



Relevanta dokument
Ett enkelt OCR-system

Laboration 4: Digitala bilder

Ansiktsigenkänning med MATLAB

Fingerprint Matching

Tentamen, Programmeringsteknik för BME, F och N

Bildbehandling, del 1

Bildbehandling i frekvensdomänen

Medicinska Bilder, TSBB31. Lab: Mätvärden på Medicinska Bilder

Medicinska Bilder, TSBB31. Lab: Mätvärden på Medicinska Bilder

Övervakningssystem. -skillnader i bilder. Uppsala Universitet Signaler och System ht Lärare: Mathias Johansson

Digitalitet. Kontinuerlig. Direkt proportionerlig mot källan. Ex. sprittermometer. Elektrisk signal som representerar ljud.

Laboration 1. Grafisk teknik (TNM059) Introduktion till Matlab. R. Lenz och S. Gooran (VT2007)

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013)

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

QR-KODER. En kort guide till hur du bör tänka när du använder QR-koder i dina kampanjer.

Projekt 2 (P2) Problembeskrivning och uppdragsspecifikation

TANA17 Matematiska beräkningar med Matlab

Hantera andragradskurvor del 2

Bildförbättring i spatial domänen (kap. 3) Bildförbättring (enhancement) Spatial domän. Operatorer. Tröskling (threshold) Gråskale-transformationer

Tentamen Bildanalys (TDBC30) 5p

TAIU07 Matematiska beräkningar med Matlab

Histogram över kanter i bilder

5 Linjär algebra. 5.1 Addition av matriser 5 LINJÄR ALGEBRA

Projekt i bildanalys Trafikövervakning

Funktionsstudier med derivata

Laboration i Fourieroptik

Programmering. Den första datorn hette ENIAC.

Medicinska Bilder, TSBB31. Lab3: Mätvärden på Medicinska Bilder

i LabVIEW. Några programmeringstekniska grundbegrepp

Robotarm och algebra

Frågorna 1 till 6 ska svaras med ett kryss för varje korrekt påstående. Varje uppgift ger 1 poäng. Använd bifogat formulär för dessa 6 frågor.

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 9 november 2015 Sida 1 / 28

Att använda bildhanteringsprogram, del 2

Logik och Jämförelser. Styrsatser: Villkorssatsen if och repetitonssatsen for. Scriptfiler. Kommentarer. Tillämpningar: Ett enkelt filter.

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

3 Man kan derivera i Matlab genom att approximera derivator med differenskvoter. Funktionen cosinus deriveras för x-värdena på följande sätt.

MMA132: Laboration 2 Matriser i MATLAB

Uppgift 1 (vadå sortering?)

LINJÄRA AVBILDNINGAR

TEM Projekt Transformmetoder

Manual för ett litet FEM-program i Matlab

Komponentvisa operationer,.-notation Multiplikation (*), division (/) och upphöj till (ˆ) av vektorer följer vanliga vektoralgebraiska

DT1130 Spektrala transformer Tentamen

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Mer om analytisk geometri

Beräkningsvetenskap föreläsning 2

FMCK Malmö Boris Magnusson. Markering av Endurobana

Mätning av fokallängd hos okänd lins

Introduktion till algoritmer - Lektion 1 Matematikgymnasiet, Läsåret Lektion 1

ENKEL Programmering 3

Laboration 3. Redovisning Uppgifterna skall vara demonstrerade och godkända av en handledare senast måndag 22/2.

Konturbearbetning 1. Innehåll

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Bildmosaik. Bilddatabaser, TNM025. Anna Flisberg Linne a Mellblom. linme882. Linko pings Universitet

Mobil streckkodsavläsare

Signaler, information & bilder, föreläsning 15

Uppgift 1 ( Betyg 3 uppgift )

L A B R A P P O R T 1

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 27 oktober 2015 Sida 1 / 31

bilder för användning

Bildanalys. Segmentering. Föreläsning 7. Split and Merge. Region Growing

Linjär algebra på några minuter

Tentamen, Algoritmer och datastrukturer

Uppgift 1 ( Betyg 3 uppgift )

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

Specifikation av kandidatexjobb

kl Tentaupplägg

Skurlängdskodning. aaaabbbbbbbccbbbbaaaa. Man beskriver alltså sekvensen med ett annat alfabet än det ursprungliga.

Introduktion till MATLAB

Signalbehandling Röstigenkänning

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Sekantmetoden Beräkningsmatematik TANA21 Linköpings universitet Caroline Cornelius, Anja Hellander Ht 2018

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Uppgift 1 (grundläggande konstruktioner)

Andragradsekvationer möter elever under sitt första år på gymnasiet.

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

2011 Studsvik AB PANORAMA-BILDTAGNING. Tony Björkman

Datalogi för E Övning 3

Inledande programmering med C# (1DV402) Summera med while"-satsen

UPPGIFT 1 TVÅPOTENSER. UPPGIFT 2 HISSEN I LUSTIGA HUSET.

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Länkning av Prolog under C

DN1212/numpm Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

Mina listor. En Android-applikation. Rickard Karlsson Rickard Karlsson - rk222cu Linnéuniversitet rk222cu@student.lnu.

Säsongrensning i tidsserier.

NU NÄR DU BEKANTAT DIG MED RAMARNAS EGENSKAPER OCH VET. hur man markerar och ändrar dem, är det dags att titta lite närmare på

Bildbehandling i frekvensdomänen. Erik Vidholm

UPPGIFT 1 TVETYDIGA DATUM

Vektorgeometri för gymnasister

Lab5 för prgmedcl04 Grafik

L04.1 Marodören. Inledning. Mål. Genomförande. Uppgift 1 Hello World. Moment I

Lösningsförslag till övningsuppgifter, del V

Kodning av ansiktstextur med oberoende komponenter

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

729G11 Artificiell Intelligens Marcus Johansson Marjo581. Fuzzy logic. Marcus Johansson Marjo581

Att använda pekare i. C-kod

Projekt 6. Fourieroptik Av Eva Danielsson och Carl-Martin Sikström

Laboration 4: Stora talens lag, Centrala gränsvärdessatsen och enkla punktskattningar

6 Derivata och grafer

MATEMATIK GU. LLMA60 MATEMATIK FÖR LÄRARE, GYMNASIET Analys, ht Block 5, översikt

Transkript:

ITN, Norrköping 4 december 2011 Programmering för avläsning och avkodning av QR-koder i MATLAB PROJEKT I AVANCERAD BILDBEHANDLING OCH BILDANALYS TNM034 Medlemmar: Henrik Bäcklund Anders Hedblom Niklas Neijman Kontakt: henba892@student.liu.se andhe893@student.liu.se nikne866@student.liu.se

Sammanfattning Användning av QR-koder blir allt vanligare i vårt moderna samhälle. Idag syns de överallt och underlättar sökningsprocesser och informationshämtning för de som bär på en smart phone. QRC står för Quick Response Code, det vill säga snabbt gensvars-kod. Grundidén är att man vill kunna läsa av den tvådimensionella koden med en kamera och snabbt få ut större mängder information. Bilden måste genomgå ett antal procedurer, så som inläsning till ett program, tröskling, justering för diverse distorsioner samt avkodning. Det finns givetvis olika sätt att genomföra detta på. Den här rapporten tar upp några av dessa men koncentrerar sig i huvudsak på att beskriva den metod som användes under ett projekt i kursen Avancerad Bildbehandling och Bildanalys TNM034, vid Linköpings Universitet, höstterminen 2011. Programmet som använts för att lösa QRC-projektet är MATLAB, som lämpar sig bra för de flesta typer av kodad bildbehandling. En nackdel med MATLAB är att det är ett relativt slött program i jämförelse med exempelvis applikationer som är kodade i C++. Fördelarna överväger dock MATLAB s Image Processing Toolbox innehåller en rad färdiga funktioner som lämpar sig ypperligt till detta projekt. Alla färdiga funktioner som har använts förklaras, men inte i detalj. Den här rapporten tar upp teori och tillvägagångssätt som använts för att avläsa och avkoda QR-koder i godtyckliga omgivningar.

Innehållsförteckning 1 Inledning 1 1.1 Syfte........................................ 2 2 Metod 3 2.1 Beteckningar................................... 3 2.2 Importering av bilder till MATLAB....................... 3 2.3 Tröskling och brusreducering........................... 4 2.4 Hitta QR-koden i bilden.............................. 7 2.4.1 Hitta referensmarkeringar (FM)..................... 7 2.4.2 Algoritmen................................ 8 2.4.3 Hitta upprätningsmarkeringen (AP)................... 10 2.5 Transformering.................................. 11 2.6 Morfologiska operationer............................. 12 2.7 Avkodning..................................... 13 3 Resultat 15 3.1 Erhållen text från testbilderna........................... 15 3.2 Exempelbild.................................... 15 4 Avslutning 16 4.1 Andra metoder.................................. 16 4.2 Diskusion..................................... 17 Litteraturförteckning 18

Figurer 1.1 Exempel på bild som skall avkodas........................ 2 2.1 Inläst bild. Tydligt förvrängd och förstörd av brus................. 3 2.2 Histogram för hela bilden............................. 4 2.3 Skalad version av histogramet........................... 4 2.4 Utjämnat histogram................................ 5 2.5 Skalad version av utjämnat histogram....................... 5 2.6 Trösklad version av bilden. Här har alla pixlar värdet noll eller ett....... 6 2.7 Utseendet på en av de tre referensmarkeringarna. Källa: [4]........... 7 2.8 Ett möjligt fall av extremt perspektiv....................... 8 2.9 Hoplagd horisontell och vertikal sökning. De röda ringarna är tillagda efteråt för att illustrera var det bildas kryss, dvs mittpunkterna för FM......... 10 2.10 Utseende på upprätningmarkering......................... 10 2.11 Bilden visar vilket FM som väljs först, beroende på rotation........... 11 2.12 QR-koden upprättad och transformerad. Lägg märke till att koden både roterats och tryckts ihop................................... 12 2.13 Bilden har snyggats till med funktionen bwmorph()................ 13 2.14 Mappad bild. De enstaka mappade pixlarna är de som kommer att läsas av vid avkodningen.................................... 14 3.1 En av de mer förvrängda bilderna, mappad och klar. Förstoringen är tillagd i efterhand...................................... 15

Kapitel 1 Inledning QR-kod [1] är en kodform ursprungligen skapad av Toyota för att på ett snabbt och enkelt sätt kunna hålla reda på sina bilar under tillverkningsprocessen. QR står för Quick Response och grundar sig i att avläsning av den tvådimensionella koden snabbt ska ge ett resultat. De är även kända för att innehålla relativt mycket information jämfört med den yta de upptar. Då det idag nästan är en självklarhet att mobiltelefoner har en kamera inbyggd i sig blir QR-koden allt mer vanlig i dagens samhälle. QR-koder kan idag hittas i många situationer. Tidningsannonser är ett av de områdena där läsaren snabbt och enkelt med mobilens hjälp kan ta kort avläsa koden och i många fall bli länkad vidare till ytterligare information om den aktuella annonsen. Ett annat exempel är bibliotek, som sätter en QR-kod på böckernas ram. Man kan då enkelt se hur många exemplar av boken som finns inne och även direkt via mobilen göra en reservation av boken. I denna rapport beskrivs i huvudsak ett tillvägagångssätt för att avkoda bilder som innehåller delvis förvrängda QR-koder. Andra tillvägagångssätt kommer också att diskuteras men inte förklaras i detalj. Rapporten börjar med den del som handlar om hur brus reduceras och därefter hur man finner ett bra värde att tröskla bilden med. Detta för att få en binär bild, där vita och svarta QR-pixlar är så väl uppdelade som möjligt. Med bilden brusreducerad och trösklad beskrivs sedan i rapporten hur man upptäcker de så kallade Fiducial Marks och Alignment Pattern (Referens- och upprätningsmarkeringar). Det är med hjälp av dessa som QR-koden kan upptäckas i en rörig omgivning. Dessa markeringar är även möjliga att använda som referenspunkter när bilden ska transformeras för att få bort eventuella rotationer, skjuvningar och förvrängningar. Detta förklaras i avsnittet om transformering. Innan man ger sig in på avkodning bilden så utförs en del morfologiska operationer för att återställa de delar av meddelandet som eventuellt är förstört. Det kan handla om pixlar som har hamnat fel eller fått felaktigt värde. Efter detta följer proceduren på hur det faktiska meddelandet utvinns. Här handlar det om att omvandla de svartvita binära fälten till tecken. Rapporten redovisar därefter resultaten som erhållits som följs av en avslutning. Här diskuteras även andra metoder för att lösa problemet med avläsning och avkodning av QR-koder. Detta projekt är begränsat att endast behandla QR-koder med ett visst antal QR-pixlar. Avkodning sker heller inte enligt standard, utan bit för bit med ASCII-kod. Detaljer hittas i [2]. 1

1.1 Syfte Syftet med denna rapport är bland annat att: Visa vad QR-koder kan användas till Förklara ingående hur man kan avläsa och avkoda dessa Dokumentera för- och nackdelar med den valda metoden Ge insikt i vilka problem som kan uppstå Figur 1.1: Exempel på bild som skall avkodas. 2

Kapitel 2 Metod 2.1 Beteckningar Beteckningar som används genom rapporten är: Skalärer gemener (a), Matriser/Vektorer versaler (A), Referensmarkeringar (Fiducial Marks) FM, Upprätningsmarkering (Alignment Pattern) AP. 2.2 Importering av bilder till MATLAB Importering av Bilder till MATLAB görs enklast med den inbyggda funktionen imread(). Bilderna som används i projektet är tagna från [3]. För att kunna jobba vidare med bilderna används funktionen im2double() för att säkerställa att alla pixelvärden är av typen double. Det är även önskvärt att kunna hantera både färgbilder och svartvita bilder. Eftersom hantering av dessa två typer av bilder är väldigt annorlunda är det önskvärt att konvertera alla färgbilder till svartvita sådana. Detta görs med en enkel if-sats direkt efter bildinläsningen. Om bilden är en färgbild används funktionen rgb2gray() som returnerar en gråskalebild. Figur 2.1 visar den inlästa bilden. Figur 2.1: Inläst bild. Tydligt förvrängd och förstörd av brus. 3

2.3 Tröskling och brusreducering För att underlätta processen att hitta QR-kodens FM behövs en bild där informationen i QR-koden är tydlig. Koden blir tydlig genom att reducera bruset i bilden och därefter tröskla den. Genom att använda ett medelvärdesfilter av storleken 3x3 kan bruset i en bild reduceras. Medelvärdesfiltret gör att närliggande pixlar får en mindre variation med avseende på intensitet. När medelvärdesfiltret applicerats och bilden blivit brusreducerad ska bilden trösklas. Värdet att tröskla med bestäms genom att använda dess histogram. Ett bra trösklingsvärde är ett värde som motsvarar det lokala minimumet mellan de två övervägande intensitetskällorna, vilket kan ses i mitten av figur 2.2. Figur 2.2: Histogram för hela bilden. Genom att titta på hur derivatan skiftar tecken kan det lokala minimumet hittas. Problemet är dock att det finns mer än ett lokalt minimum mellan de två intensitetskällorna. Detta framgår av figur 2.3, som är en förstoring av området mellan de två övervägande intensiteterna. För att Figur 2.3: Skalad version av histogramet. göra histogrammet jämnare faltas detta med ett normaliserat gaussfönster av längden 50. Efter faltningen ser histogrammet ut enligt figur 2.4 4

Figur 2.4: Utjämnat histogram. De lokala minimumen har nu reducerats till ett lokalt minimum vid intensiteten som ligger mellan de två övervägande intensitetskällorna enligt figur 2.5, som är en förstoring av figur 2.4. Figur 2.5: Skalad version av utjämnat histogram. Faltningen med gaussfönstret förskjuter signalen. Därför subtraheras halva filterlängden från den förskjutna intensiteten för att finna det verkliga trösklingsvärdet. Bilden trösklas slutligen med det funna tröskelvärdet. Resultatet på den trösklade bilden kan ses i figur 2.6. 5

Figur 2.6: Trösklad version av bilden. Här har alla pixlar värdet noll eller ett. 6

2.4 Hitta QR-koden i bilden Att upptäcka en QR-kod i en godtycklig bild är inte så enkelt som man skulle kunna tro. Människan är duktig på att hitta mönster och symboler i kaos, men för en dator betyder ingen pixel i en bild mer än någon annan pixel. En bild kan sökas igenom på flera sätt. Det mest intuitiva är att titta på pixel för pixel tills man har genomsökt hela bilden. Ett sätt att göra detta på är att börja uppe i översta vänstra hörnet och söka sig åt höger längs med första raden. När radslut nås hoppar man ner till raden under för att upprepa rörelsen. MATLAB är optimerat för att arbeta med matrisoperationer. Det vill säga, istället för att jobba med ett värde i taget kan många värden i en matris, vilket är just vad en bild är, behandlas. Däremot kan det vara lättare att använda sig av nästlade loopar om det är önskvärt att jobba på ett enda värde i taget. Det vill vi i detta fall. Detta stycke kod visar hur vi kan gå igenom bildens alla pixlar för att hitta någonting som liknar en QR-kod. Frågan är; hur vet vi när vi stöter på en QR-kod om vi bara tittar på en pixel åt gången? Att pixeln är svart eller vit säger i sig ingenting alls. Det är följden av svarta och vita pixlar som är intressant. 2.4.1 Hitta referensmarkeringar (FM) För att QR-koder ska kunna hittas i godtyckliga omgivningar har de begåvats med så kallade fiducial marks. Dessa utmärker sig genom att skapa ett visst förhållande i svarta och vita pixlar, när man skannar dem, oavsett i vilken riktning detta sker i. Det spelar heller ingen roll hur stor QR-koden är i jämförelse med sin omgivning. Så hur ser då ett FM ut? Det visar figur 2.7. Här visas även att det inte spelar någon roll hur markeringen avläses, så länge detta sker i en rät linje. Figur 2.7: Utseendet på en av de tre referensmarkeringarna. Källa: [4]. Ett förhållande, 1 : 1 : 3 : 1 : 1, av svarta och vita pixlar kommer alltid att erhållas vid en perfekt skanning. Detta stämmer dock inte helt i verkligheten. 7

Eftersom en bild är uppbyggd av ett finit antal pixlar är det omöjligt att få en perfekt avbildning av en QR-kod, så vida dess sidor inte är helt lod- och vågräta. Detta uppnås i princip bara i fall med artificiellt skapade koder sådana som inte är inlästa med hjälp av en kamera. Vad det innebär är att ett perfekt förhållande av olikfärgade pixlar kommer aldrig att fås. Därför krävs en viss tillåten felmarginal hos mätningarna. Ett värde som ska vara 1 kan tillåtas att ligga mellan 0.7 och 1.3. Det är såklart endast i extrema fall som värdena faktiskt kommer att skilja sig så mycket, men det kan inträffa. Exempelvis om särskilda morfologiska operationer har utförts på den trösklade bilden för att ta bort avstickande pixlar etc. Ytterligare problem uppstår när bilden är förvrängd, det vill säga, bildens normal inte är ortogonal med kamerariktingen. Markeringarna kan då se ut på följande sätt: Figur 2.8: Ett möjligt fall av extremt perspektiv När ett FM ser ut som ovan inträffar det problem att en linjär förskjutning av förhållandet har skapats. Det kanske nu istället motsvarar 1.4 : 1.2 : 3 : 0.8 : 0.6. Problemet kan dock lösas till viss grad genom att man tittar på förhållanden mellan adderade områden. Vi lägger ihop det första och andra området, det andra och tredje området och så vidare. I den perfekta avläsningen skulle då förhållandet av olikfärgade pixlar bli 2 : 4 : 4 : 2, vilket även är noterat i figur 2.7. På så vis blir avläsningsalgoritmen mycket mindre känslig för störningar. Att använda dessa metoder för att skapa felmarginaler är i princip helt nödvändigt för att kunna hitta och läsa av QR-koder i mer komplicerade bilder. 2.4.2 Algoritmen Det är som tidigare sagt önskvärt att finna det magiska förhållandet hos ett FM, eller närmare bestämt tre stycken, för att kunna läsa av en QR-kod. Följande avsnitt förklarar hur avläsningsalgoritmen fungerar. Enligt den nästlade for-loopen, i stycket Hitta QR-koden, loopas den valda bildens pixlar igenom, en efter en. Bilden är sedan tidigare trösklad, så det som kan inträffa är antingen att en pixel har värdet 1 (den är vit), eller att den har värdet 0 (den är svart). När en svart pixel upptäcks för första gången innebär detta att vi skulle kunna befinna oss i den yttersta kanten av ett FM. Bilden måste skannas vidare för att vi säkert ska veta. Men för att kunna jämföra med kommande pixlar behöver föregående pixlar sparas undan i en vektor med fem element. Denna vektor kallas framöver för V. Det behöves också en variabel p som håller reda på i vilket element i V vi befinner oss. Just nu har alla element i vektorn V, förutom det första, värdet noll. Variablen p har värdet ett. I V (p) tillökas värdet med ett på grund av den svarta pixeln. Så länge svarta pixlar fortsätts att läsas händer inget annat än att värdet i samma position i V ökas på med ett för varje svart pixel som hittas. När en vit pixel stöts på händer nu fler saker. 8

1. Eftersom detta är i början av bilden vet vi att p har värdet ett. Men det skulle också ha kunnat röra sig om det vita området efter mittensektionen i FM. Vi måste alltså kolla, om p = 1 p = 3, då ska p tillökas med värdet ett. I nuvarande fall hamnar vi i element två i V. Denna position är nu redo att fyllas med antalet kommande vita pixlar. 2. Vi måste också kolla om p = 5. Om detta är sant har vektorn V fyllts med varierande svarta och vita pixlar och har upptäckt den första vita pixeln utanför ett potentiellt FM. Nu jämförs alla värden i V enligt tidigare regler. Stämmer förhållandet mellan värdena har ett FM hittas och positionen sparas (aktuell rad är känd och kolumnen till positionen är aktuell kolumn V (5) V (4) V (3)/2). Koordinaterna sparas i en 2x3-matris, som i slutändan kommer innehålla alla tre FM. Om förhållandena stämmer måste V också nollställas! Proceduren börjar om på nytt vid intilliggande pixel. 3. Om p = 5, men förhållandet inte stämmer (dvs. ett FM hittades inte), måste alla element propageras två steg åt vänster i V. Det vill säga, position 1 får värdet från position 3 och så vidare. V (4) tilldelas ett, eftersom en vit pixel trots allt hittades och V (5) tilldelas noll. Positionen p tilldelas värdet 4 och uppstegandet av vita pixlar i denna position i V fortsätts. 4. Om fall 1 och 2 är falska kan värdet i V (p) lugnt ökas på, eftersom p då har värdet två eller fyra positionen för vita pixlar. Allmänt om en svart pixel upptäcks gäller: 1. Om p = 2 p = 4, öka p med ett. 2. Om fall 1 inte är sant, tillöka V (p). Hela operationen skulle kunna liknas vid en faltning, där en fem element stor vektor sveper över en stor matris. Sökningsalgoritmen körs två gånger; en för att göra en avsökning i horisotalled och en i vertikalled. Varje anrop kommer att skapa en pixelbild, med samma storlek som originalbilden. Där det eftertraktade förhållandet (2 : 4 : 4 : 2) hittas, ritas en vit pixel med värdet ett ut. Det är det sammanlagda resultatet av dessa två funktionsanrop som räknas. Där pixlarna från de båda sökningarna adderas ges värdet två i de koordinater som FM s mittpunkt befinner sig i. Här är nämligen de enda positioner som pixlarna korsas. Dessa positioner hittas med funktionen find() och har ringats in i figur 2.9. 9

Figur 2.9: Hoplagd horisontell och vertikal sökning. De röda ringarna är tillagda efteråt för att illustrera var det bildas kryss, dvs mittpunkterna för FM. 2.4.3 Hitta upprätningsmarkeringen (AP) Förhoppningsvis finns nu en matris med positionerna för alla tre FM; allt som behövs för att lokalisera QR-koden i bilden. Kommande steg är att göra en transformation av hela bilden för att korregera distorsioner eller förvrängningar i bilden, så som perspektiv, rotation, skevning eller oproportionerlig skalning. För att kunna utföra perspektivtransformation krävs en fjärde referenspunkt. Detta brukar kallas för alignment pattern, då det används till att räta upp QR-koden till en rak kvadrat. Ett alignment pattern kan se ut som i figur 2.10. Figur 2.10: Utseende på upprätningmarkering. Det skulle vara möjligt att använda samma metod för att hitta AP som för FM, men det medför vissa problem. Eftersom AP har en mittpunkt på endast en QR-pixels storlek är det lätt hänt att man hittar ett liknande mönster i resterande kod. I det här projektet löstes problemet genom att använda en av MATLAB s inbyggda funktioner; regionprops() [5]. Följande stycke kod visar hur man kan hitta ett AP eller FM genom att hitta tyngdpunkten för ett område, som motsvaras av den vita ringen i FM eller den svarta ringen i AP. 10

Eftersom regionprops(image, centroid ) ger ifrån sig fler än den önskade punkten måste man avgöra vilken som är den eftertraktade. Eftersom tre FM redan har hittats, kan ungefärlig uppskattning om var AP borde ligga göras, med hjälp av enkel trigonometri. 2.5 Transformering För att underlätta avläsningen och mappningen av alla QR-pixlarna krävs det att QR-koden är korrekt placerad och att den är kvadratisk. Dvs. det får inte förekomma någon form av distorsion, av koden, t.ex. att bilden i fråga har fotats från en vinkel som ger att QR-koden blivit förvrängd. Detta kan lösas genom att applicera en transformationsmatris på bilden. För att transformationen ska fungera korrekt måste fyra punkter (tre FM och en AP) i QR-koden lokaliseras i den otransformerade bilden, som diskuterades i delkapitel 2.4. Om inte dessa fyra punkter hittas misslyckas hela transformationen. När punkterna är lokaliserade, måste rotationen av QR-koden tas till hänsyn eftersom f ind() söker kolumnvis. Om bilden är roterad medurs så kommer punkten som är i det nedre-vänstra hörnet att lokaliseras först, annars lokaliseras punkten i övre-vänstra hörnet först, vilket illustreras i figur 2.11. Figur 2.11: Bilden visar vilket FM som väljs först, beroende på rotation. Anledningen till det här är att punkterna placeras på olika positioner i vektorn som lagrar punkterna och det är avgörande för den slutliga transformationen av QR-koden. Transformationsmatrisen beräknas med hjälp av funktionen cp2tform() [6]. För att kunna beräkna transformationen behövs tre inparametrar till funktionen; placeringen av FM i den 11

otransformerade bilden, referenspunkter och vilken typ av transform som ska genomföras vilket är projective. Referenspunkterna är de punkter som bestämmer hur den slutliga QR-koden/bilden ska transformeras. De avgör även formen och upplösning/skala på den transformerade QR-koden. Referenspunkterna och FM i den otransformerade bilden sparas i 2x2 matriser, där elementen i matrisen innehåller koordinaterna för punkterna. Dessa två matriser används sedan som inparameterar till cp2tform() tillsammans med transformationsmetoden projective. Metoden kan hantera rotationer, skjuvningar, perspektivförvrängningar m.m. Detta medför att distorsionen av bilden endast behöver lösas med hjälp av cp2tform(), vilket även bidrar till minskad beräkningstid av den slutliga algoritmen. Den slutliga transformationen sker med funktionen imtransf orm() [7]. Funktionen har följande inparametrar; transformationsmatrisen från cpt2tf orm()och bilden som ska transformeras. Slutligen erhålls en ny transformerad bild som visas i figur 2.12. Figur 2.12: QR-koden upprättad och transformerad. Lägg märke till att koden både roterats och tryckts ihop. 2.6 Morfologiska operationer Ibland kan det vara bra att ta bort eller fylla ut pixlar som har uppstått under t.ex. trösklingen. Dessa pixlar tillför falsk information och därav kan förstöra det slutliga resultatet. För att reducera/fylla dessa pixlar används morfologiska operationer. Det som visas i figur 2.12 är bilden innan operationerna är applicerade där vi kan se att kanterna är taggiga och ojämna. Det finns ett antal morfologiska operationer att välja på för att förbättra QR-koden och operationerna som används är öppning och stängning. Dessa två operationer appliceras på bilden med hjälp av funktionen bwmorph() [8]. Funktionen har följande inparametrar; bilden 12

som operationerna ska appliceras på och vilken typ av operation. Tillbaka ger funktionen en förbättrad bild (figur 2.13) som ska mappas för avkodning. Figur 2.13: Bilden har snyggats till med funktionen bwmorph(). Den största orsaken till att operationerna används är att fylla igen pixlar så att mappningen kan ske utan störningar. Bl.a. om det förekommer att en svart QR-pixel har några pixlar som är vita eller tvärt om. Mappningen i denna pixel skulle kunna placeras precis på en av de felaktiga pixlarna och därav avkoda till en etta istället för nolla (och vice versa). 2.7 Avkodning Genom att känna till hur många bildpixlar som motsvarar en QR-pixel är det möjligt att hitta en bra startposition för avkodningen. Startkolumnens värde hittas genom att subtrahera tre QR-pixlar från det övre vänstra FM s kolumnvärde. Startraden hittas på motsvarande sätt genom att addera fem QR-pixlar till FM s radvärde. Då QR-koden alltid innehåller ett fast antal QR-pixlar (1464 st) har denna avkodningsmetod formats för just detta antal. Utifrån startpositionen påbörjas en iterativ process att kolumnvis (vänster till höger) hämta information (uppifrån och ner) där varje kolumn- eller radsteg motsvarar en QR-pixel. Metoden är uppbyggd för att inte hämta information från FM då deras syfte inte är att bära meddelandeinformation. Innan en avkodning av QR-kodens bitar kan göras utförs en mappning med exakta positioner. Här placeras enstaka pixlar ut i mitten av de olika QR-pixlarna. Om fältet är svartfärgat sätts en vit pixel och vice versa. Detta för att det tydligt ska gå att se hur mappningen har gjorts, vilket visas i figur 2.14. 13

Figur 2.14: Mappad bild. De enstaka mappade pixlarna är de som kommer att läsas av vid avkodningen. När den binära informationen erhållits från avkodningen återstår det att utvinna medelandet från den. Funktionen för att gå från binär representation av ett tal till ett faktiskt heltal (bin2dec()) enbart accepterar inpararmetrar av datatypen char så används funktionen num2str() i just syftet att erhålla denna matris av char. Då varje tecken i ASCII-kod är representerat av åtta bitar matas funktionen bin2dec() med just åtta element i taget. Resultatet är en matris med element innehållande heltal mellan 0 255. Dessa heltal används sedan som inparametrar till funktionen char() där t.ex. inparametern 66 resulterar i utparametern B. Slutresultatet blir en lång textsträng. 14

Kapitel 3 Resultat 3.1 Erhållen text från testbilderna Efter att de till projektet tillhörande bilderna hade avkodats hittades två olika meningar: Byggbutiken online! URL: http://www.byggstommar.se Typ: Fastigheten Älmhult Jämnhult 1:28. Friliggande villa. Byggår 1980. Boarea ca 260 m 2, biarea ca 70 m 2. Areauppgifter enligt säljaren. 6 rum, varav 4 sovrum. Tomtarea 4 514 m 2. Där den första avkodas från alla Bygg X-bilder och den andra från Hus X-bilderna. 3.2 Exempelbild Figur 3.1: En av de mer förvrängda bilderna, mappad och klar. Förstoringen är tillagd i efterhand. 15

Kapitel 4 Avslutning 4.1 Andra metoder Det finns många sätt att avläsa och avkoda QR-koder, utan tvivel flera som är bättre än metoden som använts i detta projekt, både vad gäller snabbhet och precision. Metoden som använts att söka igenom hela bilden med for-loopar och leta efter FM s kan verka intuitiv och enkel att förstå. Men det är en slö operation som skalar dåligt med bildens storlek/upplösning. Eftersom algoritmen söker efter FM inte bara en gång, utan två (en innan transformation och en efter) kommer beräkningstiden att öka mer än kvadratiskt med ökad pixelmängd. Mer än, eftersom en relativt tung transformation också utförs på bilden, vilken blir jobbigare ju större bilden är. Säg att bildens bredd och höjd ökas till det dubbla. En fyra gånger så stor mängd av pixlar erhålls då. Det innebär att vi har två anrop av hitta FM och en transformation, som alla kommer att ta ungefär fyra gånger så långt tid att utföra. Lägg sedan till ökad tid i ytterligare funktioner, så som histogramberäkningar, morfologiska operationer och avkodning. Vi kan alltså med säkerhet säga att denna metod lämpar sig bäst för mindre bilder om man ska få ett resultat inom rimlig tid. I slutet av projektet lades även tid på att implementera en annan metod. MATLAB s egna funktion regionprops() användes, som bekant, till att hitta AP. Vi provade att använda denna på hela bilden, även för att hitta FM. Metoden fungerade på följande vis: Hitta alla centrumpunkter med regionprops() på en trösklad bild. För att veta vilka som är FM och AP, och inte bara överflödiga områden, användes en algoritm som liknas vid den i kapitel 2.4.2. För alla centrumpunkter skannas området både åt höger och vänster. Om ett sammanslaget mönster av svarta och vita pixlar, enligt 1 : 1 : 3 : 1 : 1-förhållandet, hittas måste detta vara ett FM. På så vis undviker man att skanna majoriteten av bilden och koncentrerar sig på områden som har potential att vara gynnsamma. Här sparas enorma mängder beräkningstid. Dock slopades metoden eftersom den verkade instabil och fungerade inte på alla bilder. Problem uppstod t.ex. om ett FM fick två centrumpunkter. Ytterligare metoder till att lösa projektuppgiften på skulle kunna vara att applicera ett Laplace-filter på hela bilden. Vad detta ger är att återspegla höga frekvenser i bilden. Där det blir stora förändringar, som mellan en svart och vit pixel, blir utslaget maximalt. Där det inte händer särskilt mycket, i resterande bild, ger Laplace-filtret låga utslag. Resultatet blir en i stort sett svart bild där QR-kodens kanter blir markerade med vita linjer. Grundtanken är bra, men metoden medger många problem. Ett fotografi på en QR-kod kommer antagligen inte att återge denna som helt svart och vit. En bild på en himmel bakom ett hus ger troligtvis en högre kontrast mellan mörkt och ljust. Därför kommer man inte att veta 16

vilken intensitet hos pixlar i den Laplace-filtrerade bilden man ska leta efter. Endast i artificiellt skapade bilder med en perfekt svart-vit QR-kod kommer man att erhålla fullt vita kanter. Ett annat problem är att man fortfarande måste lokalisera FM och AP, i den funna QR-koden, vilket leder till algoritmer som liknar tidigare diskuterade. Det blir en aning tårta på tårta. En annan del som går att förbättra är avkodningsdelen där programmet är programmerat för att endast fungera för ett fast antal QR-pixlar. Vi ger här efter ett förslag på hur denna begränsning kan undvikas. Ett sätt att göra programmet mer generellt är att använda sig av FM s bredd och utifrån denna bredd få fram hur bred en QR-pixel är. Med denna information om QR-pixelns storlek är det enkelt att ta fram hur många QR-pixlar som finns att avkoda. 4.2 Diskusion Alla bilder som använts under träningsfasen har gått igenom vår avkodningsalgoritm, som ger text motsvarande det kodade meddelandet. Exemplet i resultatet är en av de svårare träningsbilderna att avkoda i och med att bilden är förvrängd på flera olika sätt, dvs. det är en kombination av brus, rotation och perspektiv. Då avkodningsalgoritmen hanterar dessa svåra kombinationer anser vi att det är en säker metod. Metoden kan dock inte anses vara perfekt då avkodningsalgoritmen inte hanterar extrema fall av förvrängningar, så som kraftigt perspektiv eller rörelseoskärpa. Dessa svårare fall har valts att bortse från, då projektet endast är tänkt för att förstå grundprincipen av den bildbehandling som behövs i avläsning och avkodning av QR-koder. Avkodningsalgoritmer av kraftfullare typ förekommer ofta i mobiltelefoner och andra handhållna enheter. Det är då möjligt att ta en ny bild med förvrängning i mindre skala, samt att ett snabbare programmeringsspråk kan användas. Tid har inte varit prioritet i detta projekt då MATLAB i allmänhet är en relativt seg programmeringsmiljö. Tiden som det tar att avkoda en inläst bild varierar med storlek på bilden. De mindre bilderna tar 1-3 sekunder på sig, medan de högupplösta tar upp emot 10 sekunder. 17

Litteraturförteckning [1] Luiz F. F. Belussi and Nina S. T. Hirata. Fast QR Code Detection in Arbitrarily Acquired Images. Department of Computer Science, Institute of Mathematics and Statistics, University of São Paulo São Paulo, Brazil. Senast hämtad 2011-11-20. [2] Björn Kruse. Advanced Image Processing, TNM034, QR-code processing. Institutionen för teknik och naturvetenskap, Linköpings universitet. Senast hämtad 2011-12-03. [3] Björn Kruse. http://www.student.itn.liu.se/kursmaterial/tn/m/ TNM034/Training/. Senast hämtad 2011-11-25. [4] Chung-Hua Chu, De-Nian Yang, Ya-Lan Pan, Ming-Syan Chen. Stabilization and extraction of 2D barcodes for camera phones. Received: 7 March 2010 / Accepted: 30 September 2010 / Published online: 21 October 2010 c Springer-Verlag 2010 [5] c 1984-2011- The MathWorks, Inc. http://www.mathworks.se/help/ toolbox/images/ref/regionprops.html. Senast hämtad 2011-12-04. [6] c 1984-2011- The MathWorks, Inc. http://www.mathworks.se/help/ toolbox/images/ref/cp2tform.html. Senast hämtad 2011-12-04. [7] c 1984-2011- The MathWorks, Inc. http://www.mathworks.se/help/ toolbox/images/ref/imtransform.html. Senast hämtad 2011-12-04. [8] c 1984-2011- The MathWorks, Inc. http://www.mathworks.se/help/ toolbox/images/ref/bwmorph.html. Senast hämtad 2011-12-04. 18