Uniwersytet Mikołaja Kopernika. Wydział Matematyki i Informatyki. Jarosław Piersa piersaj(at)mat.uni.torun.pl



Podobne dokumenty
Analiza obrazów - sprawozdanie nr 2

Metody Metody, parametry, zwracanie wartości

Implementacja filtru Canny ego

Programowanie obiektowe

Diagnostyka obrazowa

Cyfrowe Przetwarzanie Obrazów i Sygnałów

Programowanie obiektowe

Przetwarzanie obrazów rastrowych macierzą konwolucji

BIBLIOTEKA PROGRAMU R - BIOPS. Narzędzia Informatyczne w Badaniach Naukowych Katarzyna Bernat

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Parametryzacja obrazu na potrzeby algorytmów decyzyjnych

Politechnika Świętokrzyska. Laboratorium. Cyfrowe przetwarzanie sygnałów. Ćwiczenie 8. Filtracja uśredniająca i statystyczna.

Języki i metody programowania Java. Wykład 2 (część 2)

Klasy i obiekty cz II

Wyższa Szkoła Informatyki Stosowanej i Zarządzania

Raport. Bartosz Paprzycki UMK 2009/2010

Spośród licznych filtrów nieliniowych najlepszymi właściwościami odznacza się filtr medianowy prosty i skuteczny.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Diagnostyka obrazowa

Laboratorium Cyfrowego Przetwarzania Obrazów

Wyższa Szkoła Informatyki Stosowanej i Zarządzania

Układy VLSI Bramki 1.0

Przetwarzanie obrazów wykład 6. Adam Wojciechowski

Wykład 4: Klasy i Metody

Projekt 2: Filtracja w domenie przestrzeni

Zastosowanie Informatyki w Medycynie

Programowanie w Javie

Detekcja twarzy w obrazie

akademia androida Składowanie danych część VI

Java Platform Micro Edition

Język ludzki kod maszynowy

Systemy multimedialne 2015

GIMP Grafika rastrowa (Ćwiczenia cz. 2)

Dokumentacja do API Javy.

Zaawansowane aplikacje WWW - laboratorium

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

PROBLEMY TECHNICZNE. Co zrobić, gdy natrafię na problemy związane z użytkowaniem programu DYSONANS

Zygmunt Wróbel i Robert Koprowski. Praktyka przetwarzania obrazów w programie Matlab

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Diagnostyka obrazowa

Wyższa Szkoła Informatyki Stosowanej i Zarządzania

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Ćwiczenie 1. Przygotowanie środowiska JAVA

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Laboratorium Cyfrowego Przetwarzania Obrazów

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

1 Moduł Modbus ASCII/RTU 3

Opis Edytora postaci Logomocji

Aplikacje w środowisku Java

Wykład 7: Pakiety i Interfejsy

Ćwiczenie 12 Różdżka, szybkie zaznaczanie i zakres koloru

EDYCJA TEKSTU MS WORDPAD

Programowanie Obiektowe GUI

Język C zajęcia nr 11. Funkcje

Diagnostyka obrazowa

WPROWADZENIE DO JĘZYKA JAVA

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

EGZAMIN MATURALNY Z INFORMATYKI MAJ 2013 POZIOM PODSTAWOWY CZĘŚĆ I WYBRANE: Czas pracy: 75 minut. Liczba punktów do uzyskania: 20 WPISUJE ZDAJĄCY

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Księgarnia internetowa Lubię to!» Nasza społeczność

WYDZIAŁ FIZYKI I INFORMATYKI STOSOWANEJ

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

JAVA?? to proste!! Autor: wojtekb111111

Cyfrowe Przetwarzanie Obrazów i Sygnałów

Animacje cz. 2. Rysujemy koło zębate

Filtracja obrazów. w dziedzinie częstotliwości. w dziedzinie przestrzennej

3. OPERACJE BEZKONTEKSTOWE

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Przetwarzanie obrazów wykład 4

Podstawy Przetwarzania Sygnałów

P R Z E T W A R Z A N I E S Y G N A Ł Ó W B I O M E T R Y C Z N Y C H

Programowanie obiektowe zastosowanie języka Java SE

