Wektoryzacja prostych schematów układów
Transkrypt
Wektoryzacja prostych schematów układów
Politechnika Warszawska Rok akademicki 2011/2012 Wydział Elektroniki i Technik Informacyjnych Instytut Informatyki PRACA DYPLOMOWA INŻYNIERSKA Piotr Krzysztof Jastrze˛ bski Wektoryzacja prostych schematów układów cyfrowych Opiekun pracy: prof. dr hab. inż. Jan Zabrodzki Ocena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......................................... Podpis Przewodniczacego ˛ Komisji Egzaminu Dyplomowego Specjalność: Inżynieria systemów informatycznych Data urodzenia: 18 maja 1989 r. Data rozpoczecia ˛ studiów: 23 lutego 2009 r. Życiorys Nazywam sie˛ Piotr Jastrzebski. ˛ Urodziłem sie˛ 18 maja 1989 r. w Radomiu. W roku 2002 ukończyłem Szkołe˛ Podstawowa˛ nr 3. im. Jana Długosza w Radomiu i rozpoczałem ˛ nauke˛ w Publicznym Gimnazjum nr 23. im. Jana Kochanowskiego w Radomiu. W roku 2005 zaczałem ˛ uczeszczać ˛ do klasy o profilu matematyczno-fizycznym w VI Liceum Ogólnokształcacym ˛ im. J.Kochanowskiego w Radomiu. W roku 2008 zdałem mature, ˛ a w lutym 2009 r. rozpoczałem ˛ studia dzienne na wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej. W ramach wymiany miedzynarodowej ˛ studiowałem także na uczelni University of Ulsan w Korei Południowej oraz w Katholieke Universiteit Leuven w Belgii. ..................................... podpis studenta Egzamin dyplomowy Złożył egzamin dyplomowy w dn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Z wynikiem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ogólny wynik studiów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dodatkowe wnioski i uwagi Komisji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .......................................................................................... Streszczenie Praca ta prezentuje aplikacje˛ pozwalajac ˛ a˛ na wektoryzacje˛ schematów układów cyfrowych zapisanych w formacie grafiki rastrowej. Została ona przygotowana z myśla˛ o działaniu pod kontrola˛ systemu Android i na podstawie graficznych plików wejściowych różnego rodzaju generuje wyjściowa˛ wersje˛ zapisana˛ w wektorowym formacie SVG. Korzysta ona z algorytmów przetwarzania obrazu z biblioteki OpenCV. Słowa kluczowe: grafika wektorowa, układ cyfrowy, wektoryzacja, trasowanie, SVG, OpenCV, Android Abstract Title: Simple digital circuit diagrams vectorization This thesis describes the application which vectorizes digital circuit diagrams saved as a raster graphics. Created application runs on Android operating system and being given different type graphics files processes it into vector-based SVG file. It uses image processing algorithms from OpenCV library. Key words: vector graphics, digital circuit, vectorization, image tracing, SVG, OpenCV, Android Spis treści 1. Wstep ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2. Istniejace ˛ rozwiazania ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 3. Specyfikacja wymagań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1. Wymagania funkcjonalne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.2. Wymagania niefunkcjonalne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 4. Koncepcja rozwiazania ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 5. Technologie i narzedzia ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 5.1. Platforma systemu Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 5.2. Biblioteka OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 5.3. Format Scalable Vector Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . 15 6. Proces wektoryzacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 6.1. Korekta obróconego obrazu wejściowego . . . . . . . . . . . . . . . . . . . . . . 19 6.2. Detektor krawedzi ˛ Canny’ego . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 6.2.1. Redukcja szumu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 6.2.2. Wyszukiwanie nate˛ żenia gradientu . . . . . . . . . . . . . . . . . . . . . 22 6.2.3. Usuwanie niemaksymalnych pikseli . . . . . . . . . . . . . . . . . . . . 22 6.2.4. Progowanie z histereza˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków . . . . . . . 23 6.4. Detektor wierzchołków Harrisa . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 6.5. Przetwarzanie zebranych danych . . . . . . . . . . . . . . . . . . . . . . . . . . 30 6.5.1. Odnajdywanie wierzchołków prostokatów ˛ . . . . . . . . . . . . . . . . . 32 6.5.2. Odnajdywanie obramowania prostokatów ˛ . . . . . . . . . . . . . . . . . 32 6.5.3. Odnajdywanie punktów wewnetrznych ˛ . . . . . . . . . . . . . . . . . . . 33 6.5.4. Wykrywanie punktów i wielokatów ˛ połacze ˛ ń . . . . . . . . . . . . . . . 33 6.5.5. Odnajdywanie symboli . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 6.5.6. Łaczenie ˛ pozostałych wierzchołków wolnych . . . . . . . . . . . . . . . 34 6.6. Rysowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Spis treści ii 7. Interfejs użytkownika . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 8. Testowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 8.1. Sprawdzanie działania aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 8.2. Strojenie parametrów aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 9. Dokumentacja projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 10.Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 10.1.Spełnienie założeń . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 10.2.Porównanie wyników . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 10.3.Perspektywy rozwoju aplikacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 A. Jezyk ˛ skryptowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 1. Wstep ˛ Jednym z podstawowych rodzajów grafiki komputerowej jest grafika wektorowa. Do tworzenia obrazów wektorowych wykorzystuje sie˛ prymitywy graficzne takie jak: punkty, odcinki, krzywe oraz różnego rodzaju figury geometryczne. Każdy z obiektów tworzacych ˛ obraz jest matematycznie zdefiniowany i umiejscowiony w układzie współrze˛ dnych. Ze wzgle˛ du na swój matematyczny charakter, obraz wektorowy posiada wiele zalet. Do głównych z nich można zaliczyć bardzo dobra˛ skalowalność oraz prostote˛ opisu wynikajac ˛ a˛ z wewne˛ trznej, hierarchicznie zdefiniowanej struktury pliku. Dodatkowo obraz wektorowy dla zastosowań niefotorealistycznych charakteryzuje sie˛ znacznie mniejszymi plikami wynikowymi. W zastosowaniach profesjonalnych, reprezentacja wektorowa grafiki znalazła szerokie zastosowanie ze wzgledu ˛ na forme˛ plików wejściowych wielu urzadze ˛ ń druku wielkoformatowego np. ploterów. Jest to prawdopodobnie jedno z niewielu zastosowań bezpośredniej formy wektorowej. Urzadzenia ˛ cyfrowe jak monitor czy drukarka bazuja˛ na reprezentacji opisanej skończona˛ liczba˛ pikseli i dla każdej grafiki wektorowej przed wyświetleniem konieczna staje sie˛ operacja rasteryzacji, czyli obliczenia jaka˛ wartość (kolor) bedzie ˛ miał odpowiedni piksel. Jest to jednak, w przeciwieństwie do procesu wektoryzacji, proces bezstratny i jednoznacznie określony. Najwie˛ ksza˛ wada˛ obrazów wektorowych jest ogromna złożoność pamieciowa ˛ dla zastosowań fotorealistycznych i tym samym nieopłacalność obliczeniowa konwersji do formy wektorowej skomplikowanych obrazów rastrowych. Tym samym stosuje si˛e je najcz˛eściej do wykonywania schematów naukowych i technicznych, map i planów, różnych form grafiki użytkowej jak logo, herby, flagi lub piktogramy oraz znaki, np. drogowe. Takie formy graficzne cechuja˛ sie˛ małym stopniem skomplikowania, prostymi kształtami i dużymi obszarami jednokolorowymi. Dla takich zastosowań grafika wektorowa sprawdza sie˛ najlepiej. Obrazy wektorowe zapisywane sa˛ w różnych formatach plików. Wiele z nich powstało jako odpowiedź na konieczność stworzenia zapisu danych dla konkretnej aplikacji, np. CorelDRAW udostepnia ˛ format CDR, Adobe Illustrator format AI, a AutoCAD format DXF. Istnieja˛ także rozwiazania ˛ wyspecjalizowane jak format 2 1. Wstep ˛ Gerber (RS-274X) be˛ dacy ˛ w praktyce standardem używanym przy produkcji obwodów drukowanych. Jednym z najbardziej popularnych formatów zapisu grafiki wektorowej jest format SVG1 , który co do formy zapisu jest po prostu plikiem XML2 . Jego popularność wynika z szerokiego zastosowania w Internecie, a wsparcie wyświetlania plików w formacie SVG zapewniaja˛ popularne przegladarki ˛ internetowe jak np. Mozilla Firefox, Internet Explorer 9, Google Chrome, Opera i Safari. W najnowszej wersji standardu, SVG 1.1, zapewnia wszelkie potrzebne do realizacji projektu funkcje, takie jak: tworzenie ścieżek z prostych lub krzywych, podstawowe kształty, wypełnianie ich kolorem z różnym stopniem przezroczystości. Pozwala także na przechowywanie metadanych i zapewnia wbudowana˛ obsługe˛ fontów. Do identyfikacji poszczególnych elementów na schematach układów cyfrowych stosuje sie˛ różnego rodzaju symbole. W powszechnym użyciu sa˛ dwa zestawy, oba zdefiniowane w dokumencie [8] przygotowanym przez ANSI3 i IEEE4 . Symbole o zróżnicowanych kształtach (norma ANSI) bazuja˛ na tradycyjnych oznaczeniach i używane sa˛ do prostych rysunków. Wywodza˛ sie˛ z amerykańskiego standardu wojskowego z lat 50 i 60. Symbole prostokatne, ˛ bazujace ˛ na standardzie IEC5 maja˛ stały kształt i dzie˛ ki temu moga˛ reprezentować znacznie wieksz ˛ a˛ liczbe˛ elementów i urzadze ˛ ń. Zalecane jest stosowanie symboli IEC, ale na mocy porozumienia zawartego mie˛ dzy IEEE a IEC oba standardy sa˛ równoważne i moga˛ być stosowane wymiennie. Istnieje jeszcze norma niemiecka zdefiniowana przez DIN6 , ale nie znajduje ona powszechniejszego zastosowania poza granicami Niemiec. Podczas wybierania tematu mojej pracy, chciałem aby efekt końcowy miał wartość nie tylko w postaci dobrze udokumentowanego procesu inżynierskiego, ale przede wszystkim, aby przyczyniła sie˛ ona do rozwoju moich umiejetności ˛ w zakresie programowania i projektowania aplikacji mobilnych. Celem pracy inżynierskiej jest stworzenie aplikacji wektoryzujacej ˛ obrazy bitmapowe, działajacej ˛ pod kontrola˛ systemu operacyjnego Android. Program ma za zadanie uzyskanie możliwie wiernie wektorowej reprezentacji obrazu wejściowego stosujac ˛ w tym procesie różne algorytmy przetwarzania obrazu. Końcowy wynik zapisywany powinien być w formacie grafiki wektorowej SVG. Wykonana aplikacja powinna w sposób możliwie prosty pozwalać na wybranie użytkownikowi zadanego 1 2 3 4 5 6 ang. Scalable Vector Graphics ang. Extensible Markup Language ang. American National Standards Institute ang. Institute of Electrical and Electronics Engineers ang. International Electrotechnical Commission niem. Deutschen Institut für Normung 3 1. Wstep ˛ pliku do wektoryzacji, wykonać ja˛ i zaprezentować otrzymane rezultaty, zarówno w zestawieniu z oryginałem, jak i sam efekt końcowy. Moja˛ prace˛ dyplomowa˛ podzieliłem na 10 rozdziałów. Pierwszy, to niniejszy wst˛ep. W drugim charakteryzuje˛ istniejace ˛ na rynku rozwiazania ˛ i przedstawiam porównanie wyników ich zastosowania na potrzeby wektoryzacji. W rozdziale trzecim wyszczególniłem wymagania zarówno funkcjonalne jak i niefunkcjonalne stawiane aplikacji. Rozdział czwarty przedstawia koncepcje˛ rozwiazania ˛ problemu wektoryzacji obrazów bitmapowych. Nastepny ˛ rozdział - piaty ˛ - to krótki opis technologi i narze˛ dzi wykorzystanych przy tworzeniu projektu. Rozdział szósty, najobszerniejszy, przedstawia elementy składowe algorytmu przetwarzania obrazu oraz tłumaczy sam proces wektoryzacji. Staram sie˛ w nim opisać „Jak to dokładnie działa?”. Rozdział siódmy przedstawia interfejs użytkownika. W rozdziale ósmym przedstawiłem proces testowania aplikacji. Rozdział dziewiaty ˛ to dokumentacja projektu wraz z diagramamem klas i przypadków użycia. Rozdział dziesiaty ˛ to podsumowanie, określenie, jakie cele spośród założonych udało sie˛ osiagn ˛ ać ˛ oraz możliwe kierunki rozwoju. Uzupełnienie dokumentu stanowi bibliografia oraz dodatek zawierajacy ˛ je˛ zyk skryptowy przygotowany na potrzeby projektu. Podczas przygotowywania pracy starałem sie˛ odpowiedzieć jednocześnie na dwa pytania: „Jak wykonać dany element projektu?” i „Dlaczego, właśnie w ten sposób?”. Pokładam duża˛ nadzieje˛ w tym, że praca spełni oczekiwania odbiorców studentów Wydziału Elektroniki i Technik Informacyjnych Politechniki Warszawskiej oraz innych osób zainteresowanych zarówno tematem przetwarzania obrazu jak i programowania aplikacji mobilnych. 2. Istniejace ˛ rozwiazania ˛ Procesem uzyskiwania obrazów wektorowych z wejściowych plików rastrowych jest wektoryzacja (ang. vectorization) lub inaczej trasowania (ang. image tracing). Samo wektoryzowanie może odbywać sie˛ w dwojaki sposób: recznie, ˛ gdzie osoba odrysowuje na bitmapie krawedzie ˛ i kształty, które nastepnie ˛ zostaja˛ zamienione na matematycznie opisane proste, krzywe i obsługiwane wielokaty ˛ lub automatycznie, gdzie odpowiednie algorytmy same analizuja˛ i przekształcaja˛ obraz rastrowy na wektorowy, jak przedstawiano np. w [9, 22]. W przeszłości stosowano także wektoryzacje˛ ekranowa, ˛ polegajac ˛ a˛ na „obrysowywaniu” rysunku rastrowego na ekranie monitora. Rzadziej stosuje sie˛ metode˛ wektoryzacji za pomoca˛ tzw. digitizera (myszki z celownikiem poruszajacej ˛ sie˛ po swego rodzaju tablecie). Najcze˛ stszym podejściem do rozwiazania ˛ problemu wektoryzacji jest zgrupowanie w wie˛ ksze obiekty wektorowe na zasadzie podobieństwa koloru rastrów opisujacych ˛ dana˛ bitmape˛ . Etapy takiego łaczenia ˛ i efekty końcowe algorytmów grupujacych ˛ przedstawiono w [18]. Efektem procesu wektoryzacji dla wielu skomplikowanych obrazów bitmapowych jest zniekształcony i pozbawiony szczegółów obraz wektorowy. Tylko bitmapa składajaca ˛ sie˛ z elementów bed ˛ acych ˛ prostymi kształtami ma szanse być poprawnie przekształcona. Wielu producentów oprogramowania graficznego zdaje sobie sprawe˛ z zapotrzebowania na aplikacje posiadajace ˛ funkcje wektoryzacji. Profesjonalnymi programami graficznymi obsługujacymi ˛ wektoryzacje˛ sa˛ m.in. CorelTrace (składnik pakietu CorelDRAW), Adobe Flash, Adobe Illustrator, Adobe FreeHand lub Inkscape (przez wykorzystanie zintegrowanego programu Potrace). Istnieja˛ również rozwia˛ zania działajace ˛ po stronie serwera jak np. dostepny ˛ online Vector Magic [7] lub AutoTrace [3]. Brak jest jednak rozwiazania ˛ na platformy mobilne jak np. urza˛ dzenia działajace ˛ pod kontrola˛ systemu Android. W zwiazku ˛ z faktem, że sam proces wektoryzacji jest słabo zdefiniowany, a końcowe wyniki silnie zależne sa˛ od przeznaczenia narze˛ dzia, konstruuje sie˛ różne algorytmy wektoryzacji: inne dla rysunku technicznego i schematów, inne dla postaci z kreskówek [15, 16], a inne dla przetwarzania i ewidencji zdjeć ˛ naturalnych, satelitarnych czy lotniczych. Wyniki 2. Istniejace ˛ rozwiazania ˛ 5 otrzymywane podczas wykorzystania uniwersalnych programów bardzo czesto ˛ albo prezentuja˛ niska˛ jakość odwzorowania albo cechuja˛ sie˛ dużym rozmiarem plików. 3. Specyfikacja wymagań 3.1. Wymagania funkcjonalne 1. Zbiór elementów przetwarzanych – program powinien umożliwiać rozpoznawanie i przetwarzanie obrazów rastrowych bed ˛ acych ˛ poprawnymi schematami układów cyfrowych zapisanych zgodnie ze standardem IEC, złożonych z ograniczonego zbioru elementów: bramek logicznych (opisanych w dokumencie [8]) oraz przerzutnika typu D ( [14] s. 375). Porównanie standardów zapisu przedstawiono w tablicy 3.1) 2. Postać wejściowa – obraz wejściowy powinien być schematem dwubarwnym o dość dobrej jakości i dokładnym wykonaniu. Dozwolone jest, aby schemat został obrócony np. podczas skanowania. 3. Możliwość zmiany rozmiaru obrazu wyjściowego – aplikacja musi umożliwiać skalowanie obrazu wyjściowego bazujac ˛ na wymiarach podanych przez użytkownika. Podane wymiary, wyrażone w pikselach, nie musza˛ zachowywać wzgled˛ nych proporcji obrazu oryginalnego. Zarówno szerokość jak i wysokość obrazu moga˛ być zwie˛ kszane lub zmniejszane niezależnie od siebie. 4. Funkcja obrotu obrazu o zadany kat ˛ – obraz wyjściowy może zostać obrócony o zadany kat. ˛ Wartościa˛ określajaca ˛ go w stopniach, jest dodatnia˛ liczba˛ całkowita, ˛ dla której wartości równe i wieksze ˛ 360◦ oznaczaja˛ wynik funkcji kata ˛ modulo 360. Operacja obrotu powinna być wykonywana po ewentualnej operacji skalowania. 5. Opcja zmiany zestawu kolorów obrazu – aplikacja powinna pozwalać na niezależny wybór kolorów rysowania dla trzech elementów: tła obrazu, zestawu czcionek użytych do oznaczania symboli oraz dla linii, za pomoca˛ których rysowane sa˛ układy cyfrowe. Wybór koloru powinien nastepować ˛ np. poprzez wybranie odpowiedniej wartości z graficznej palety barw. 6. Obsługiwane formaty plików – program powinien zapewniać możliwość wektoryzacji rastrowych plików graficznych zapisanych w wielu popularnych formatach: — Windows Bitmap (BMP): *.bmp, *.dib 7 3.1. Wymagania funkcjonalne — Portable Network Graphics (PNG): *.png — Joint Photographic Experts Group (JPEG): *.jpeg, *.jpg, *.jpe — JPEG 2000: *.jp2 — Tagged Image File Format (TIFF): *.tiff, *.tif — Portable anymap: *.pbm, *.pgm, *.ppm — Rastrowe pliki systemu Sun: *.sr, *.ras 7. Swobodny dostep ˛ do systemu plików – użytkownik powinien mieć możliwość wyboru piku do przetworzenia poprzez podanie bezwzglednej ˛ ścieżki. Osiagalne ˛ musza˛ być wszystkie pozycje dostepne ˛ w systemie plików systemu Android. Tablica 3.1. Porównanie sposobów zapisu symboli bramek logicznych. US ANSI 91-1984 Standard IEC 60617-12 & AND ≥1 OR & NAND ≥1 NOR 1 XOR 1 XNOR 1 NOT Przerzutnik typu D DIN 40700 3.2. Wymagania niefunkcjonalne 8 3.2. Wymagania niefunkcjonalne 1. Interaktywna praca aplikacji – proces wektoryzacji może być czasochłonny i wymagajacy ˛ obliczeniowo szczególnie dla dużych i skomplikowanych obrazów wejściowych. Aplikacja nie powinna w żadnym momencie „zawieszać” sie˛ i nie odpowiadać na akcje użytkownika. Program powinien w widocznej warstwie interfejsu użytkownika informować go o trwajacych ˛ w tle procesach i ewentualnie wyświetlać poste˛ p prac. 2. Przyjazny interfejs – program powinien informować użytkownika o problemach lub wydarzeniach wymagajacych ˛ podjecia ˛ jakiejś akcji. W przypadku podania niepoprawnej ścieżki pliku wejściowego, zakończenia procesu wektoryzacji itp. wyświetlany powinien być odpowiedni komunikat. Obsługa fizycznych przycisków standardowych: menu, powrotu i głównego ekranu powinna być zgodna z zaleceniami tworzenia aplikacji pod systemem Android wersji 2.*. Układ i rozmiar elementów interfejsu użytkownika powinien być przystosowany do obsługi poprzez ekran dotykowy. 3. Zgodność ze standardem SVG – wynikowy plik grafiki wektorowej powinien być tworzony zgodnie z zaleceniami W3C1 , tak, aby niezależnie od urzadzenia ˛ czy aplikacji w której be˛ dzie wyświetlany, odbywało sie˛ to poprawnie i zawsze dawało takie same wyniki. 4. Rozmiar pliku wynikowego – plik wektorowy uzyskany w procesie wektoryzacji powinien cechować sie˛ jak najmniejszym rozmiarem. Najlepiej, gdyby niezależnie od stopnia skomplikowania obrazu dla wzorcowej rozdzielczości pliku wejściowego rze˛ du 1024x768 punktów, uzyskany obraz wektorowy miał rozmiar mniejszy niż odpowiadajacy ˛ mu plik rastrowy. 5. Internacjonalizacja – ewentualne umiedzynarodowienie ˛ oprogramowania powinno odbywać sie˛ bez konieczności ingerencji w warstwe˛ algorytmów i wygladu ˛ aplikacji. Dla każdego je˛ zyka, w celu łatwiejszej modyfikacji, zalecane jest stworzenie oddzielnego pliku XML przechowujacego ˛ wszystkie teksty i napisy użyte w programie. 1 ang. World Wide Web Consortium 4. Koncepcja rozwiazania ˛ Wste˛ pnym zagadnieniem mojej pracy inżynierskiej była „Wektoryzacja obrazów bitmapowych”. W przeciagu ˛ roku, w toku przygotowania do pisania pracy, pojawiało sie˛ wiele pomysłów, jak ten temat zagospodarować. Były to pomysły zarówno dotyczace ˛ wyboru zastosowania aplikacji wektoryzujacej ˛ obrazy bitmapowe jak i podejścia do rozwiazania ˛ samego problemu. Poczatkowy ˛ etap polegał na zbieraniu informacji na temat dostepnych ˛ na rynku narz˛edzi, które już posiadały funkcjonalność trasowania obrazu, jak również na zapoznaniu sie˛ z publikacjami naukowymi. W obu przypadkach taka analiza nie była łatwa. Firmy nieche˛ tnie dziela˛ sie˛ informacjami na temat działania ich programów, zatem można było je pozyskiwać jedynie z dokumentacji i opisów funkcjonalności aplikacji. Publikacje naukowe czestokroć ˛ dość pobieżnie opisywały omawiane zagadnienia koncentrujac ˛ sie˛ bardziej na uzyskanych wynikach. Jednakże, na bazie tych informacji pojawiała sie˛ wstepna ˛ koncepcja rozwiazania. ˛ Drugim etapem, jako, że bardzo zależało mi na przygotowaniu działania aplikacji dla systemu Android, było sprawdzenie, czy zaprojektowanie i wykonanie takiej aplikacji jest w ogóle możliwe. Wiazało ˛ sie˛ to z zapoznaniem sie˛ z dokumentacja˛ systemu Android [2]. Okazało sie˛ także, że istnieje biblioteka OpenCV służaca ˛ do przetwarzania grafiki i ma ona swoja˛ wersje˛ działajac ˛ a˛ pod tym systemem, zapewniajac ˛ a˛ prawie pełna˛ funkcjonalność oryginalnej wersji dla jezyków ˛ C i C++. Należało zapoznać sie˛ z jej możliwościami. W tym celu przeczytałem dokumentacje˛ dost˛epna˛ w Internecie [4] oraz ksia˛żke˛ „Learning OpenCV” [10]. Obie te pozycje były również bardzo pomocne podczas pisania samego programu zapewniajac ˛ wsparcie i objaśnienia na temat opisów działania i składni poszczególnych funkcji, obiektów i algorytmów. Kiedy została podje˛ ta decyzja, że wektoryzowane bed ˛ a˛ schematy układów cyfrowych, w celu zapewnianie zgodności przetwarzanych symboli ze standardem zapoznałem sie˛ z dokumentem standaryzujacym ˛ IEEE [8] oraz z przykładowymi schematami i symbolami użytymi w ksia˛żce „Podstawy elektroniki cyfrowej” [14]. W trakcie analizy zagadnienia układów cyfrowych posiłkowałem sie˛ także ksia˛żka˛ „Podstawy projektowania układów cyfrowych” [12]. 4. Koncepcja rozwiazania ˛ 10 W mie˛ dzyczasie porównywałem dostepne ˛ sposoby i formaty zapisów plików wektorowych. Wybór formatu SVG był jednak dość oczywisty ze wzgledu ˛ na powszechność jego użycia, otwartość standardu oraz łatwość zapisu. Kiedy tematyka przetwarzanych obrazów, platforma systemowa, biblioteki, je˛ zyk programowania i sposób zapisu zostały ustalone należało zastanowić sie˛ nad koncepcja˛ samego algorytmu przetwarzania schematów. Ze wzgledu ˛ na prostote˛ zapisu, wydawało mi sie˛ oczywiste, że analizowanie należy zaczać ˛ od przetworzenia obrazu na wersje˛ dwubarwna˛ oraz próbować wydobyć z obrazu cechy charakteryzujace ˛ symbole układu logicznego. Tym samym wykorzystanie detekcji krawedzi ˛ i wierzchołków wydawało sie˛ mieć duży potencjał. O ile wykryte punkty niosa˛ w sobie jakieś informacje o strukturze obrazu, to detektor krawedzi ˛ Canny’ego przekształca jedynie jeden obraz w drugi. Konieczne stało sie˛ zatem wydobycie informacji o istniejacych ˛ w obrazie odcinkach i prostych. W tym celu chciałem wykorzystać transformate˛ Hougha, która pozwala na wydobycie informacji z obrazu np. o współrze˛ dnych wierzchołków odcinków. Dysponujac ˛ takimi danymi, na bazie informacji wynikajacych ˛ m.in. ze standardu ICE, można przetwarzać zgromadzone dane w celu rozpoznawania elementów układów cyfrowych w obrazie. Jak dokładnie ten proces przebiegał, zostało opisane w rozdziale 6, zaś informacje na temat wykorzystanych technologi, w rozdziale 5. 5. Technologie i narzedzia ˛ 5.1. Platforma systemu Android Projektowana aplikacja przygotowana została dla systemu operacyjnego Android. Producentem systemu jest stowarzyszenie biznesowe Open Handset Alliance, ale w praktyce jego rozwój pozostaje pod dużym wpływem firmy Google. Android został oparty na jadrze ˛ systemu Linux (starsze na wersji 2.6, a najnowsze na 3.0 oraz 3.1) i przewidziany jest do zastosowania w urzadzeniach ˛ mobilnych korzystajacych ˛ z procesora ARM jak np. smartfony czy tablety. W chwili obecnej (sierpień 2012) najnowsza˛ stabilna˛ wersja˛ systemu jest wersja 4.1 Jelly Bean, lecz przygotowywana aplikacja powstaje z myśla˛ o najpopularniejszej w tej chwili wersji systemu: 2.3 Gingerbread (60,6% udziału w runku [1]). Wynikało to też poniekad ˛ wprost z wymagań biblioteki OpenCV, która działa pod systemem Android w wersji 2.2 lub wyższej. Programowanie aplikacji działajacych ˛ pod kontrola˛ systemu Android wymaga zgoła innego podejścia niż programowanie aplikacji dla systemu Windows czy Linux. Interfejs programowania aplikacji (API) systemu Android zapewnia: 1. obsługe˛ „cyklu życia” aplikacji – w uproszczeniu: wyjście z działajacej ˛ aplikacji przenosi ja˛ zazwyczaj w stan zawieszenia (funkcja systemowa onPause()) i o ile inna aplikacja z wyższym procesem nie zgłosi żadania ˛ przydziału zajetej ˛ pamieci, ˛ b˛edzie ona działać aż do czasu wznowienia (funkcja systemowa onResume()). W praktyce jedynie jawne i świadome wywołanie funkcji onStop() kończy aplikacje˛ . 2. dynamiczne przydzielanie pamieci ˛ w zależności od chwilowego na nia˛ zapotrzebowania oraz statusu aplikacji 3. podstawowe elementy składowe interfejsu użytkownika aplikacji tj. zunifikowany wyglad ˛ pól, przycisków, pasków przewijania itp. 5.2. Biblioteka OpenCV 12 4. obsługe˛ zdarzeń zewne˛ trznych a w szczególności: reakcji ekranu dotykowego na dotknie˛ cia, przeciaganie ˛ i inne gesty, wciśniecia ˛ przycisków fizycznych i dotykowych na obudowie, obsługe˛ systemów: GPS, akcelerometru, czujnika zbliżeniowego, cyfrowego kompasu, miernika nate˛ żenia oświetlenia itp. 5. przechowywanie ustawień aplikacji pomiedzy ˛ uruchomieniami w dowolnie definiowalnej klasie SharedPreferences (forma dedykowanego kontenera w pamie˛ ci stałej dla pojedynczej aplikacji) Programowanie aplikacji na platforme˛ Android nie nastrecza ˛ wiekszych ˛ problemów i nie wymaga ponoszenia żadnych kosztów finansowych. Najprościej wykorzystać do tego środowisko programistyczne Eclipse, wspierajace ˛ jezyk ˛ Java, który w nieco zmodyfikowanej wersji jest jezykiem ˛ programowania używanym dla urza˛ dzeń mobilnych Android. Dodatkowo należy ze strony Android Developers [2] pobrać Android Software Development Kit (SDK) a także wtyczke˛ Android Development Tool (ADT) dla Eclipse. Tak skonfigurowane środowisko pozwala na bezproblemowe projektowanie i rozwijanie aplikacji. Wtyczka dla Eclipse pozwala na korzystanie z perspektywy DDMS1 , która daje możliwość programiście dostepu ˛ do logów systemowych Android, działajacych ˛ urzadze ˛ ń, aktywnych watków, ˛ emulacji parametrów oraz podgladu ˛ całego systemu plików. Co istotne, nie jest wymagane posiadanie własnego smartfona czy tabletu, gdyż SDK posiada menadżera maszyn wirtualnych (AVD Manager). Pozwala to nie tylko na sprawdzenie jak aplikacja działa pod różnymi wersjami systemu, ale umożliwia zmiane˛ rozmiaru i rozdzielczości ekranu, symuluje wskazania odbiornika GPS, akcelerometru, czujnika zbliżeniowego oraz prac˛e kamery czy aparatu. Na rysunku 5.1 przedstawiono zrzut ekranu z maszyny wirtualnej Android. Po lewej stronie widoczny jest interfejs użytkownika, zaś po prawej klawiatura oraz fizyczne przyciski wystepuj ˛ ace ˛ na obudowach telefonów i smartfonów (regulacji głośności, menu, obsługi rozmowy oraz przycisk aparatu). 5.2. Biblioteka OpenCV OpenCV jest biblioteka˛ napisana˛ w jezykach ˛ C i C++, stworzona˛ przez firme˛ Intel i rozwijana˛ obecnie jako wolne oprogramowanie przy współpracy z firmami Willow Garage oraz Itseez. Głównym jej zastosowaniem jest szeroko pojete ˛ przetwarzanie obrazu (rozpoznawanie twarzy, gestów, obiektów; śledzenie ruchu; widzenie stereoskopowe itp.). W aplikacji przygotowanej na potrzeby pracy inżynierskiej wykorzystywana jest wersja OpenCV 2.3.1 z 12 września 2011 roku, używajaca ˛ klas 1 ang. Dalvik Debug Monitor Server 5.2. Biblioteka OpenCV 13 Rysunek 5.1. Zrzut ekranu maszyny wirtualnej z uruchomionym systemu Android 2.2 14 5.2. Biblioteka OpenCV opakowujacych ˛ przeznaczonych specjalnie do programowania aplikacji na mobilnych urzadzeniach ˛ działajacych ˛ pod kontrola˛ systemu operacyjnego Android. OpenCV dzieli funkcje w zależności od przeznaczenia na poszczególne klasy: 1. Funkcje i obiekty podstawowe (klasa Core) – Sa˛ to przede wszystkim macierze i wszelkie operacje wykonywane na nich, własne funkcje matematyczne i stałe, operacje kreślenia fontów i rysowania podstawowych kształtów jak np. kół, wielokatów, ˛ prostokatów. ˛ Znajduja˛ sie˛ tu także funkcje odpowiedzialne za zarzadzanie ˛ pamie˛ cia. ˛ 2. Przetwarzanie obrazu (klasa Imgproc) – Ta klasa zapewnia metody implementujace ˛ różnego rodzaju filtrowania, transformacje, obliczanie histogramów czy analize˛ strukturalna. ˛ Znalazły sie˛ tu także deskryptory kształtu, funkcje śledzenia obiektów, wykrywania ruchu, czy metody ekstrakcji cech. 3. Interfejs użytkownika i obsługa plików (klasa Highgui) – Klasa implementuje prosty interfejs graficzny oraz zapewnia odczyt i zapis obrazu z pliku lub kamery, jak również obsługe˛ myszy i klawiatury. 4. Analiza obrazu wideo (klasa Video) – Sa˛ to przede wszystkim funkcje analizy ruchu i śledzenia obiektów. 5. Rekonstrukcja 3D i kalibracja (klasa Calib3d) – Funkcje kalibracji i rekonstrukcji 3D dla kamer fotografii otworkowej. 6. Analiza cech 2D (klasa Features2d) – Klasa zawiera deskryptory i funkcje rozpoznawania cech (m.in. deskryptory ORB, MSER, FAST) oraz funkcje kategoryzujace ˛ obiekty. 7. Rozpoznawanie obiektów (klasa Objdetect) – Funkcje odpowiedzialne za implementacje metod rozpoznawania obiektów za pomoca˛ m.in. klasyfikatora kaskad Haara. 8. Uczenie maszynowe (klasa Ml) – Zaimplementowany został własny model statystyczny, klasyfikator Bayesa, drzewa decyzyjne, sieci neuronowe, algorytm k najbliższych sasiadów ˛ itp. 9. Grupowanie i przeszukiwanie w przestrzeniach wielowymiarowych (klasa Flann) – Interfejs do biblioteki FLANN oraz funkcja zapewniajaca ˛ klastrowanie bazujace ˛ na hierarchicznym algorytmie k średnich. 10. Funkcje wspierajace ˛ obliczenia na karcie gragficznej (klasa Gpu) – Sa˛ to oddzielne struktury danych, macierze, operacje oraz funkcje analogiczne do tych z innych klas, ale obsługujace ˛ wsparcie obliczeń przez karte˛ graficzna. ˛ 11. Przetwarzanie fotografii (klasa Photo) – W praktyce jest to jedna funkcja: inpaint() służaca ˛ do restauracji starych zdjeć ˛ - usuwania z nich ubytków i zarysowań. 5.3. Format Scalable Vector Graphics 15 12. Łaczenie ˛ obrazów (klasa Stitching) – Klasa zaawansowanych algorytmów łaczenia ˛ wielu obrazów za pomoca˛ cech, deskryptorów i elementów wspólnych. Zapewnia algorytmy łaczenia, ˛ wygładzania, transformacji i dopasowywania. 13. Algorytmy chronione patentem w niektórych krajach (klasa Nonfree) – Dwa algorytmy: SIFT 2 - pozwalajacy ˛ wykryć i opisać lokalne cechy w obrazie oraz SURF 3 - algorytm detekcji cech inspirowany poprzednim, kilkakrotnie od niego szybszy i bardziej odporny na pojawiajace ˛ sie˛ w obrazie zakłócenia. Oba wykorzystywane sa˛ w rozpoznawaniu obiektów oraz modelowaniu trójwymiarowym. 14. Funkcje eksperymentalne (klasa Contrib) – Funkcje nad którymi trwaja˛ aktualnie prace, czekaja˛ na zoptymalizowanie lub dopracowanie. 15. Algorytmy nieaktualne (klasa Legacy) – Funkcje zastapione ˛ nowymi. Spośród wymienionych wyżej funkcjonalności w procesie wektoryzacji został użyty jedynie niewielki ich fragment. Podstawowymi elementami wykorzystanymi w aplikacji sa˛ funkcje klas Imgproc, Highgui oraz Core: 1. wczytywanie plików graficznych (JPG, PNG, BMP itp.): Highgui.imread() 2. probabilistyczna transformata Hougha: Imgproc.HoughLinesP() 3. detektor krawe˛ dzi Canny’ego: Imgproc.Canny() 4. filtr Gaussa: Imgproc.GaussianBlur() 5. detektor wierzchołków Harrisa: Imgproc.goodFeaturesToTrack() 6. funkcje rysowania okre˛ gów i kół: Core.circle() 7. funkcje rysowania linii: Core.line() 8. funkcje rysowania wielokatów: ˛ Core.fillConvexPoly() 9. wstawianie napisów: Core.putText() 10. zapis plików graficznych: Highgui.imwrite() 5.3. Format Scalable Vector Graphics SVG jest wolnym, uniwersalnym wektorowym formatem zapisu grafiki dwuwymiarowej tworzonym przez organizacje˛ W3C. Pliki zapisane w tym formacie maja˛ rozszerzenie *.svg lub *.svgz (skompresowane formatem gzip). Najszerszym zastosowaniem tego formatu jest grafika wykorzystywana w Internecie m.in. na stronach WWW. Umożliwia on wykorzystanie w obrazie zarówno prostych kształtów geometrycznych jak koła, elipsy i wielokaty, ˛ ale także skomplikowanych ścieżek, których składowymi moga˛ być odcinki, krzywe Béziera albo krzywe eliptyczne. Wspiera 2 3 ang. Scale Invariant Feature Transform ang. Speeded Up Robust Features 5.3. Format Scalable Vector Graphics 16 także wstawianie znaków w kodowaniu Unicode, co ze wzgledu ˛ na konieczność umieszczenia w obrazie np. symbolu „≥ 1”, było bardzo przydatne. Atrybuty obiektów, jak kolor, grubość linii itp., moga˛ być wyrażone zarówno w postaci poszczególnych argumentów, albo zbiorowo w stylu znanym z kaskadowych arkuszy stylów. SVG obsługuje dodatkowo wiele przydatnych, ale nie wykorzystanych w aplikacji funkcji. Pozwal na umieszczanie w kodzie metadanych, pisanie skryptów w je˛ zyku ECMAScript, definiowanie animacji czy umieszczanie hiperlinków. Dla potrzeb aplikacji wykorzystałem także możliwość wykonywania transformacji - skalowania oraz obrotów. Podzbiór zbioru, czyli wszystkie te elementy formatu SVG, które zostały wykorzystane podczas przygotowania pracy przedstawiono na wydruku 5.1 prezentujacym ˛ minimalny, ale w pełni funkcjonalny plik wektorowy: 1. nagłówek definiujacy ˛ parametry obrazu – linie 4–8 2. prostokaty ˛ – linie 10–15 3. wielokaty ˛ – linie 17–21 4. linie – linie 23–29 5. okre˛ gi i koła – linie 31–37 6. napisy – linie 39–44 5.3. Format Scalable Vector Graphics 1 2 3 4 5 6 7 8 <?xml version="1.0" encoding="utf−8" standalone="no"?> <!DOCTYPE svg PUBLIC "−//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="1024px" height="768px"> 9 10 11 12 13 14 15 <rect x="858.0" y="341.0" width="54.0" height="41.0" fill="white" stroke="black" stroke−width="1"/> 16 17 18 19 20 21 <polygon points="−4.0,51.0 −4.0,58.0 41.0,58.0 41.0,51.0" fill="blue" stroke="black" stroke−width="0"/> 22 23 24 25 26 27 28 29 <line x1="676.0" y1="138.0" x2="688.0" y2="133.0" stroke="red" stroke−width="1"/> 30 31 32 33 34 35 36 37 <circle cx="283.0" cy="88.0" r="3" fill="yellow" stroke="black" stroke−width="1"/> 38 39 40 41 42 43 44 <text x="858.0" y="382.0" style="font−family: Serif; font−size: 41.0pt;"> ≥1 </text> 45 46 </svg> Wydruk 5.1. Przykładowy plik SVG 17 6. Proces wektoryzacji Wymagania funkcjonalne aplikacji wektoryzujacej ˛ jasno określaja˛ charakter i rodzaj wejściowych obrazów rastrowych. Dla założonego problemu wektoryzacji schematów cyfrowych układów logicznych, wymaga sie˛ konkretnego podejścia. Obrazy rastrowe przedstawiajace ˛ schematy układów charakteryzuja˛ sie˛ niewielkim stopniem skomplikowania formy graficznej, a zazwyczaj jednolite tło i nieskomplikowane kolorowanie ułatwiaja˛ cały proces przetwarzania. Dla potrzeb pracy inżynierskiej, ograniczony został także zbiór możliwych do wystapienia ˛ elementów. Na schemacie moga˛ znaleźć sie˛ bramki logiczne wszystkich typów i przerzutniki. Pierwszym krokiem jest, ze wzgledu ˛ na wrażliwość algorytmu na wypoziomowanie obrazu, sprawdzenie obrócenia schematu i ewentualna jego korekta. W dalszych krokach, w celu uzyskania najlepszych wyników, algorytm bierze pod uwage˛ nie tylko wykryte kształty, mogace ˛ być później zdefiniowane jako prymitywy graficzne, ale również ma na uwadze zgodność położenia punktów charakterystycznych obrazu z faktycznym położeniem wierzchołków figur. W tym celu standardowe podejście polegajace ˛ na ekstrakcji krawedzi ˛ detektorem Canny’ego oraz bazujaca ˛ na nim detekcja prostych i odcinków przy użyciu transformaty Hougha, wsparte zostało przez wyniki detekcji wierzchołków uzyskane operatorem Harrisa. Tak otrzymane zbiory danych sa˛ w końcowym etapie analizowane pod wzgl˛edem logicznej struktury układu cyfrowego. Wykrywane sa˛ m.in. obrysy bramek logicznych, znajomość położenia których, znacznie przyspiesza dalsze przetwarzanie. Bazujac ˛ na detekcji przecie˛ ć i kolizji potencjalnych wielokatów ˛ z innymi już wykrytymi elementami tworzona jest sieć połacze ˛ ń. Na bazie wykrytych odcinków i wierzchołków położonych wewnatrz ˛ znalezionych kształtów przebiega dalszy proces wykrywania napisów w schemacie. Końcowym etapem jest proces tworzenia plików wynikowych: rastrowego podgladu ˛ w formacie PNG oraz formy wektorowej zapisanej w pliku SVG. Schemat zależności mie˛ dzy poszczególnymi elementami algorytmu wektoryzacji przedstawiony jest na rysunku 6.1. Poniższy opis algorytmów dotyczy ich wersji zaimplementowanej w bibliotece OpenCV. 6.1. Korekta obróconego obrazu wejściowego 19 Rysunek 6.1. Schemat algorytmów składowych aplikacji wektoryzujacej. ˛ W dalszych krokach przedstawione zostana˛ elementy składowe procesu wektoryzacji. Dla uproszczenia, wszystkie operacje dokonywane były na tym samym schemacie widocznym na rysunku 6.2. 6.1. Korekta obróconego obrazu wejściowego Transformata Hougha, której wykorzystanie do wykrywania odcinków opisane jest w punkcie 6.3, przydatna jest także w poczatkowej ˛ fazie analizy obrazu. Dopuszczalne jest, aby obraz wejściowy był obrócony. Opisany dalej algorytm silnie zależy od prawidłowego ułożenia obrazu, zatem taki obrót powinien być korygowany. Transformata Hougha, w wersji przez mnie zastosowanej, w wyniku działania zwraca liste˛ par wierzchołków bed ˛ acych ˛ końcami odcinków odnalezionych w obrazie. Wykorzystujac ˛ przekształcenie równania prostej, na której leży odcinek, do postaci normalnej oraz majac ˛ na uwadze zależności trygonometryczne, możemy uzyskać liste˛ katów ˛ odchyleń wszystkich odcinków (w układzie współrzednych ˛ biegunowych jest to wartość kata ˛ skierowanego pomiedzy ˛ półprosta˛ osi współrzednych ˛ a odcinkiem be˛ dacym ˛ odległościa˛ prostej od poczatku ˛ układu). Sortujac ˛ katy ˛ i wyznaczajac ˛ średnia˛ z otoczenia o zadanym promieniu wokół mediany listy można uzyskać wartość kata ˛ obrócenia całego obrazu z dokładnościa˛ do dziesiatych ˛ lub 6.2. Detektor krawedzi ˛ Canny’ego 20 Rysunek 6.2. Rastrowy plik wejściowy w formacie PNG. nawet setnych cze˛ ści stopnia. Taka dokładność wystarczy, aby obraz przetwarzany był dalej bez przeszkód. 6.2. Detektor krawedzi ˛ Canny’ego Detektor Canny’ego jest wieloetapowym algorytmem wykrywania krawedzi ˛ w obrazie. Jest to także najcze˛ ściej pierwszy krok w procesie wektoryzacji [17, 19, 20]. Spośród wszystkich detektorów krawedzi, ˛ detektor Canny’ego w [11] uważany jest za optymalny, gdyż zapewnia: — dobra˛ detekcje˛ – wykrywa tak dużo krawedzi, ˛ jak to tylko możliwe — dobre umiejscowienie – wykryta krawedź ˛ leży możliwie blisko krawedzi ˛ rzeczywistej — minimalna˛ odpowiedź – szum z obrazu wejściowego nie powinien tworzyć kraw˛edzi fałszywych, a znalezione krawedzie ˛ sa˛ oznaczane tylko jeden raz. Powyższe wymagania sa˛ spełnione, gdyż detektor Canny’ego wykorzystuje rachunek wariacyjny za pomoca˛ którego wyszukiwana jest funkcja optymalizujaca ˛ 6.2. Detektor krawedzi ˛ Canny’ego 21 Rysunek 6.3. Krawe˛ dzie wykryte przy użyciu detektora Canny’ego. dany funkcjonał. Optymalna funkcja opisana jest przez sume˛ czterech wykładniczych warunków, ale może być przybliżona pierwsza˛ pochodna˛ funkcji Gaussa. Wynik działania detektora krawedzi ˛ Canny’ego na przykładowym obrazie przedstawiono na rysunku 6.3. 6.2.1. Redukcja szumu Detektor krawe˛ dzi Canny’ego wykorzystuje filtr bazujacy ˛ na pierwszej pochodnej funkcji Gaussa, ponieważ jest czuły na obecność szumu w obrazie. Poczatkowym ˛ krokiem, jest zatem dokonanie splotu obrazu z filtrem Gaussa. Efektem tego działania jest rozmazany obraz, który charakteryzuje sie˛ brakiem znacznych zakłóceń. Macierz rozmycia Gaussa może być dowolna˛ macierza˛ kwadratowa. ˛ We wzorze 6.1 przedstawiono macierz filtra 5 × 5 używanego w bibliotece OpenCV, wykorzystywanego do obróbki obrazu ze współczynnikiem σ = 1.4. Zgodnie z dokumentacja˛ [4], odchylenie standardowe filtru Gaussa jest pierwszym z sześciu parametrów metody. Im jest ono wie˛ ksze, tym mniej „fałszywych” krawedzi ˛ zostanie rozpoznanych, jednocześnie wydłużajac ˛ czas samej konwolucji. 22 6.2. Detektor krawedzi ˛ Canny’ego 2 4 5 4 2 4 9 12 9 4 1 B= 5 12 15 12 5 ∗ A 59 4 9 12 9 4 2 4 5 4 2 (6.1) 6.2.2. Wyszukiwanie nate˛ żenia gradientu W zwiazku ˛ z faktem, że wykryta w obrazie krawedź ˛ może być skierowana w różnych kierunkach, algorytm Canny’ego wykorzystuje cztery filtry do detekcji poziomych, pionowych oraz ukośnych krawedzi ˛ na wstepnie ˛ wygładzonym obrazie. Inne operatory detekcji krawe˛ dzi (np. Krzyż Robertsa, Prewitt, Sobel) zwracaja˛ wartości pierwszej pochodnej jedynie dla kierunku poziomego (Gy ) i kierunku pionowego (Gx )( [21] s. 113). Gradient krawedzi ˛ oraz jej kierunek moga˛ być określone na podstawie wzorów: odpowiednio q G = Gx 2 + Gy 2 (6.2) Gy ). Gx (6.3) oraz Θ = arctan ( Kat ˛ wykrytej krawe˛ dzi zaokraglony ˛ jest do 45◦ dajac ˛ cztery podstawowe przypadki reprezentujace ˛ odpowiednio: pion (N −S), poziom (E −W ) oraz dwie przekatne ˛ (SE − N W ) i (SW − N E). 6.2.3. Usuwanie niemaksymalnych pikseli Usuwanie niemaksymalnych pikseli w wykrytych krawedziach ˛ sprowadza sie˛ do „pocieniania” krawe˛ dzi w sposób zapewniajacy ˛ ich ciagłość ˛ i zachowanie szerokości jednego piksela. Dla każdego z pikseli rozpatrywane sa˛ dwa piksele sasiednie ˛ wybrane na podstawie najmniejszego, uprzednio obliczonego gradientu. Jeśli właściwy piksel nie ma intensywności wiekszej ˛ niż sasiedzi, ˛ jest zerowany. 6.2.4. Progowanie z histereza˛ Progowanie z histereza˛ wymaga podania dwóch wartości progowych gradientu: T1 oraz T2 . Jeśli intensywność krawedzi ˛ jest wieksza ˛ niż T2 , krawedź ˛ uznaje sie˛ za pewna, ˛ zaś jeśli jest mniejsza niż T1 , jest ona usuwana z obrazu. Dla wartości pośrednich, do już wykrytych krawedzi ˛ sa˛ dołaczane ˛ nastepne ˛ piksele mimo spadku 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków 23 intensywności, aż do osiagni ˛ ecia ˛ dolnego progu wykrywania. Takie postepowanie ˛ zapobiega dzieleniu krawe˛ dzi w miejscach słabszego kontrastu. Wywołanie detektora Canny’ego z parametrami użytymi w programie przedstawiono na wydruku 6.1. 1 2 3 4 5 6 Imgproc.Canny( source, // Macierz wejsciowa result, // Macierz wyniku 50, // Mniejszy parametr histerezy 200 // Wiekszy parametr histerezy ); Wydruk 6.1. Wywołanie funkcji detektora krawedzi ˛ Canny’ego. 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków Transformata Hougha jest technika˛ ekstrakcji cech w procesie przetwarzania i analizy obrazów. Pozwala ona na znalezienie wystapie ˛ ń obiektów zdefiniowanych w klasach kształtów za pomoca˛ procedury głosowania. Proces ten jest w praktyce znajdowaniem współrze˛ dnych punktów lokalnych wartości maksymalnych umieszczonych w przestrzeni głosowania. Standardowym zastosowaniem klasyfikacji za pomoca˛ algorytmu Hougha jest wykrywanie prostych i odcinków, ale rozszerzona wersja transformaty pozwala na identyfikacje innych kształtów analitycznych, najcz˛eściej okre˛ gów i elips. Bazujac ˛ na wnioskach z doświadczeń wykrywania odcinków zaprezentowanego w [13], zastosowanie transformaty Hougha wydaje sie˛ być najwłaściwszym sposobem detekcji prostych w obrazie. Wiedzac, ˛ że każde równanie kierunkowe prostej: y = ax + b, (6.4) opisujace ˛ prosta˛ na płaszczyźnie, można również opisać za pomoca˛ równania ogólnego: Ax + By + C = 0. (6.5) Tym samym wektor [−B, A] jest wtedy wektorem kierunkowym tej prostej. Aby sprowadzić powyższe równanie do postaci normalnej należy podzielić współczynniki przez norme˛ wektora kierunkowego. Dla C 6 0 otrzymujemy: √ a dla C > 0: B C A x+ √ y+√ =0 2 2 2 2 +B A +B A + B2 A2 (6.6) 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków 24 Rysunek 6.4. Parametry równania normalnego prostej. √ −A −B −C x+ √ y+√ =0 2 2 2 2 A +B A +B A2 + B 2 (6.7) Dla ułatwienia dalszych obliczeń przyjmijmy, że Z bedzie ˛ długościa˛ przeciwprostokatnej ˛ trójkata ˛ wyznaczonego prosta˛ i osiami współrzednych, ˛ jak na rysunku 6.4. s Z= −C 2 −C 2 ( ) +( ) = A B r Zatem: sin(θ) = oraz: cos(θ) = 1 1 C 2( 2 + 2 ) = C A B −C A Z −C B Z = = C AB C AB √ √ −C A A2 + −C B A2 + r B2 B2 A2 + B 2 C p 2 = A + B2 A2 B 2 AB −B A2 + B 2 (6.9) −A . A2 + B 2 (6.10) =√ =√ (6.8) 25 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków Rysunek 6.5. Zbiór punktów tworzacych ˛ prosta˛ (po lewej) oraz ich reprezentacja w przestrzeni głosowania Hougha (po prawej). Dodatkowo, porównujac ˛ wzory na pole trójkata ˛ utworzonego przez osie i prosta˛ otrzymujemy: 1 1 −C −C Zρ = 2 2 B A 1 C p 2 1 C2 A + B2ρ = 2 AB 2 AB p 2 2 A +B ρ=C ρ= √ C + B2 A2 (6.11) Podstawiajac ˛ do wzoru 6.6 lub 6.7 wartości uzyskane we wzorach 6.9, 6.10 oraz 6.11 otrzymujemy postać normalna: ˛ x cos (θ) + y sin (θ) − ρ = 0, (6.12) gdzie ρ - odległość prostej od punktu (0,0), a θ - kat ˛ miedzy ˛ ρ, a OX (0 6 θ 6 2π). Odwzorowanie przekształcenia punktów leżacych ˛ na jednej prostej w sinusoidy w przestrzeni głosowania Hougha przedstawiono na rysunku 6.5, gdzie każdemu punktowi w przestrzeni kartezjańskiej odpowiada sinusoidalna krzywa w przestrzeni Hougha, a przez punkt przechodzi nieskończenie wiele prostych (pek). ˛ Wynika z tego, że punkty leżace ˛ na tej samej prostej koresponduja˛ z sinusoidami przechodzacymi ˛ przez wspólny punkt w przestrzeni Hougha. Tym samym, znalezienie prostej w układzie X, Y sprowadza sie˛ do znalezienia punktu w układzie θ, ρ o maksymalnej wartości i dokonania przekształcenia odwrotnego do przekształcenia ze wzoru 6.12. 6.3. Wykorzystanie transformaty Hougha przy wykrywaniu odcinków 26 Rysunek 6.6. Odcinki wykryte przy pomocy transformaty Hougha. Zaletami takiego rozwiazania ˛ jest to, że każdy punkt obrazu traktowany jest niezależnie, a tym samym istnieje ewentualna możliwość zrównoleglenia obliczeń. Metoda ta pozwala także na rozpoznawanie obiektów cześciowo ˛ zniekształconych lub przy segmentacji obrazów słabej jakości. Do wad można zaliczyć duże zapotrzebowanie na pamie˛ ć dla tymczasowego akumulatora wyniku oraz znaczna˛ złożoność obliczeniowa. ˛ Wynik działania transformaty Hougha w procesie wykrywania odcinków i linii w obrazie be˛ dacym ˛ wynikiem działania detektora Canny’ego (rysunek 6.3), przedstawiono na rysunku 6.6. Parametry 1 2 3 4 5 6 7 8 9 wywołania dajacy ˛ taki efekt załaczono ˛ na wydruku Imgproc.HoughLinesP( source, // Macierz wejsciowa lines, // Wektor przechowujacy wyniki. 1, // Rozdzielczosc akumulatora wyrazona w pikselach. Math.PI / 180, // Rozdzielczosc katowa akumulatora. 10, // Minimalny poziom ,,glosow’’ do zachowania odcinka w procesie glosowania. 10, // Minimalna dlugosc docinka. Linie krotsze sa odrzucane. 10 // Maksymalny odstep miedzy punktami tego samego odcinka pozwalajacy je polaczyc. ); Wydruk 6.2. Wywołanie funkcji transformaty Hougha. 6.2. 27 6.4. Detektor wierzchołków Harrisa Rysunek 6.7. Idea działania detektora Harrisa. 6.4. Detektor wierzchołków Harrisa Transformata Hougha, mimo kompleksowego podejścia do problemu wykrywania odcinków, cze˛ stokroć daje w odpowiedzi odcinki utworzone z pozornie powia˛ zanych ze soba˛ punktów lub rozdziela linie, które powinny być połaczone. ˛ W celu polepszenia wyników całego procesu wektoryzacji, wyniki detekcji odcinków konfrontowane sa˛ z punktami wykrytymi detektorem Harrisa. Obraz w poszukiwaniu wierzchołka obserwowany jest przez przesuwajac ˛ a˛ sie˛ nad nim okno, badajac ˛ zmiane˛ pochodnej intensywności w stosunku do kierunku przesuwania, jak na rysunku 6.7. Dla wierzchołka, przesuwanie okna w którakol˛ wiek strone˛ powinno dać duża˛ odpowiedź. Aby ustalić współrze˛ dne wierzchołka używa sie˛ uśrednionej w oknie zmiany intensywności dla zadanego przesuniecia ˛ [u, v] wyrażonej wzorem: E(u, v) = X w(x, y)[I(x + u, y + v) − I(x, y)]2 , (6.13) x,y gdzie funkcja˛ okna w(x, y) jest funkcja Gaussa: w(x, y) = G(x, y, σ) = 1 (− x2 +y2 2 ) e 2σ . 2πσ 2 (6.14) Wykorzystujac ˛ obliczona˛ zmiane˛ intensywności w oknie oraz wiedzac, ˛ że dla małych przesunie˛ ć możemy przyjać ˛ przybliżenie E(u, v) wyrażone wzorem 6.15 jesteśmy w stanie otrzymać macierz M . " # h i u E(u, v) ∼ = u v M v (6.15) 28 6.4. Detektor wierzchołków Harrisa Rysunek 6.8. Elipsa kowariancji. M jest macierza˛ 2x2 wyliczona˛ na podstawie pochodnych obrazu zgodnie ze wzorem: " M= X w(x, y) x,y Ix 2 Ix Iy Ix Iy Iy 2 # . (6.16) Obliczajac ˛ wartości własne macierzy M otrzymujemy elipse˛ kowariancji zmian intensywności, jak na rysunku 6.8. Długości półosi elipsy oznaczane jako λ1 oraz λ2 pozwalaja˛ określić, która cześć ˛ obrazu obserwowana była przez okno. Na rysunku 6.9 przedstawiono wykres decyzyjny zależny od λ1 oraz λ2 . Zgodnie z nim detektor Harrisa pozwala stwierdzić istnienie: — płaskiego regionu, gdy λ1 oraz λ2 sa˛ małe, a E prawie stałe w każdym kierunku — krawe˛ dzi, gdy λ1 λ2 albo λ2 λ1 — wierzchołka, gdy λ1 oraz λ2 sa˛ duże i porównywalne, a E zmienia sie˛ w każdym kierunku. Wynik działania wywołania detektora wierzchołków Harrisa przedstawionego na wydruku 6.3 na przykładowym obrazie pokazano na rysunku 6.10, a kombinacje˛ wykrytych odcinków i wierzchołków na rysunku 6.11. 6.4. Detektor wierzchołków Harrisa Rysunek 6.9. Wykres decyzyjny detektora Harrisa. 29 6.5. Przetwarzanie zebranych danych 30 Rysunek 6.10. Efekt działania detektora wierzchołków Harrisa. 1 2 3 4 5 6 7 8 9 10 11 Imgproc.goodFeaturesToTrack( source, // Macierz wejsciowa detectedCorners, // Wektor przechowujacy wyniki 999, // Maksymalna liczba wierzcholkow 0.01, // Miara jakosci najgorszego wierzcholka wyrazona ulamkiem wartosci najlepszego. 1, // Minimalna odleglosc miedzy wierzcholkami source, // ROI (ang. Region of interest) 3, // Rozmiar bloku okreslajacego sasiedztwo. true, // Gdy ,,true’’ uzywany jest detektor Harrisa, dla ,,false’’ funkcja cornerMinEigenVal(). 0.01 // Wolny parametr detektora Harrisa ); Wydruk 6.3. Wywołanie funkcji detektora wierzchołków Harrisa. 6.5. Przetwarzanie zebranych danych Wyżej wymienione elementy przetwarzania obrazu pozwalaja˛ na zebranie danych o logicznej strukturze obrazu. Definiuja˛ one położenie linii i odcinków wykrytych transformata˛ Hougha (przechowywanych w programie w liście lines jak również „mocnych” wierzchołków jako efekt działania detektora Harrisa (przechowywanych w freeCorners). Takie dane same nie zapewniaja˛ możliwości utworzenia obrazu wynikowego i musza˛ zostać poddane dalszej analizie. Ze wzgledu ˛ na 6.5. Przetwarzanie zebranych danych 31 Rysunek 6.11. Kombinacja detektora Harrisa i wyników działania transformaty Hougha. 32 6.5. Przetwarzanie zebranych danych sprecyzowane zastosowanie aplikacji, do poprawnego odwzorowania obrazu rastrowego oprócz zebranych informacji o wykrytych obiektach, wykorzystałem właściwości wektoryzowanych schematów układów cyfrowych. Bazujac ˛ na informacjach dotyczacych ˛ rozmiarów i kształtów elementów układów cyfrowych, które zawarte sa˛ w dokumentacji standaryzujacej ˛ [8], można cały proces znacznie przyspieszyć, poprawić efekty i zmniejszyć wynikowy rozmiar pliku grafiki wektorowej. Ważnym elementem w dalszym procesie sa˛ także informacje zgromadzone podczas wczytywania obrazu np. jego rozmiar. Dane o poszczególnych pikselach umieszczane sa˛ w klasie biblioteki OpenCV - Mat bed ˛ acej ˛ dwuwymiarowa˛ reprezentacja˛ tablicy, na której można wykonywać operacje macierzowe. Rozmiar otrzymany z takiej struktury jest pomocny podczas definiowania nagłówka pliku wektorowego jak również w procesie skalowania np. do utrzymania stałego współczynnika proporcjonalności boków. 6.5.1. Odnajdywanie wierzchołków prostokatów ˛ Pierwszym krokiem, bazujac ˛ na proporcjach boków prostokatów ˛ okalajacych ˛ obramowanie symbolu bramki logicznej, jest znalezienie wśród wykrytych wierzchołków (freeCorners) takich, które te proporcje spełniajac ˛ tworzyłyby prostokat. ˛ Przeprowadzone w poczatkowej ˛ fazie testy wykazały, że niezależnie od jakości i rozmiaru obrazu, wierzchołki prostokatów ˛ znajdowane sa˛ zawsze, co wynika ze specyfiki detektora Harrisa. Wierzchołki położone na styku dwóch prostopadłych do siebie odcinków daja˛ bardzo dobra˛ odpowiedź podczas przesuwu okna nad nimi, a tym samym w późniejszym etapie detekcji, ich „wskaźnik jakości” jest wysoki. Takie podejście mimo zakładanej dużej złożoności obliczeniowej, dzieki ˛ optymalizacji przerwań przeszukiwań nie zwieksza ˛ w dużym stopniu czasu wektoryzacji, a odnalezione w pierwszym kroku wierzchołki, które tworza˛ prostokaty, ˛ znacznie zaw˛eżaja˛ dalsze zbiory przeszukiwań i wykorzystywane sa˛ jako struktury pomocnicze w każdym kolejnym kroku. Zbiór odnalezionych wierzchołków przechowywany jest w liście rectCorners, w której wierzchołki bramek logicznych lub przerzutników zgrupowane sa˛ po cztery oraz posortowane rosnaco ˛ po współrzednej ˛ x a nast˛epnie współrze˛ dnej y. Zbiór takich wierzchołków usuwany jest sukcesywnie ze zbioru wierzchołków wolnych freeCorners. 6.5.2. Odnajdywanie obramowania prostokatów ˛ Bazujac ˛ na punktach be˛ dacych ˛ czterema wierzchołkami wewnetrznego ˛ prostokata ˛ na podstawie dokumentacji IEEE obliczany jest właściwy kształt. Wymiary, 6.5. Przetwarzanie zebranych danych 33 grubość krawe˛ dzi i inne parametry wygladu ˛ obramowania bramki logicznej zdefiniowane sa˛ w dokumencie standaryzacyjnym jako wartości zależne od grubości pojedynczej linii sygnałowej. Dla każdego wykrytego obramowania tworzona jest także instancja obiektu typu Rectangle. Wykorzystywane sa˛ one później do kreślenia obrazu wektorowego i rastrowego podgladu. ˛ W tej klasie umieszczone sa˛ także metody, które na podstawie odczytanych wymiarów dobieraja˛ odpowiednia˛ szerokość kreślenia krawe˛ dzi. Każde pojedyncze odnalezienie obramowania umieszczane jest w liście rectangles. 6.5.3. Odnajdywanie punktów wewnetrznych ˛ Kolejnym krokiem jest znalezienie punktów wewnatrz ˛ prostokatów. ˛ Ten zbiór nie dość, że ograniczy dalsze poszukiwanie to bedzie ˛ wykorzystany w procesie detekcji symboli. Istotne ze wzgledu ˛ na dalsza˛ konieczność utworzenia otoczki okalajacej ˛ te punkty jest zawarcie nie tylko wierzchołków Harrisa, ale także punktów be˛ dacych ˛ końcami wykrytych odcinków i leżacych ˛ w całości wewnatrz ˛ prostokata. ˛ Punkty, o ile zostana˛ uznane, że leża˛ wewnatrz ˛ prostokata ˛ trafiaja˛ do listy textCorners oraz usuwane sa˛ z listy wierzchołków wolnych. Dalsza ich analiza przedstawiona jest w punkcie 6.5.5. 6.5.4. Wykrywanie punktów i wielokatów ˛ połacze ˛ ń Bazujac ˛ na położeniu pozostałych wolnych wierzchołków wzgledem ˛ ograniczenia konturu bramki logicznej nastepuje ˛ podział na wierzchołki tworzace ˛ doprowadzenia sygnału do wejścia bramek (z lewej strony) oraz wyprowadzenia (z prawej). Wyjście sygnałowe może tworzyć bardziej skomplikowany kształty - ukośnie odchodzace ˛ podłaczenie, ˛ co symbolizuje negacje˛ wyjścia np. w bramce typu NOT, NAND, NOR, XNOR lub w przypadku przerzutnika typu D. W zależności, czy na przedłużeniu linii wchodzacej ˛ lub wychodzacej ˛ z bramki znajduja˛ sie˛ inne znalezione punkty lub inne elementy, jak np. krawe˛ dzie symbolu bramki, linia sygnałowa jest dołaczana ˛ do napotkanego elementu lub też nie. Jeśli nie nastapiła ˛ detekcja przedłużenia z innym elementem, wyjście lub wejście zdefiniowane sa˛ określona˛ odległościa. ˛ Wierzchołki wykryte i zidentyfikowane jako należace ˛ do wejść i wyjść bramek trafiaja˛ odpowiednio do list inputCorners oraz outputCorners. Sa˛ one także usuwane z listy freeCorners. Jednocześnie tworzone sa˛ cześci ˛ układów tworzace ˛ połaczenia. ˛ Odpowiednio w liście inputPolygons dla wejść oraz outputPolygons dla wyjść sygnałowych. 6.5. Przetwarzanie zebranych danych 34 6.5.5. Odnajdywanie symboli Ze wzgle˛ du na skomplikowany kształt elementów (fontów wykorzystanych do wykreślenia symboli bramki) umieszczonych wewnatrz ˛ prostokatów, ˛ a w szczególności dla znaku „&” oraz symboli przerzutnika, w miejscu ich umieszczenia wyste˛ puje duże nagromadzenie wykrytych odcinków i wierzchołków. Bazujac ˛ zarówno na wykrytych odcinkach położonych całkowicie wewnatrz ˛ zarysu bramki jak i na punktach, wewnatrz ˛ każdej z nich znajdowana jest prostokatna, ˛ równolegle położona wobec krawe˛ dzi, otoczka wyznaczona przez minimalne i maksymalne współrz˛edne punktów lub końce odcinków. Jest to podstawa˛ do analizy symbolu. Jako że zbiór oznaczeń wewnatrz ˛ bramek logicznych jest niewielki (jedynie znaki: „1”, „= 1”, „≥ 1” oraz „&”) nie ma konieczności stosowania zaawansowanych algorytmów rozpoznawania tekstu, lecz jedynie bazujac ˛ na stosunku szerokości do wysokości otoczki, definiować jaki symbol jest w środku. Współczynniki rozmiarów różnia˛ sie˛ nieznacznie wzgle˛ dem siebie - 7 : 4 dla symbolu „= 1”, 5 : 4 dla „≥ 1”, 4 : 4 dla „&” oraz 2 : 4 dla symbolu „1”. Dla symboli przerzutnika typu D proporcje wykrytych symboli (1.8 : 4) sa˛ zbliżone do bramki NOT (2 : 4). Tym samym w procesie rozpoznawania brany jest pod uwage˛ także stosunek rozmiaru (wysokości) pola wykrytych elementów fontów do rozmiaru całej bramki. Wyniki detekcji symboli tworza˛ liste˛ wynikowa˛ textes elementów typu Text, która wykorzystywana jest do tworzenia plików końcowych. Dla celów porównawczych zapisywane sa˛ także otoczki wykrytych symboli w liście textBoundaries. Wyniki odnajdowania symboli bramek widoczne sa˛ na rysunku 6.12. 6.5.6. Łaczenie ˛ pozostałych wierzchołków wolnych W końcowym etapie łaczone ˛ sa˛ pozostałe „wolne” wierzchołki. Taka sytuacja ma najcze˛ ściej miejsce, gdy przebieg linii sygnałowej na schemacie jest skomplikowany i w całości nie jest rozpoznana w poprzednich krokach algorytmu. Także dla rozgał˛ezień połacze ˛ ń lub ich przeciecia ˛ ten krok zapewnia poprawna˛ detekcje. ˛ Wierzchołki w takim wypadku zazwyczaj leża˛ na przeciwnych rogach poszukiwanego segmentu wyznaczajacego ˛ połaczenie. ˛ Tym samym nie wystarczy połaczyć ˛ je, gdyż prowadziłoby to do powstawania przekłamań i niezgodności z obrazem wejściowym. Rozwiazaniem ˛ tego problemu jest badanie w otoczeniu potencjalnego połaczenia ˛ obecności wykrytych wcześniej odcinków. Jeśli ich obecność, położenie i ulokowanie wierzchołków odpowiada prawdowpodobnemu położeniu wielokata ˛ wyznaczononego na podstawie tylko wierzchołków nastepuje ˛ połaczenie. ˛ Także dla przecieć ˛ konieczna była detekcja dużego nagromadzenia wierzchołków w małym otoczeniu, 6.5. Przetwarzanie zebranych danych Rysunek 6.12. Wykryte elementy tworzace ˛ napisy na obrazie. 35 36 6.6. Rysowanie a dla rozgałe˛ zień wykrycie nawet wiekszej ˛ ich liczby. Analiza wzglednego ˛ położenia i rozmieszczenia wierzchołków na schemacie zapewnia rozpoznanie symbolu kropki oraz poprawne połaczenie ˛ wszystkich krawedzi. ˛ W tym etapie analizowane były wierzchołki freeCorners i w procesie analizy usuwane, a nie przenoszone do innych list. Pozwalały one jednak na ustalenie położeń punktów rozgałezienia ˛ połacze ˛ ń i zapisu ich w liście connectionCorners. 6.6. Rysowanie W momencie, kiedy wszystkie elementy zostały już rozpoznane i umieszczone w odpowiednich klasach końcowym etapem jest proces rysowania. Ze wzgledu ˛ na problem z niewspieraniem wyświetlania grafiki wektorowej bezpośrednio w systemie Android wyste˛ puje konieczność generowania dwóch plików: SVG oraz PNG służacego ˛ za podglad ˛ w aplikacji. O ile plik SVG tworzony jest zgodnie z przykładem przedstawionym na wydruku 5.1, to rysowanie elementów pliku PNG przebiega inaczej. Poszczególne elementy rysowane sa˛ lub sa˛ pomijane w zależności od ustawienia flagi determinujacej ˛ wersje˛ obrazu. wane sa˛ elementy przechowywane w listach: Dla wersji końcowej rysorectangles, inputPolygons, outputPolygons, textes oraz koła z listy connectionCorners bed ˛ ace ˛ miejscami rozgałe˛ zień linii sygnału. niane sa˛ listy: Dla wersji testowej dodatkowo uwzgled˛ freeCorners, rectCorners, textCorners, inputCorners, outputCorners, lines oraz textBoundaries. W zależności od wartości flagi, zmieniane sa˛ także kolory rysowania. Dla wersji testowej sa˛ one ustalone odgórnie, a w wersji końcowej definiowane każdorazowo przez użytkownika aplikacji. Wszystkie cze˛ ści składowe obrazu rysowane sa˛ przy użyciu funkcji bibliotecznych OpenCV. Tym samym obramowania bramek kreśli funkcja Core.rectangle(), połacze˛ nia elementów Core.fillConvexPoly(), linie Core.line(), wykryte wierzchołki Core.circle(), zaś funkcja˛ odpowiedzialna˛ za wstawianie tekstowych oznaczeń poszczególnych typów bramek jest Core.putText(). Ostatnim etapem jest wykorzystanie funkcji Highgui.imwrite() do zapisania obrazu PNG. Po zapisaniu, wszystkie pomocnicze elementy uzyskane w procesie wykrywania, analizy i wektoryzcji wygladaj ˛ a˛ podobnie jak te widoczne na rysunku 6.13, a wersja finalna przedstawiona została na rysunku 6.14. 37 6.6. Rysowanie =1 =1 ≥1 ≥1 & 1 & Rysunek 6.13. Pośredni etap wektoryzacji obrazu. 38 6.6. Rysowanie =1 =1 ≥1 ≥1 & 1 & Rysunek 6.14. Wynikowy plik grafiki wektorowej. 7. Interfejs użytkownika Interfejs użytkownika stworzony został z elementów dostepnych ˛ w środowisku systemu operacyjnego Android. Zgodnie z ogólnym trendem i zaleceniami twórców systemu, zarówno wyglad ˛ aplikacji, jak i poszczególne napisy, które sa˛ w niej osadzone definiowane sa˛ w oddzielnych plikach formatu XML. Ułatwia to kształtowanie wygladu ˛ aplikacji, a rozdzielenie warstwy tekstu od wygladu ˛ czyni ewentualna˛ internacjonalizacje˛ łatwiejsza. ˛ Po uruchomieniu programu pojawia sie˛ jego główne okno (rysunek 7.1(a)). W dolnej cze˛ ści ulokowane sa˛ trzy przyciski i pole tekstowe pozwalajace ˛ wprowadzić ścieżke˛ do pliku. Plik identyfikowany jest za pomoca˛ ścieżki bezwzglednej. ˛ Takie rozwiazanie ˛ pozwala na dostep ˛ do wszystkich plików widocznych w systemie Android. W momencie startu aktywny sa˛ tylko przyciski OK oraz Foto. Po naciśnie˛ ciu przycisku Foto, wykonaniu i zaakceptowaniu fotografii (rysunek 7.1(b)) lub po wprowadzeniu ścieżki do pliku i wciśnieciu ˛ przycisku OK pojawi si˛e niewielkie okno dialogowe sygnalizujace ˛ konieczność wykonania akcji przez użytkownika (rysunek 7.1(c)). Zmiana rozmiaru polega na wprowadzeniu w pola tekstowe zakładanej wysokości lub szerokości wyrażonej w pikselach i wciśnieciu ˛ przycisku Skaluj. Jeśli nie podano któregokolwiek z nich lub jednego, wymiar nie wprowadzony pobierany jest z właściwości obrazu wejściowego. Wynikowy rozmiar wyświetlany jest w prawym górnym rogu okna dialogowego. Użytkownik ma także możliwość podania kata ˛ o jaki należy obrócić obraz końcowy (wyrażonego nieujemna˛ liczba˛ całkowita), ˛ a także wyboru koloru na palecie1 (rysunek 7.1(d)) dla każdego z trzech elementów oddzielnie, po uprzednim wybraniu, czy zmiana odbywa sie˛ dla fontów, linii czy tła schematu. Po wciśnie˛ ciu przycisku OK nastepuje ˛ proces wektoryzacji. Użytkownik informowany jest o trwajacym ˛ w tle przetwarzaniu obrazu za pomoca˛ animowanej informacji wyświetlonej nad wygaszonym oknem aplikacji (rysunek 7.2(a)). 1 Wykorzystano w tym celu bibliotek˛e „AmbilWarna” dost˛epna˛ online: code.google.com/p/ android-color-picker/ 7. Interfejs użytkownika 40 W przypadku powodzenia i zakończenia wektoryzacji wyświetlany jest stosowny komunikat oraz odblokowywany przycisk prezentacji wyniku (rysunek 7.2(b)). Gdy podany plik nie zostanie odnaleziony widoczny bedzie ˛ stan jak na rysunku 7.2(c). Na rysunku 7.2(d) przedstawiono okno podgladu ˛ wyniku. Mimo, że wynikowy plik wektorowy SVG generowany jest podczas działania aplikacji, to ze wzgledu ˛ na ograniczenia wynikajace ˛ z systemu operacyjnego nie ma możliwości bezpośredniego wyświetlania go. Podglad ˛ widoczny w dolnej cześci ˛ rysunku jest obrazem wektorowym narysowanym na podstawie danych zebranych w procesie wektoryzacji. W górnej cze˛ ści podgladu ˛ widnieje podglad ˛ pliku oryginalnego. 41 7. Interfejs użytkownika (a) Główny widok (b) Podglad ˛ zdj˛ecia wykonanego wbudowanym aparatem (c) Okno edycji parametrów (d) Paleta wyboru koloru Rysunek 7.1. Wyglad ˛ okna aplikacji w systemie Android 42 7. Interfejs użytkownika (a) Sygnalizacja trwajacej ˛ wektoryzacji (b) Poprawne zakończenie (c) Niepoprawna ścieżka pliku (d) Podglad ˛ wyników Rysunek 7.2. Wyglad ˛ okna aplikacji w systemie Android cd. 8. Testowanie 8.1. Sprawdzanie działania aplikacji Proces testowania aplikacji, ze wzgledu ˛ na brak wsparcia wyświetlania grafiki wektorowej w formacie SVG w systemie Android, wymusił modyfikacje˛ podejścia do problemu. Korzystajac ˛ z możliwości oferowanych przez biblioteke˛ OpenCV podglad ˛ efektów wektoryzacji wyświetlany jest w sasiedztwie ˛ obrazu wejściowego. Nie jest to jednak forma wektorowa obrazu lecz plik grafiki rastrowej wiernie ja˛ odwzorowujacy. ˛ Podczas procesu wektoryzacji aplikacja tworzy zbiory elementów wykrytych na obrazie (odcinki, napisy, punkty itp.), które przechowywane sa˛ w odpowiednich klasach. W momencie zakończenia procesu tworzone sa˛ pliki wyjściowe, zarówno w postaci pliku PNG jak i SVG. O ile plik wektorowy może zostać podejrzany na innych urzadzeniach ˛ np. komputerze, to plik PNG wykorzystywany jest głównie do generowania podgladu. ˛ Jedyna˛ różnica˛ miedzy ˛ plikiem SVG a podgladem ˛ wyników jest kształt fontów. Specyfika SVG wymusza inny kształt poszczególnych znaków, jednakże co do treści poszczególnych napisów istnieje zgodność miedzy ˛ postacia˛ wektorowa˛ i rastrowa. ˛ Wynikowy obraz podgladu ˛ jest skalowany i obracany identycznie jak obraz wektorowy. Testowanie aplikacji musiało uwzgledniać ˛ możliwość wystapienia ˛ problemów na różnych płaszczyznach, zarówno na poziomie błedów ˛ interfejsu użytkownika, funkcjonalności jak i niedoskonałości algorytmów. Testy uwzgledniały: ˛ 1. Sprawdzenie poprawności rozpoznawania pojedynczych symboli (bramek, przerzutnika, połacze ˛ ń, przecieć) ˛ jak i całych układów, również dla obrazów obróconych np. podczas skanowania. 2. Kontrola obrazu wyjściowego w przypadku zmiany przez użytkownika kata ˛ obrotu obrazu wyjściowego. 3. Sprawdzanie poprawności generowanych plików dla różnych współczynników skalowania, tj. czy elementy dla dużych i małych współczynników skalowania zachowuja˛ wzgle˛ dne odległości od siebie i czy nie zachodza˛ inne anomalie. Badano także, czy wyliczanie wymiarów odbywa sie˛ poprawnie. 8.2. Strojenie parametrów aplikacji 44 4. Testowanie zgodności wybranych kolorów dla każdej z trzech grup elementów. 5. Badanie zgodności generowanego podgladu ˛ (PNG) z otrzymanymi plikami wektorowymi (SVG). 6. Sprawdzanie wpływu poszczególnych modyfikacji na siebie w przypadku jednoczesnego użycia (np. czy skalowanie i obrót nie spowoduje ucinania cześci ˛ obrazu). 7. Sprawdzanie zachowania aplikacji na pliki wejściowe o różnych rozszerzeniach. Testowane były zarówno poprawne rozszerzenia plików graficznych: *.bmp, *.dib, *.png, *.jpeg, *.jpg, *.jpe, *.jp2, *.tiff, *.tif, *.pbm, *.pgm, *.ppm, *.sr, *.ras, jak i odpowiedź mechanizmu kontroli dla kilku plików niepoprawnych m.in: *.txt, *doc, *.pdf. 8. Obiektywne porównywanie wyników uzyskiwanych w procesie wektoryzacji z wersja˛ oryginalna˛ oraz analizowanie pliku pośredniego (rysunek 6.13) w celu sprawdzenia, czy sam proces odbywał sie˛ poprawnie. Wektoryzacje˛ przeprowadzano dla obrazów przedstawiajacych ˛ układy cyfrowe różnego typu. 9. Sprawdzanie zachowania aplikacji na różne niepoprawne ścieżki dostepu ˛ do plików. 10. Sprawdzanie działania aplikacji dla niepoprawnych co do zawartości plików graficznych np. zdje˛ ć czy pustych plików graficznych. Ze wzgledu ˛ na charakter aplikacji, takie obrazy nie bed ˛ a˛ wektoryzowane. 11. Badanie stabilności aplikacji, także na nietypowe zachowania użytkownika oraz te wynikajace ˛ ze sposobu obsługi aplikacji w systemie operacyjnym Android. Badane było, zachowanie w przypadku próby przerwania procesu wektoryzacji przyciskiem „wstecz” lub „ekran główyny”, próby wciśniecia ˛ wie˛ kszej liczby przycisków itp. Wyniki testowania obrazów przykładowych przedstawiono na rysunkach 8.1 oraz 8.2. 8.2. Strojenie parametrów aplikacji Na potrzeby zaliczenia projektu z przedmiotu Techniki kompilacji przygotowałem parser własnego je˛ zyka skryptowego, którego główna˛ funkcjonalnościa˛ miało być wsparcie doboru odpowiednich parametrów różnych funkcji biblioteki OpenCV w toku pracy nad tworzeniem aplikacji wektoryzujacej. ˛ Dzieki ˛ niemu mogłem ustalić wspływ poszczególnych parametrów na uzyskiwane wyniki. Dla funkcji wykrywajacej ˛ odcinki (transformaty Hougha), były to m.in. wartości progowe użytego detektora Canny’ego, minimalne długości poszczególnych odcinków i maksymalny 45 8.2. Strojenie parametrów aplikacji (a) Obraz testowy 1 (b) Obraz wynikowy 1 (szerokość 2:1, wysokość 1:1, kat ˛ 15◦ , kolor fontów: czerwony, kolor elementów: żółty, kolor tła: granatowy) (c) Obraz testowy 2 (d) Obraz wynikowy 2 (szerokość 1:1, wysokość 2:1, kat ˛ 340◦ , kolor fontów: biały, kolor elementów: biały, kolor tła: bł˛ekitny) Rysunek 8.1. Wyniki testów 46 8.2. Strojenie parametrów aplikacji (a) Obraz testowy 3 (b) Obraz wynikowy 3 (szerokość 1:1, wysokość 1.3:1, kat ˛ 0◦ , kolor fontów: czarny, kolor elementów: czarny, kolor tła: biały) (c) Obraz testowy 4 (obraz obrócony) (d) Obraz wynikowy 4 (szerokość 1:1, wysokość 1:1, kat ˛ 0◦ , kolor fontów: czarny, kolor elementów: różowy, kolor tła: zielony) Rysunek 8.2. Wyniki testów cd. 8.2. Strojenie parametrów aplikacji 47 rozmiar przerw mie˛ dzy nimi. Dla funkcji detektora Harrisa skrypt pozwalał na modyfikacje˛ liczby zwracanych wierzchołków, ich minimalnej „jakości”, odległości pomi˛edzy poszczególnymi wystapieniami ˛ oraz definiowanie rozmiaru okna sasiedz˛ twa. Możliwość jaka˛ dawał parser, tj. każdorazowego zapisu wyniku do innego pliku, pozwalała na obiektywne porównywanie zastosowanych parametrów i znacznie skróciła całkowity czas dopasowywanie ich do otrzymania najlepszych wyników. W celu stworzenia zarówno leksera jak i parsera wykorzystałem możliwości programu ANTLR v3., który na podstawie zadanej gramatyki generuje parser typu LL(*). W zwiazku ˛ z koniecznościa˛ wielokrotnego testowania różnych funkcji aplikacji przetwarzania obrazów bitmapowych z różnymi parametrami, interpreter zapewnia taka˛ możliwość, bez konieczności każdorazowej kompilacji. Wielokrotne wywołania moga˛ zostać zastapione ˛ przez petle ˛ do...while, a parametry funkcji moga˛ być zależne od zmiennych. Skrypt powinien zostać przygotowany zgodnie z opisem i uwzgle˛ dnieniem przeznaczenia zmiennych i wywołań podanymi w dodatku A w wydruku A.1, a dokładna gramatyka w notacji EBNF została przedstawiona w wydruku A.2. Parser zapewnia naste˛ pujace ˛ funkcjonalności: — parsowanie skryptów zapisanych w plikach tekstowych — umożliwienie wielokrotnego wykonywania wywołań zamknietych ˛ w petli ˛ do...while i zależnych od iteratora — przestrzeganie logicznego porzadku ˛ wczytanie-funkcje-zapis — możliwość wywoływania funkcji wielokrotnie i w dowolnej kolejności — kontrole˛ poprawności wprowadzonych danych, np. zgodności wartości argumentów funkcji (typu całkowitego i podwójnej precyzji) z definicja˛ — informowanie użytkownika, w którym miejscu skryptu wystapił ˛ bład ˛ — sprawdzanie, czy zmienna użyta w funkcji, została wcześniej zainicjowana — dynamiczne typowanie i ewentualne rzutowanie — pomijanie białych znaków w tekście Przykładowy kod źródłowy skryptu wczytujacy ˛ obraz rastrowy, dokonujacy ˛ transformaty Hougha dla odcinków i wywołujacy ˛ funkcje˛ detektora wierzchołków Harrisa oraz zapisujacy ˛ wyniki do pliku wektorowego przedstawiono w wydruku 8.1. 1 2 3 4 load("/mnt/sdcard/camera/DCIM1209.jpeg") houghL(1, 0.02, 10, 5, 20, 75, 100) harris(99, 0.01, 58, 3, true, 0.04) save("/mnt/sdcard/test/test.svg") Wydruk 8.1. Skrypt: Wykrywanie odcinków i wierzchołków. 9. Dokumentacja projektu Aplikacja wektoryzujaca ˛ podzielona została na pieć ˛ pakietów, z których każdy agreguje klasy o innym przeznaczeniu. Podział klas i pakietów wraz z krótkim opisem zamieszczono poniżej. Diagram przypadków użycia przedstawiono na rysunku 9.1, a diagram klas, obrazujacy ˛ zależności miedzy ˛ klasami, na rysunku 9.2. Dokładniejsze wyjaśnienia działania oraz przeznaczenia danych zmiennych i funkcji można znaleźć w kodzie programu. 1. pl.edu.pw.elka.pjastrz2.android.application — Consts – Stałe programu. Opcje dla kompilacji Release i Debug. — MainApplication – Klasa główna aplikacji. Przechowuje kontekst globalny. 2. pl.edu.pw.elka.pjastrz2.android.activity — ImageActivity – Activity prezentacji wyników. — StartActivity – Główne Activity aplikacji. Obsługuje zdarzenia naciśniecia ˛ przycisków i wprowadzania ścieżki pliku. 3. pl.edu.pw.elka.pjastrz2.android.operations — CornerDetection – Klasa implementujaca ˛ wykrywanie rogów metoda˛ Harrisa. — EdgeDetection – Klasa implementujaca ˛ wykrywanie krawedzi ˛ metoda˛ Canny’ego. — RotateImage – Klasa zapewniajaca ˛ obrót obrazu tak, aby był wypoziomowany. — HoughLine – Klasa implementujaca ˛ wykrywanie odcinków transformata˛ Hougha. 4. pl.edu.pw.elka.pjastrz2.android.data — DataContainer – Kontener przechowujacy ˛ wszystkie elementy, które moga˛ być rysowane na obrazie. — Polygon – Klasa definiujaca ˛ wielokaty ˛ wykryte w obrazie. — Line – Klasa definiujaca ˛ odcinki wykryte w obrazie. — Rectangle – Klasa definiujaca ˛ prostokaty ˛ wykryte w obrazie. — Text – Klasa definiujaca ˛ napisy wykryte w obrazie. — Corner – Klasa definiujaca ˛ wierzchołki wykryte w obrazie. 9. Dokumentacja projektu 49 Rysunek 9.1. Diagram przypadków użycia 5. pl.edu.pw.elka.pjastrz2.android.utilities — PointComparator – Comparator sortowania listy tablic double po rosnacym ˛ X a potem Y. — ProcessImage – Główna klasa przetwarzajaca ˛ obraz. — SaveToSvgFile – Klasa implementujaca ˛ metody zapisu do pliku SVG. — SaveToPngFile – Klasa implementujaca ˛ metody zapisu do pliku PNG. 9. Dokumentacja projektu Rysunek 9.2. Diagram klas aplikacji wektoryzujacej ˛ 50 10. Podsumowanie 10.1. Spełnienie założeń Podstawowym założeniem pracy inżynierskiej było przygotowanie projektu aplikacji pozwalajacej ˛ na wektoryzowanie pewnego ściśle określonego typu obrazów rastrowych. Wybór rodzaju tych obrazów nie był wcale oczywisty. Czytajac ˛ artykuły naukowe na IEEE Xplore [6] dotyczace ˛ różnego typu wektoryzacji zastanawiałem si˛e, czy problem mnie nie przerósł i czy mu podołam. Tym bardziej, że niektóre z nich dotyczyły wektoryzacji materiału bardzo trudnego w przetwarzaniu - obrazów fotorealistycznych. Ze wzgle˛ du na che˛ ć pogłe˛ bienia znajomości coraz popularniejszej ostatnio biblioteki przetwarzania obrazu w czasie rzeczywistym - OpenCV, chciałem, żeby w moim projekcie w jak najszerszym możliwym spektrum wykorzystać i poznać algorytmy w niej zaimplementowane, aby jej użycie było podyktowane nie tylko łatwościa˛ rozwiazywania ˛ podproblemów, ale żebym w trakcie pracy rozumiał co i jak dokładnie dzieje sie˛ przy wywołaniu każdej funkcji. Tym bardziej przemawiał do mnie fakt, że kierunek rozwoju biblioteki zbiegał sie˛ z moim drugim zainteresowaniem - programowaniem aplikacji na platformy mobilne. Rozwój biblioteki jest ciagły ˛ i obejmuje coraz szersze spektrum systemów operacyjnych: pierwsza oficjalna wersja przygotowana została dla systemów Windows, Linux oraz Mac OS 19 października 2006 roku, wersja przeznaczona dla systemu operacyjnego Android pojawiła sie˛ 12 września 2011 roku a dla iOS - już 4 sierpnia 2012 roku. To właśnie ze wzgle˛ du na zainteresowanie technologiami mobilnymi a najbardziej programowaniem w środowisku systemu Android postanowiłem połaczyć ˛ te dwie technologie - wykorzystać biblioteke˛ OpenCV do przygotowania aplikacji wektoryzujacej ˛ działajacej ˛ pod kontrola˛ systemu Android. Przeszukanie repozytorium aplikacji dla systemu Android - Google Play [5] - wykazało, że takiej, ani podobnej do niej aplikacji jeszcze nie ma, a co ważniejsze - istnieje coraz to wieksze ˛ zapotrzebowanie na wyspecjalizowane programy graficzne jak np. Adobe Photoshop Touch firmy Adobe Systems oraz techniczne np. AutoCAD WS firmy Autodesk Inc. 10.1. Spełnienie założeń 52 dost˛epne w sklepie Android. Tym samym zwiazałem ˛ silnie mój projekt z jezykiem ˛ Java, który jest mi znany, ale w formie jezyka ˛ aplikacji Android zapewnia mechanizmy, funkcje i wzorce, które z pewnościa˛ były ciekawe i nieraz innowacyjne. Wymagało to także poznania architektury i działania systemu operacyjnego z niższego poziomu, co na pewno jest ważnym doświadczeniem. W toku pracy nad aplikacja˛ udało mi sie˛ znacznie poszerzyć swoja˛ wiedze˛ na temat zagadnień przetwarzania obrazu - zarówno algorytmów jak i stosowanych bibliotek. Wykorzystanie jednej z nich - powszechnie stosowanej biblioteki OpenCV otwiera droge˛ do dalszego rozwijania sie˛ w kierunku grafiki komputerowej. Dodatkowo fakt, że środowiskiem uruchomieniowym sa˛ urzadzenia ˛ mobilne działajace ˛ pod systemem Android nie pozostaje bez znaczenia. Obserwuje sie˛ aktualnie znaczny wzrost liczby przenośnych urzadze ˛ ń działajacych ˛ pod kontrola˛ tego systemu, zarówno telefonów komórkowych jak i tabletów. Znajomość architektury, właściwości systemu oraz specyfiki tworzenia dedykowanych aplikacji jest także bardzo pożadana ˛ na obecnym rynku pracy. Zastosowane podejście oparte na wykrywaniu podstawowych kształtów oraz detekcji wierzchołków wsparte algorytmami analizy logicznej zgromadzonych danych dedykowanymi tylko dla schematów układów cyfrowych zapewnia bardzo zadowalajace ˛ wyniki dla przykładowych obrazów wejściowych, z myśla˛ o których algorytm został zaprojektowany. Dla przykładowych urzadze ˛ ń testowych pracujacych ˛ pod kontrola˛ systemu Android (Samsung Galaxy S Plus oraz HTC Wildfire), wyniki wektoryzacji prostych schematów uzyskiwano w średnim czasie kilku sekund w zależności od rozmiarów plików wejściowych, a co ważniejsze stopnia skomplikowania rysunku. Stanowi to bardzo dobry rezultat i punkt wyjściowy do ewentualnej dalszej optymalizacji. Jednakże, dla zaplanowanej w trakcie rozwoju aplikacji funkcjonalności wektoryzacji zdje˛ ć zrobionych przy pomocy wbudowanej kamery program nie daje zadowalajacych ˛ wyników. Głównym powodem jest sam algorytm nastawiony na dokładne i precyzyjnie wykonane obrazy schematów wejściowych. Trzeba przyznać, że wi˛ekszość algorytmów działa na zasadzie detekcji obszarów podobnych np. kolorem i grupowaniu ich w wie˛ ksze agregaty. Nastepnie ˛ ma miejsce zapisywanie tych obszarów w postaci wektorowej jako wielokatów. ˛ Ze wzgledu ˛ na algorytmy wykorzystane w mojej aplikacji, obraz wejściowy powinien być dość dokładny. Transformacja, ˛ która nie wpływa na wynik końcowy, gdyż jest wpływ kompensowany jest odpowiednimi algorytmami, jest obrót obrazu. Inne zniekształcenia, jak te wynikajace ˛ z transformacji oraz znaczne zakłócenia obrazu powoduja, ˛ że proces wektoryzacji trwa znacznie dłużej, a otrzymane efekty sa˛ bardzo niskiej jakości. 53 10.2. Porównanie wyników Jedyne funkcje, które daja˛ poprawne efekty to funkcja automatycznego obrotu obrazu, wykrywania odcinków i wierzchołków. Dalsza analiza logiczna wykrytych elementów obrazu zachodzi nieprawidłowo, co można zaobserwować na wynikach przetwarzania zdje˛ ć przedstawionych na rysunku 10.1(f). Zmiany konieczne do otrzymania poprawnych wyników prawdopodobnie wiazałyby ˛ sie˛ z koniecznościa˛ całkowitego przeprojektowania aplikacji i napisania jej od podstaw na nowo. 10.2. Porównanie wyników Dla porównania i potwierdzenia założenia, że narzedzia ˛ dedykowane do rozwia˛ zywania konkretnych problemów lepiej sprawdzaja˛ sie˛ od rozwiaza ˛ ń ogólnych skorzystałem z darmowego programu Inkscape w wersji 0.48.2, płatnego programu CorelDraw w wersji X5 oraz dwóch aplikacji działajacych ˛ online - Vector Magic oraz AutoTrace, a także dokonałem wektoryzacji przygotowana˛ przeze mnie aplikacja. ˛ Do porównania wyników wykorzystałem przygotowane pieć ˛ różnych plików przedstawiajacych ˛ schematy cyfrowych układów logicznych o różnym stopniu skomplikowania i różnej liczbie elementów. Wszystkie programy dobrze poradziły sobie z odwzorowaniem tego, co na obrazie si˛e znajdowało, jedynie AutoTrace zniekształcił nieco obraz. Porównanie fragmentów schematu przedstawiono na rysunku 10.2, a w powiekszeniu ˛ można je zobaczyć na rysunku 10.3. Warto zauważyć, że kształt fontu uzyskany w przypadku mojej aplikacji jest inny niż w obrazie wejściowym, ale najdokładniejszy. Wynika to z tego, że jest on w toku analizy rozpoznawany jako dany znak i w takiej formie umieszczany w pliku wyjściowym. Pozostałe algorytmy nie dokonuja˛ takiej analizy i traktuja˛ litery jak każdy inny kształt. Najwie˛ ksza˛ przewage˛ pokazuje moja aplikacja w przypadku brania pod uwage˛ rozmiaru plików wyjściowych. Jako, że jest to narzedzie ˛ dedykowane tworzy ono prawie zawsze najmniejsze pliki wynikowe, niezależnie od liczby elementów i stopnia skomplikowania. Wyniki zestawione w tablicy 10.1 oraz przedstawione graficznie na rysunku 10.5, pokazuja˛ zależność miedzy ˛ programem wektoryzujacym ˛ a rozmiarem pliku SVG. Pliki jakimi posłużyłem sie˛ do testowania widoczne sa˛ na rysunku 10.4. Warto wspomnieć, że AutoTrace generuje pliki SVGZ czyli pliki skompresowane algorytmem gzip. Zapewnia to średnio uzyskanie plików 50% mniejszych od oryginału. Do właściwego porównania pliki zostały rozpakowane i ten rozmiar został podany w tablicy. Warto wspomnieć, że wszystkie programy 54 10.2. Porównanie wyników (a) Zdj˛ecie nr 1. z monitora (b) Wynik przetwarzania zdj˛ecia nr 1. (c) Zdj˛ecie nr 2. z monitora (d) Wynik przetwarzania zdj˛ecia nr 2. (e) Zdj˛ecie nr 3. z wydruku (f) Wynik przetwarzania zdj˛ecia nr 3. (g) Zdj˛ecie nr 4. z rysunku (h) Wynik przetwarzania zdj˛ecia nr 4. Rysunek 10.1. Porównanie wyników wektoryzacji zdjeć ˛ wejściowych z wbudowanej kamery telefonu 55 10.2. Porównanie wyników =1 =1 ≥1 ≥1 & & 1 & & =1 (a) Obraz wejściowy (PNG) (b) Omawiana aplikacja (SVG) (c) CorelDraw (SVG) (d) Inkscape (SVG) (e) Vector Magic (SVG) (f) Auto Trace (SVG) Rysunek 10.2. Porównanie wyników aplikacji wektoryzujacych ˛ z obrazem wzorcowym 56 10.2. Porównanie wyników (a) Obraz wejściowy (PNG) (b) Omawiana aplikacja (SVG) (c) CorelDraw (SVG) (d) Inkscape (SVG) (e) Vector Magic (SVG) (f) Auto Trace (SVG) Rysunek 10.3. Porównanie wyników aplikacji wektoryzujacych ˛ z obrazem wzorcowym (w powiekszeniu) ˛ 57 10.3. Perspektywy rozwoju aplikacji testowane były z domyślnymi ustawieniami (CorelDraw z opcja˛ „szybkie trasowanie”). Można zauważyć, że Vector Magic i AutoTrace zawsze generowały pliki wynikowe wie˛ ksze niż oryginalny obraz. AutoTrace ten rozmiar potrafił zwiekszyć ˛ nawet 8 razy. Z drugiej zaś strony Inkscape i przygotowana przeze mnie aplikacja zazwyczaj generowały pliki mniejsze od oryginalnych. Ze wzgledu ˛ na dostosowanie algorytmów do charakteru obrazów aplikacja dla systemu Android generowała pliki nawet 4 razy mniejsze. Tablica 10.1. Porównanie rozmiarów plików. 1 2 3 4 5 PNG Plik rastrowy 4538 B 10205 B 12115 B 16333 B 35956 B Android 6795 B 4134 B 5015 B 7098 B 8841 B CorelDRAW 1897 B 4405 B 5158 B 7331 B 9152 B SVG Inkscape 3410 B 9032 B 10112 B 14563 B 18508 B Vector Magic 2682 B 12064 B 14125 B 19806 B 27199 B AutoTrace 21680 B 77819 B 86848 B 133430 B 177176 B 10.3. Perspektywy rozwoju aplikacji Dalsze rozwijanie aplikacji powinno poda˛żać w kierunku otrzymywania coraz lepszych wyników w procesie wektoryzacji niezależnie od charakteru danych wejściowych. Rozsadnym ˛ byłoby zaimplementowanie funkcjonalności rozpoznawania opisów schematów, zarówno pomocniczych jak i etykietowania sygnałów. Od- dzielna ich wektoryzacja zapewniałaby wysoka˛ jakość otrzymywanych wyników. Dodatkowa˛ funkcjonalnościa˛ mogłoby być przechwytywanie obrazu schematów z wbudowanej kamery np. z rysunków wydrukowanych na papierze lub narysowanych odre˛ cznie. Konieczne byłoby usuwanie różnego typu zakłóceń i niepotrzebnych cze˛ ści zdje˛ cia a także uodpornienie algorytmu przetwarzania na zniekształcenia i wykrywanie transformacji, od prostych euklidesowych poprzez podobieństwa, przekształcenia afiniczne, aż po zniekształcenia wynikajace ˛ z budowy kamery i jej odległości od obiektu - przekształcenia projekcyjne. Przy coraz powszechniejszym dostepie ˛ do urzadze ˛ ń mobilnych i drastycznie spadajacych ˛ cenach transmisji danych w sieciach komórkowych, zauważa sie˛ także tendencje˛ do stosowania rozwiaza ˛ ń aplikacji działajacych ˛ po stronie serwera. Powodem jest, krótszy czas zwrócenia wyniku w przypadku przesłania danych, przetworzenia i odesłania z powrotem w porównaniu do przetwarzania ich na ciagle ˛ stosunkowo słabych obliczeniowo urzadzeniach ˛ mobilnych. Takie rozwiazanie ˛ sprowadza aplikacje˛ mobilna˛ do roli aparatu fotograficznego i tzw. cienkiego klienta, a cały proces wektoryzacji odbywałby sie˛ na wysokowydajnych serwerach zdalnych. 58 10.3. Perspektywy rozwoju aplikacji (a) Obraz nr 1. (b) Obraz nr 2. (c) Obraz nr 3. (d) Obraz nr 4. (e) Obraz nr 5. Rysunek 10.4. Schematy wykorzystane do porównań rozmiaru plików 10.3. Perspektywy rozwoju aplikacji 59 Rysunek 10.5. Graficzne porównanie rozmiarów plików. Dodatkowo nowe wersje systemu Android w wersji 3 i wyższych wspieraja, ˛ poprzez wbudowana˛ przegladark ˛ e, ˛ wyświetlanie plików zapisanych w formacie SVG. Przewidujac ˛ migracje˛ wie˛ kszej liczby użytkowników na wersje nowsze niż 2.* warto byłoby rozważyć wykorzystanie tego wsparcia w projekcie. Innym rozwiazaniem ˛ byłoby wykorzystanie nowo powstajacej ˛ biblioteki svg-android zapewniajacej ˛ pewne wsparcie wyświetlania obrazów wektorowych. A. Jezyk ˛ skryptowy 1 2 3 load( path) //bezwzgledna sciezka obrazu 4 5 6 7 8 9 hough_c( dp, //odwrocony wspolczynnik proporcjonalnosci akumulatora (I) minDist, //minimalna odleglosc pomiedzy srodkami okregow (D) gaussSize, //rozmiar maski filtra Gaussa (D) gaussSigma) //wspolczynnik sigma filtra Gaussa (D) 10 11 12 13 14 15 16 17 18 hough_l( rho, //rozdzielczosc akumulatora w pikselach (I) theta, //rozdzielczosc akumulatora w radianach (D) threshold, //wartosc progowa akumulatora (I) minLineLength, //minimalna dlugosc odcinka (I) maxLineGap, //maksymalna dlugosc przerwy (I) cannyT1, //mniejsza wartosc progowa detektora Cannyego (I) cannyT2) //wieksza wartosc progowa detektora Cannyego (I) 19 20 21 22 23 24 25 26 harris( maxCorners, //maksymalna liczba zwracanych wierzcholkow (I) qualityLevel, //minimalna "jakosc" wierzcholka (D) minDistance, //minimalna odleglosc miedzy zwracanymi wierzcholkami (I) blockSize, //rozmiar sasiedztwa (I) useHarris, //korzysta z~detektora Harrisa dla "true", dla "false" z~cornerMinEigenVal() (D) k) //wolny parametr detektora Harrisa (D) 27 28 29 save( path) //bezwzgledna sciezka rezultatu 30 31 32 33 34 35 36 do {...} //funkcje w petli while( var //zmienna lub wartosc op //relacja: <, >, <=, >=, ==, != n) //zmienna lub wartosc 37 38 39 40 var //nazwa zmiennej = n //przypisywana wartosc lub wyrazenie 41 42 43 44 var //nazwa zmiennej (jedna litera) op //operator +=, −=, /=, ∗= n //zmiana wartosci zmiennej lub wyrazenie 45 46 progress //znacznik postepu Wydruk A.1. Opis struktur poszczególnych funkcji A. Jezyk ˛ skryptowy 1 2 3 4 5 6 7 8 9 10 11 eval : (load |save |houghc |houghl |harris |doWhileLoop |ass |mod |PROGRESS )+ ; 12 13 14 15 16 17 18 19 20 load : LOAD ROUND_LEFT_BRACKET QUOTATION_MARK path EXTENSION_IN QUOTATION_MARK ROUND_RIGHT_BRACKET ; 21 22 23 24 25 26 27 28 29 save : SAVE ROUND_LEFT_BRACKET QUOTATION_MARK path EXTENSION_OUT QUOTATION_MARK ROUND_RIGHT_BRACKET ; 30 31 32 33 34 35 36 37 38 path : (pathPart)+ ( ’+’ VAR ’+’ )? ’.’ ; 39 40 41 pathPart : ’/’ ( VAR | INT )+ ; 42 43 44 45 46 47 48 49 50 51 52 53 houghc : HOUGHC ROUND_LEFT_BRACKET additionExp COMA additionExp COMA additionExp COMA additionExp ROUND_RIGHT_BRACKET ; 54 55 56 57 58 59 houghl : HOUGHL ROUND_LEFT_BRACKET additionExp COMA 61 A. Jezyk ˛ skryptowy 60 61 62 63 64 65 66 67 68 69 70 71 additionExp COMA additionExp COMA additionExp COMA additionExp COMA additionExp COMA additionExp ROUND_RIGHT_BRACKET ; 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 harris : HARRIS ROUND_LEFT_BRACKET additionExp COMA additionExp COMA additionExp COMA additionExp COMA logic_val COMA additionExp ROUND_RIGHT_BRACKET ; 88 89 90 91 92 93 94 95 96 97 98 99 100 doWhileLoop : DO CURLY_LEFT_BRACKET eval CURLY_RIGHT_BRACKET WHILE ROUND_LEFT_BRACKET additionExp REL additionExp ROUND_RIGHT_BRACKET ; 101 102 103 104 105 ass : VAR EQUALS_SIGN additionExp ; 106 107 108 109 110 mod : VAR OPERATOR additionExp ; 111 112 113 114 115 additionExp : multiplyExp (’−’ multiplyExp |’+’ multiplyExp)∗ ; 116 117 118 119 multiplyExp : atomExp (’∗’ atomExp | ’/’ atomExp )∗ ; 62 A. Jezyk ˛ skryptowy 120 121 122 123 124 atomExp : (MINUS)? (NUM | VAR |’(’ additionExp ’)’ ); 125 126 127 logic_val : (’TRUE’ | ’true’) | (’FALSE’ | ’false’); 128 129 MINUS : ’−’; 130 131 QUOTATION_MARK : ’"’; 132 133 ROUND_LEFT_BRACKET : ’(’; 134 135 ROUND_RIGHT_BRACKET : ’)’; 136 137 CURLY_LEFT_BRACKET : ’{’; 138 139 CURLY_RIGHT_BRACKET : ’}’; 140 141 COMA : ’,’; 142 143 EQUALS_SIGN : ’=’; 144 145 146 EXTENSION_IN : ’jpg’ | ’jpeg’ | ’bmp’ | ’gif’ | ’png’ |’JPG’ | ’JPEG’ | ’BMP’ | ’GIF’ | ’PNG’; 147 148 EXTENSION_OUT : ’svg’ | ’SVG’; 149 150 LOAD : ’load’; 151 152 SAVE : ’save’; 153 154 ASS : ’ass’; 155 156 MOD : ’mod’; 157 158 HOUGHC : ’houghC’; 159 160 HOUGHL : ’houghL’; 161 162 HARRIS : ’harris’; 163 164 DO : ’do’; 165 166 WHILE : ’while’; 167 168 PROGRESS: ’progress’; 169 170 VAR : (’a’..’z’|’A’..’Z’) (’a’..’z’|’A’..’Z’|’0’..’9’|’_’)∗; 171 172 REL : ’<’ | ’>’ | ’<=’ | ’>=’ | ’==’ | ’!=’ ; 173 174 VARDEP : OPERATOR VAR; 175 176 OPERATOR : ’−=’|’+=’|’∗=’|’/=’ ; 177 178 179 NUM : INT|DBL; 63 A. Jezyk ˛ skryptowy 180 INT : (’0’..’9’)+; 181 182 183 184 DBL : ((’0’..’9’)+ ’.’ (’0’..’9’)∗ EXPONENT? |’.’ (’0’..’9’)+ EXPONENT? |(’0’..’9’)+ EXPONENT); 185 186 EXPONENT: (’e’|’E’) (’+’|’−’)? (’0’..’9’)+ ; 187 188 189 190 COMMENT : ’//’ ~(’\n’|’\r’)∗ ’\r’? ’\n’ |’/∗’ ( options {greedy=false;} : . )∗ ’∗/’ ; 191 192 193 194 195 196 WS : ( ’ ’ | ’\t’ | ’\r’ | ’\n’ ); Wydruk A.2. Gramatyka jezyka ˛ w notacji EBNF 64 Bibliografia [1] Android Dashboards. Dostepne ˛ w Internecie: http://developer.android.com/ about/dashboards, data dostepu: ˛ 08.08.2012. [2] Android Developers. Dostepne ˛ w Internecie: http://developer.android.com, data dostepu: ˛ 08.08.2012. [3] AutoTrace. Dostepne ˛ w Internecie: http://autotrace.sourceforge.net, data dostepu: ˛ 08.08.2012. [4] Dokumentacja OpenCV. Dostepne ˛ w Internecie: http://docs.opencv.org/, data dostepu: ˛ 08.08.2012. [5] Google play. Dostepne ˛ w Internecie: http://play.google.com, data dostepu: ˛ 08.08.2012. [6] IEEE Xplore. Dostepne ˛ w Internecie: http://ieeexplore.ieee.org, data dostepu: ˛ 08.08.2012. [7] Vector Magic. Dostepne ˛ w Internecie: http://vectormagic.com, data dostepu: ˛ 08.08.2012. [8] IEEE Standard Graphic Symbols for Logic Functions. 1984. [9] Bera A. Fast vectorization and upscaling images with natural objects using canny edge detection. International Conference on Electronics Computer Technology (ICECT) 2011 Proceedings., 2011. [10] Kaehler A. Bradski G. Learning OpenCV. O’Reilly, 2008. [11] Bołdak C. Cyfrowe przetwarzanie obrazów. Dostepne ˛ w Internecie: http://aragorn. pb.bialystok.pl/~boldak/DIP/Wyklady.html, data dostepu: ˛ 08.08.2012. [12] Zieliński C. Podstawy projektowania układów cyfrowych. Wydawnictow Naukowe PWN, 2003. [13] Tombre K. Hiliaire X. Robust and accurate vectorization of line drawings. IEEE Trans. Pattern Anal. Mach. Intell, 2006. [14] Kalisz J. Podstawy elektorniki cyfrowej. Wydawnictwa Komunikacji i Łaczności, ˛ 1993. [15] Dani L. Johannes K. Depixelizing pixel art. ACM Trans. Graph., 2011. [16] Hong Yan Ju Jia Zou. Cartoon image vectorization based on shape subdivision. Computer Graphics International 2001 Proceedings, 2001. [17] Jo K-H. Kirsanov A., Vavilin A. Contour-based algorithm for vectorization of satellite images. IFOST 2010 Proceedings, 2010. [18] Prasad L. Raster to Vector Conversion of Images for Efficeint SVG Reprezentation. Dostepne ˛ w Internecie: http://www.svgopen.org/2005/papers/Prasad_Abstract_ R2V4SVG, data dostepu: ˛ 08.08.2012, 2005. [19] Hamouda A. Naouai M., Narjess M. Line extraction algorithm based on image vectorization. International Conference on Mechatronics and Automation (ICMA) 2010 Proceedings, 2010. [20] Grooch B. Olsen S. Image Simplification and Vectorization. NPAR ’11 Proceedings of the ACM SIGGRAPH/Eurographics Symposium on Non-Photorealistic Animation and Rendering, 2011. [21] Korohoda P. Tadeusiewicz R. Komputerowa analiza i przetwarzanie obrazów. Wydawnictwo Fundacji Postepu ˛ Telekomunikacji, 1997. [22] Yu Y. Xia T., Liao B. Patch-based image vectorization with automatic curvilinear feature alignment. ACM Trans. Graph., 2009.