CEL zapoznanie z programem do tworzenia rysunków i ukazanie możliwości Edytora obrazów do sporządzania rysunków i ikon.

Proste metody przetwarzania obrazu

Python: JPEG. Zadanie. 1. Wczytanie obrazka

Podstawy i języki programowania

Podstawy i języki programowania

Zofia Kruczkiewicz, Programowanie obiektowe - java, wykład 2 1

Diagnostyka obrazowa

VinCent Administrator

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Adobe Photoshop lab. 3 Jacek Wiślicki, 1. Napisy (c.d.) Ogień Miód Metal Aqua...

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Java jako język programowania

TECHNIKI MULTIMEDIALNE LABORATORIUM GIMP: Projektowanie tła

1 Moduł Modbus ASCII/RTU

Jak dodać własny szablon ramki w programie dibudka i dilustro

Grafika Komputerowa Wykład 2. Przetwarzanie obrazów. mgr inż. Michał Chwesiuk 1/38

Ćwiczenie 6. Transformacje skali szarości obrazów

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Plan wykładu. Wprowadzenie Program graficzny GIMP Edycja i retusz zdjęć Podsumowanie. informatyka +

Wstęp do programowania

Podstawy obiektowości

Ćwiczenia z grafiki komputerowej 5 FILTRY. Miłosz Michalski. Institute of Physics Nicolaus Copernicus University. Październik 2015

Transkrypt:

Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl Numer albumu 183651 Informatyka, rok V Wstęp do przetwarzania sygnałów i obrazów Dokumentacja projektu Toruń 2008r Abstrakt Praca poniższa jest dokumentacją do projektu wykonanego w ramach laboratorium Wstępu do przetwarzania Sygnałów i Obrazów, prowadzonego przez dr. Marię Berndt-Schreiber na WMiI UMK w roku akademickim 2007/2008 w semestrze letnim. Projekt umożliwia wykonywanie podstawowych operacji na obrazach w odcieniach szarości: filtracje przestrzenne, malowanie technikami półtonów, transformata Fouriera, dodawanie szumu, poddawanie obrazu operacjom w pakiecie Matlab. Program został zaimplementowany w Javie IcedTea 1.7.0 w środowisku programistycznym Eclipse 3.3.

Spis treści 1 Opis techniczny 2 1.1 Specyfikacja techniczna....................... 2 1.2 Otwieranie i zapisywanie plików................... 2 1.3 Technika półtonów.......................... 3 1.4 Filtry przestrzenne.......................... 3 1.5 Transformata Fouriera........................ 4 1.6 Szum.................................. 4 1.6.1 Szum Gaussowski....................... 4 1.6.2 Szum impulsowy....................... 4 1.7 Niestandardowe funkcje pakietu Matlab.............. 5 1.7.1 Wybór ścieżki do Matlaba.................. 5 1.7.2 Duplikowanie Pikseli..................... 5 1.7.3 Modyfikowanie skali szarości................ 5 1.7.4 Transformacje intensywności pikseli............ 5 2 Prezentacja wyników 6 2.1 Technika Półtonów.......................... 6 2.2 Filtry Przestrzenne.......................... 6 2.3 Transformata Fouriera........................ 8 2.4 Szum.................................. 8 2.5 Niestandardowe Funkcje Matlaba.................. 8 3 Listingi kodu źródłowego 13 3.1 Przechowywanie obrazu....................... 13 3.2 Filtr obrazów............................. 14 3.3 Malowanie półtonami........................ 14 3.4 Transformata Fouriera........................ 16 3.5 Szum.................................. 17 3.6 Matlab................................. 18 Bibliografia 20 1

Rozdział 1 Opis techniczny 1.1 Specyfikacja techniczna Program napisany został z użyciem standardowych bibliotek Javy. Informacje o obrazie przechowywane są w kasie java.awt.image.bufferedimage, ograniczonej do obrazów w odcieniach szarości. Interfejs graficzny został napisany z użyciem bibliotek Swing. Wymagania programu: Środowisko Java Runtime Environment w wersji 1.6, Procesor Pentium 2800 MHz, Pamięć operacyjna 1.25 GB, Wolna przestrzeń dyskowa ok. 10 MB (nie licząc plików graficznych), Pakiet Matlab (opcjonalnie; specyfikacja nie uwzględnia wymagań Matlaba). Standardowe biblioteki wejścia i wyjścia Javy zapewniają pełne wsparcie dla formatu graficznego GIF. Kompatybilność z innymi formatami, w szczególności JPEG i BMP, może być zależna od rodzaju środowiska Javy lub / i systemu operacyjnego. 1.2 Otwieranie i zapisywanie plików Otwieranie pliku graficznego do edycji możliwe jest poprzez wybranie polecenia Otwórz w menu Plik. Akceptowane są obrazy w formatach graficznych GIF, JPEG oraz PNG. Wszystkie operacje graficzne wykonywane są na zaznaczonym obrazie. Wybrany plik charakteryzuje się błękitnym kolorem okna. Gdy żaden obraz nie jest zaznaczony wykonanie operacji nie jest możliwe. Zapisywanie aktualnie wybranego obrazu możliwe jest poprzez polecenie Zapisz. Należy dodatkowo podać nazwę pliku i rozszerzenie, jeżeli domyślna nie jest satysfakcjonująca. 2

UWAGA Obsługiwane formaty zapisu mogą zależeć od zainstalowanej wersji Javy. Wskazane jest korzystanie z formatu GIF. 1.3 Technika półtonów Ten moduł programu pozwala na przybliżanie obrazu w odcieniach szarości obrazem binarnym. Działa w sposób blokowy. Każdemu blokowi o rozmiarze 3 3 w oryginalnym obrazie przyporządkowuje blok o tym samym rozmiarze w obrazie wynikowym. Nowy blok zawiera może zawierać jedynie dwie wartości 0 czyli czarny lub 255 biały. Pośrednie odcienie szarości przybliżane są poprzez odpowiednie proporcje białych i czarnych pikseli w bloku. Przybliżenie to bazuje na średniej arytmetycznej pikseli w oryginalnym obrazie. Półtony mogą być generowane w dwojaki sposób. Pierwszym jest predefiniowane ułożenie pikseli białych i czarnych w masce, zależnie od ich proporcji. W drugim pozycje pikseli są generowane losowo natomiast sumaryczne ich ilość pozostaje niezmieniona. 1.4 Filtry przestrzenne Ten moduł pozwala na poddawanie obrazów procesowi filtracji. Od strony matemetycznej proces wygląda następująco: Dany niech będzie obraz wejściowy o wymiarach m n, oznaczmy wartość piksela (x, y) na tym obrazie przez px, y, Dana nich będzie maska filtru o wymiarach nieparzystych k l, oznaczmy poprzez q(x, y) wartość maski na pozycji (x, y), x (0..k) oraz y (0..l). Niech wyjściowy obraz będzie oznaczony jako r. Jego wymiary wynoszą m n. Wartość pikseli liczona jest następująco r(x, y) = k 1 2 i= k 1 2 l 1 2 j= l 1 2 p(x + i, y + j) m(i + k 1, j + l 1 2 2 ) Program udostępnia kilka filtrów predefiniowanych, oraz możliwość edycji własnego filtru. Na filtry własne zostały nałożone następujące ograniczenia: Wymiary maski muszą być liczbami nieparzystymi większymi od 1 oraz mniejszymi niż 25. Wartości wpisywane w pola maski muszą być całkowite. W razie konieczności należy dodatkowo ustawić wspólny dzielnik dla maski. Finalna wartość będzie ilorazem wpisanej wartości w masce i dzielnika. Dzielnik nie może być zerem. 3

1.5 Transformata Fouriera Ten moduł pozwala na obliczenie transformaty Fouriera dla obrazy. Zaimplementowano algorytm szybkiej transformaty Fouriera (FFT), co za tym idzie wymagane są wymiary obrazu będące potęgami liczby 2. Program automatycznie poszerza obraz do odpowiednich rozmiarów. W oknie dialogowym FFT należy wybrać następujące parametry: Typ obrazu wynikowego, dostępne są opcje: Amplituda Re(z) 2 + Im(z) 2, Faza obrazu atan( Im(z) Re(z) ), Czy obraz ma być przesunięty do środka transformaty, Czy dokonać transformacji logarytmicznej po obliczeniach, Skalar do transformacji logarytmicznej. 1.6 Szum Te opcje pozwalają na zaszumianie obrazu szumem Gaussowskim, lub szumem impulsowym. 1.6.1 Szum Gaussowski Szum Gaussowski polega na dodaniu do każdego piksela liczby losowanej niezależnie z rozkładu normalnego N(µ, σ 2 ). W oknie dialogowym należy podać parametry: µ wartość oczekiwana rozkładu, jest liczbą rzeczywistą, σ 2 wariancja rozkładu, σ 2 R >0. 1.6.2 Szum impulsowy Szum impulsowy, lub tzw. szum sól i pieprz, obliczany jest w sposób niezależny dla każdego piksela według poniższych wzorów val 1 z prawdopodobieństwem p 1 P n = val 2 z prawdopodobieństwem p 2 P s z prawdopodobieństwem 1 p 1 p2 W oknie dialogowym należy podać wartości parametrów: p 1 prawdopodobieństwo zaszumienia wartością val 1, p 1 0, p 2 prawdopodobieństwo zaszumienia wartością val 2, p 1 0, p 1 + p 2 1, val 1 wartość piksela, wstawiana z prawdopodobieństwem p 1, 0 val 1 255 val 2 wartość piksela, wstawiana z prawdopodobieństwem p 2, 0 val 2 255 4

1.7 Niestandardowe funkcje pakietu Matlab Program dodatkowo pozwala na wywoływanie niektórych funkcjipakietu Matlab. Pakiet Matlab musi być zainstalowany oddzielnie. Wsparcie dotyczy wyłącznie Matlaba w środowisku Windows. 1.7.1 Wybór ścieżki do Matlaba Opcja ta pozwala ręczne sprecyzownie ścieżki do pliku wykonywalnego lub skryptu startuwego Matlaba. Może się okazać niezbędna w sytuacji gdy Matlab nie jest dostępny w domyślnym katalogu, bądź występuje pod inną niż domyślna nazwą. W oknie dialogowym należy wybrać plik wykonywalny: matlab.bat w systemie windows lub matlab na Linuxie. 1.7.2 Duplikowanie Pikseli Ten skrypt pozwala na zwiększanie rozmiaru obrazu poprzez duplikowanie pikseli. Wymaga sprecyzowania dwóch parametrów m, n N. Odpowiadają one za skalowanie obrazu w poziomie i w pionie odpowiednio. 1.7.3 Modyfikowanie skali szarości Opcje te zmieniają zakrez skali szarości danego oprazu. Dostępne są opcje: full8 zakres ośmiobitowy dający 256 kolorów, full16 zakres 16-bitowy daje 65536 kolorów, minmax zakres dobrany przez użytkownika, powoduje przeskalowanie wartości pikseli na przedział [min, max], min, man [0..1], min max. 1.7.4 Transformacje intensywności pikseli Operacje te modyfikuję poziom intensywności pikseli obrazu. następujące tryby: Dostępne są neg negatyw obrazu, nie wymaga ddakowych parametrów. log transformacja logrytmiczna obrazu, wymaga parametru skalującego wynik, gamma transformacja gamma (lub korekcja gamma), wymaga jednego parametru odpowiedzialnego za wynikowy kontrast, stretch transformacja kontrastująca, wymaga dwóch parametrów. 5

Rozdział 2 Prezentacja wyników 2.1 Technika Półtonów Poniżej zaprezentowane są wyniki działania techniki półtonów dla różnych obrazów. Jak widać na załączonych ilustracjach choć ilość poziomów kwantyzacji została zredukowana do dwóch obraz nadal jest czytelny. Technika półtonów predefiniowanych wydaje się dawać obraz płytszy i w mniejszej ilości odcieni, ale też znacznie bardziej regularny. Gdy półtony były generowane losowo, obraz zyskiwał delikatniejszy światłocień. Jednocześnie sprawia wrażenie silnie zaszumionego nieregularnym rozkładem pikseli. Aby uzyskać optymalne wrażenie należy oddalić się na pewną odległość. Może to nie być widoczne na zamieszczonych obrazach, ale obraz otrzymany pierwszą z metod jest znacznie bardziej podatny na efekt Moire przy skalowaniu. 2.2 Filtry Przestrzenne Poniżej zostaną przedstawione efekty działania niektórych filtrów na wybranych obrazach. Filtr Gaussowski ma właściwości rozmywające. Zaprezentowane są od lewej: obraz oryginalny, po przefiltrowaniu jednokrotnym, po przefiltrowaniu trzykrotnym. Można zaobserwować postępujące rozmycie obrazu. Widać że wyraźnie zostały wzmocnione krawędzie: pionowe dla filtru Sobela Y i poziome dla filtru X. Co jednak ciekawe filtr omija krawędzie gdy ciemniejszy obszar znajduje się powyżej (w przypadku filtru X) lub na lewo (filtr Y) od krawędzi. W edytorze filtrów dodatkowo zdefiniowano filtr Laplace a, a następnie poddano obraz filtracji. Jak widać wychwycone zostały wszystkie krawędzie, zarówno poziome jak i pionowe. Z drugiej jednak strony są one znacznie cieńsze, 6

(a) Obraz zawierający kolejne wartości szarości, ten sam obraz malowany techniką półtonów, tenże obraz malowany techniką półtonów losowych. (b) Plik poltony1.jpg. Od lewej: Obraz oryginalny, obraz malowany techniką półtonów. (c) Plik poltony1.jpg. półtonów losowych. malowany techniką Rysunek 2.1: Malowanie techniką półtonów dla obrazu prerenderowanago i pliku Lena.jpg. 7

Rysunek 2.2: Plik text.jpg. Obraz oryginalny, obraz po jednokrotnym zastosowaniu filtru Gaussa, po trzykrotnym przefiltrowaniu. przez co mniej widoczne. Przemnożenie wynikowego obrazu przez 2 znacznie poprawiło kontrast. 2.3 Transformata Fouriera Poniżej zostały zaprezentowane wyniki działania FFT dla obrazu testpat1.jpg. Wymiary pliku wynoszą 256 256. Zamieszczone są zarówno amplituda jak i faza, w wersjach bez przesunięć do środka transformaty oraz z nimi, i dodatkowo po logarytmowaniu z różnymi skalarami (rysunek 2.4). 2.4 Szum Rysunki prezentują działanie szumów dodanych do pliku circuit.jpg. Zastosowane szumy: gaussowski(0, 200), gaussowski(0, 400), impulsowy(0.05, 0, 0.05, 255), impulsowy(0.05, 0, 0.00, 255), impulsowy(0.00, 0, 0.05, 255). Widoczna jest wyraźna strata jakości, ale widać również że typy szumów nie są do siebie podobne. 2.5 Niestandardowe Funkcje Matlaba Ponizej zostaly przedstawione wyniki działania funkcji matlabowskich dla obrazu Leny (lena.jpg). Zamieszczone zostały negatyw, transformacje logarytmiczne i gamma, moduł stretch oraz konwersja skali szarości minmax. 8

(a) Plik oryginalny. (b) Po zaaplikowaniu filtrów Sobela X i Y. (c) Po zaaplikowaniu filtru Laplace a w edytorze filtrów oraz dodatkowo po przemnożeniu wartości pikseli przez 2. Rysunek 2.3: Plik tyre.jpg poddawany różnym filtrom. 9

(a) Obraz oryginalny. (b) Obraz amplitudy. (c) Obraz amplitudy po przesunięciu do środka transformaty (d) Obraz amplitudy po przesunięciu i transformacji logarytmicznej z parametrem 11. (e) Obraz amplitudy po przesunięciu i transformacji logarytmicznej z parametrem 33. (f) Obraz amplitudy po przesunięciu i transformacji logarytmicznej z parametrem 66. (g) Obraz fazy po transformacji logarytmicznej z parameciu i logarytmowaniu z para- (h) Obraz fazy po przesuniętrem 100. metrem 100. Rysunek 2.4: FFT dla pliku testpat1.jpg 10

(a) Obraz oryginalny. (b) Obraz z szumem gaussowskim µ = 0, σ 2 = 200. (c) Obraz z szumem gaussowskim µ = 0, σ 2 = 400. (d) Obraz z szumem impulsowym p 1 = 0.05, p 2 = 0.05, val 1 = 0, val 2 = 255. (e) Obraz z szumem impulsowym p 1 = 0.05, p 2 = 0.00, val 1 = 0, val 2 = 255. Rysunek 2.5: Szum dla pliku circuit.jpg (f) Obraz z szumem impulsowym p 1 = 0.00, p 2 = 0.05, val 1 = 0, val 2 = 255. 11

(a) Obraz oryginalny. (b) Obraz po duplikacji pikseli m = n = 2. (c) Obraz po zmianie skali (d) Obraz po zmianie skali (e) Obraz w negatywie (intransbis.m) szarości min = 0, max = 0.5 szarości min = 0.25, max = (gscale.m). 0.75 (gscale.m). (f) Obraz po operacji logarytmowania ze skalarem równym γ = 0.2 (intransbis.m). m = 0.2, e = 0.5 (intrans- (g) Obraz po korekcji gamma (h) Obraz po operacji stretch 10 (intransbis.m). bis.m). Rysunek 2.6: Niestandardowe funkcje Matlaba dla obrazu Leny 12

Rozdział 3 Listingi kodu źródłowego 3.1 Przechowywanie obrazu Obrazy w programie są przechowywane w klasie GrayImage.java. Wewnętrznie dane są przechowywane w java.awt.image.bufferedimage jednakże ograniczono dostęp do niech dostęp. Możliwe jest jedynie podawanie wartości pikseli które są odcieniami szarości (tj. mają równe składowe R, G i B). public class GrayImage { protected BufferedImage bi = null; public int getpixel(int x, int y){ int width = bi.getwidth(); int height = bi.getheight(); if (x>=0 && x< width && y>=0 && y< height){ int r = getred(bi.getrgb(x, y)); int g = getred(bi.getrgb(x, y)); int b = getred(bi.getrgb(x, y)); return (r+g+b) /3; } // if return 0; } // getpixel(int, int) public void setpixel(int x, int y, int val){ int width = bi.getwidth(); int height = bi.getheight(); val = val < 0? 0 : val; val = val > 255? 255 : val; if (x>=0 && x< width && y>=0 && y< height){ bi.setrgb(x, y, val + 256*val + 256^2*val + 256^3*255); } // if } // setpixel(int, int, int) (...) } // class 13

3.2 Filtr obrazów Klasa ImageFilter.java impementuje operację filtrowania obrazu. Po ustaleniu maski filtru i podaniu obrazu wejściowego tworzony jest nowy obraz o identycznych wymiarach, do którego zapisywane są wartości pikseli po przefitrowaniu. private float [][] maska = (...); public GrayImage filtrujobraz(grayimage im){ GrayImage ret = new GrayImage(im.getWidth(), im.getheight()); ret.setnazwa( im.getnazwa()); for (int i=0; i< im.getwidth(); i++) for (int j=0; j<im.getheight(); j++){ int val = filtrujsasiedztwo(im, i, j); ret.setpixel(i, j, val); } // for j return ret; } // filtrujobraz(gi) private int filtrujsasiedztwo(grayimage im, int x, int y){ float suma = 0; int m = (maska.length -1 ) /2; int n = (maska[0].length -1 ) /2; for (int i=-m; i<=+m; i++) for (int j=-n; j<=+n; j++) suma += im.getpixel(x+i, y+j) * maska[i+m][j+n]; int ret = (int) suma; ret = ret<0? 0 : ret; ret = ret>255? 255 : ret; return ret; } //filtrujsasiadztwo(gi, int, int) 3.3 Malowanie półtonami Klasa Poltony.java impementuje malowanie obrazów technikami półtonów. Ustalono odgórnie wielkość bloku na 3 3. Dla każdego takiego bloku w źródłowym rysunku liczona jest średnia arytmetyczna poziomów szarości pikseli i przyporządkowywany jest odpowiadający blok pikseli (wyłącznie białych i czarnych) do wynikowego obrazu. public static GrayImage przetwozobraz(grayimage im){ int x = im.getwidth() + (3 - im.getwidth() %3); int y = im.getheight() + (3 - im.getheight() %3); GrayImage ret = new GrayImage(x, y); 14

for (int i=0; i< ret.getwidth(); i+=3){ for (int j=0; j<ret.getheight(); j+=3){ int srednia = obliczsredniazmaski3x3(im, i, j); int val = skalujbarwe(srednia); rysujpolton(ret, i, j, val); } // for j } // for i return ret; } // przetworzobraz private static void rysujpoltonlosowy(grayimage im, int startx, int starty, int val ){ val = val>=10? 9 : val; val = val<= 0? 0 : val; int[][] tab = generujlosowamaske(val); // tab = przypiszpredediniownamaske(val); // dla półtonów predefiniowanych for (int i=0; i<3; i++) for (int j=0; j<3; j++) im.setpixel(startx+i, starty + j, tab[i][j]); } // rysujpolton private static int[][] generujlosowamaske(int val){ int reszta = val <5? val :9 - val; int kolor = val<5? 255 : 0; int tlo = val<5? 0 : 255; int[][] maska = new int[3][3]; for (int i=0; i<3; i++) for (int j=0; j<3; j++) maska[i][j] = tlo; while (reszta>0){ int x = r.nextint(3); int y = r.nextint(3); if (maska[x][y] == tlo){ maska[x][y] = kolor; reszta --; } } // while return maska; } // generujlosowamaske() 15

3.4 Transformata Fouriera FFT na obrazach została zaimplementowana w klasie TransformataFouriera.java, jednakże, sama operacja FFT, znajduje się w Wielomian.java. Klasa TransformataFouriera.java jest interfejsem tłumaczącym zapis obrazu do postaci, na której możliwe jest wykonanie FFT i tłumaczącym wyniki z powrotem do formy graficznej. Odpowiada również za obliczenia amplirudy i fazy z wielomianu zespolinego. Właściwe obliczenia znajdują się w Wielomian.java. Jest to fragment kodu pisany na potrzeby innego projektu, jednakże po niewielkich modyfikacjach znakomicie sprawdza się również tu. Dodatkowo wykonuje operacje transformacji logarytmicznej, przed zapisaniem obrazu do bufora java.awt.bufferedimage. Klasa Wielomian operuje na liczbach zespolonych, ich implementacja znajduje się w klasie C.java. public static Wielomian FFT(int n, Wielomian f, Vector<C> omega){ Wielomian ret = null; if (n==1){ ret = new Wielomian(0); ret.setwspolczynnik(0, f.getwspolczynnik(0)); return ret; } // if // f = a(x^2) + x * b(x^2) // a[k] = f[2k] k=0..n/2 // b[k] = f[2k+1] k=0..n/2 Wielomian a = new Wielomian(n/2-1); for (int i = 0; i<n/2; i++) a.setwspolczynnik(i, f.getwspolczynnik(2*i)); Vector<C> va = new Vector<C>(); for (int i=0; i<(n/2)-1; i++) va.add( (C)omega.elementAt(2*i+1)); Wielomian b = new Wielomian(n/2-1); for (int i = 0; i<n/2; i++) b.setwspolczynnik(i, f.getwspolczynnik(2*i+1)); Wielomian alfa = FFT(n/2, a, va); Wielomian beta = FFT(n/2, b, va); Wielomian gamma = new Wielomian(n-1); // gamma[i] = alfa[i] + w^i * beta[i]; // gamma[i+n/2] = alfa[i] - w^i * beta[i]; for (int i=0; i< n/2; i++){ C c = C.plus( alfa.getwspolczynnik(i), C.mult((C)omega.elementAt(i), beta.getwspolczynnik(i))); gamma.setwspolczynnik(i, c); c = C.minus( alfa.getwspolczynnik(i), C.mult((C)omega.elementAt(i), beta.getwspolczynnik(i))); 16

gamma.setwspolczynnik( i+n/2, c); } // for i return gamma; } // FFT 3.5 Szum Za dodawanie szumu do obrazu odpowiedzialne są klasy SzumGaussowski.java oraz SzumImpulsowy.java. Wykorzystano generator liczb pseudolosowych ze standardoeych bibiotek Javy java.utils.random. Zaszumianie pikseli następuje niezależnie od siebie. Wartość pikseli po zaszumieniu jest przybliżana do najbliższej dopuszczalnej wartości dla pikseli tj liczby całkowitej z przedziału [0..255]. Implementacja Szumu Gaussowskiego. public class SzumGaussowski { private static Random r = new Random(); public static GrayImage dodajszum(grayimage im, double mu, double sigmakw){ GrayImage ret = new GrayImage(im.getWidth(), im.getheight()); double sigma = Math.sqrt(sigmaKw); for (int i=0; i<im.getwidth(); i++){ for (int j=0; j< im.getheight(); j++){ double val = im.getpixel(i, j); val += r.nextgaussian() * sigma + mu; ret.setpixel(i, j, (int)val); } // for j } // for i return ret; } // dodajszum() } // class Implementacja sziumu Impulsowego. public class SzumImpulsowy { private static Random r = new Random(); public static GrayImage dodajszum(grayimage im, double p1, int val1, double p2,int val2){ GrayImage ret = new GrayImage(im.getWidth(), im.getheight()); for (int i=0; i<im.getwidth(); i++){ for (int j=0; j< im.getheight(); j++){ double val = im.getpixel(i, j); val = losujwartoscpola((int)val, val1, p1, val2, p2); ret.setpixel(i, j, (int)val); } // for j } // for i 17

return ret; } // dodajszum private static int losujwartoscpola(int val0, int val1, double p1, int val2, double p2){ double d = r.nextdouble(); if (0 < d && d < p1){ return val1; } else if (p1<d && d < p1 +p2) { return val2; } else /* p1+p2 <= d <=1 */ { return val0; } // if.. else } // losujwartoscpolapozaszumieniu() } //class 3.6 Matlab Poddawanie oprazów operacjom Matlaba zaimplementowane zostało w klasie WpsoMainWindow.java. Okna dialogowe pozwalają na wybór parametrów polecenia. Operacja jest wykonywana na kopii obrazu, która zostaje skonwertowana automatycznie do formatu gif, oraz zapisana pod nazwą zawierającą losowy łańcuch. Po zakończeniu programu pliki tymczasowe są usuwane. Wywołanie matlaba następuje w poniższy sposób. public void wykonajmatlabgscale(string parametry){ GrayImage giold = ((FrameGrayImage) desktoppane.getselectedframe()).getgi(); String sciezka = giold.getnazwa() + Random.nextInt() + ".gif"; sciezka = (new File(sciezka)).getAbsolutePath(); GrayImage gitmp = new GrayImage(giold.getBI()); zapisz(gitmp.getbi(), sciezka); new File(sciezka).deleteOnExit(); String bierzacyfolder = new File("./matlab").getAbsolutePath(); String skrypt = "\"cd " + bierzacyfolder +";"; skrypt += "I = imread( " + sciezka + " );"; skrypt += "I2 = gscale(i, " +parametry+ " );"; skrypt += "imshow(i2);\""; wykonajskryptmatlabem(skrypt); } // wykonajmatlabgscale() private void wykonajskryptmatlabem(string skrypt){ if ((new File(matlabSciezka)).exists() == false ){ JOptionPane.showMessageDialog(...); 18

return; } // if try { Runtime.getRuntime().exec(matlabSciezka +" -nodesktop"+ "-nojvm -r " + skrypt); } catch (IOException ex){ JOptionPane.showMessageDialog(...); System.err.format("%s\n", ex); } // try.. catch } // wykonajskrypt 19

Bibliografia [1] Notatki z wykładu WPSO. [2] Ryszard Paweł Kostecki, W miarę krótki i praktyczny kurs L A TEX-a w π e minut. [3] Java TM 2 Platform Standard Edition 5.0 API Specification, strona www: (http://java.sun.com/j2se/1.5.0/docs/api/index.html) 20