Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... ·...

21
Uniwersytet Mikolaja Kopernika Wydzial Matematyki i Informatyki Jaroslaw Piersa piersaj(at)mat.uni.torun.pl Numer albumu 183651 Informatyka, rok V Wstęp do przetwarzania sygnalów i obrazów Dokumentacja projektu Toruń 2008r Abstrakt Praca poniższa jest dokumentacją do projektu wykonanego w ra- mach laboratorium Wstępu do przetwarzania Sygnalów i Obrazów, prowadzo- nego 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óltonów, transformata Fouriera, dodawanie szumu, poddawanie obrazu operacjom w pakiecie Matlab. Program zostal zaimplementowany w Javie IcedTea 1.7.0 w środowisku programistycznym Eclipse 3.3.

Transcript of Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... ·...

Page 1: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Uniwersytet Mikołaja Kopernika

Wydział Matematyki i Informatyki

Jarosław Piersapiersaj(at)mat.uni.torun.pl

Numer albumu 183651Informatyka, rok V

Wstęp do przetwarzania sygnałów i obrazówDokumentacja projektu

Toruń 2008r

Abstrakt Praca poniższa jest dokumentacją do projektu wykonanego w ra-mach laboratorium Wstępu do przetwarzania Sygnałów i Obrazów, prowadzo-nego przez dr. Marię Berndt-Schreiber na WMiI UMK w roku akademickim2007/2008 w semestrze letnim. Projekt umożliwia wykonywanie podstawowychoperacji na obrazach w odcieniach szarości: filtracje przestrzenne, malowanietechnikami półtonów, transformata Fouriera, dodawanie szumu, poddawanieobrazu operacjom w pakiecie Matlab. Program został zaimplementowany wJavie IcedTea 1.7.0 w środowisku programistycznym Eclipse 3.3.

Page 2: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Spis treści

1 Opis techniczny 21.1 Specyfikacja techniczna . . . . . . . . . . . . . . . . . . . . . . . 21.2 Otwieranie i zapisywanie plików . . . . . . . . . . . . . . . . . . . 21.3 Technika półtonów . . . . . . . . . . . . . . . . . . . . . . . . . . 31.4 Filtry przestrzenne . . . . . . . . . . . . . . . . . . . . . . . . . . 31.5 Transformata Fouriera . . . . . . . . . . . . . . . . . . . . . . . . 41.6 Szum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

1.6.1 Szum Gaussowski . . . . . . . . . . . . . . . . . . . . . . . 41.6.2 Szum impulsowy . . . . . . . . . . . . . . . . . . . . . . . 4

1.7 Niestandardowe funkcje pakietu Matlab . . . . . . . . . . . . . . 51.7.1 Wybór ścieżki do Matlaba . . . . . . . . . . . . . . . . . . 51.7.2 Duplikowanie Pikseli . . . . . . . . . . . . . . . . . . . . . 51.7.3 Modyfikowanie skali szarości . . . . . . . . . . . . . . . . 51.7.4 Transformacje intensywności pikseli . . . . . . . . . . . . 5

2 Prezentacja wyników 62.1 Technika Półtonów . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Filtry Przestrzenne . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3 Transformata Fouriera . . . . . . . . . . . . . . . . . . . . . . . . 82.4 Szum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.5 Niestandardowe Funkcje Matlaba . . . . . . . . . . . . . . . . . . 8

3 Listingi kodu źródłowego 133.1 Przechowywanie obrazu . . . . . . . . . . . . . . . . . . . . . . . 133.2 Filtr obrazów . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.3 Malowanie półtonami . . . . . . . . . . . . . . . . . . . . . . . . 143.4 Transformata Fouriera . . . . . . . . . . . . . . . . . . . . . . . . 163.5 Szum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.6 Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Bibliografia 20

1

Page 3: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Rozdział 1

Opis techniczny

1.1 Specyfikacja techniczna

Program napisany został z użyciem standardowych bibliotek Javy. Informacjeo obrazie przechowywane są w kasie java.awt.image.BufferedImage, ograniczonejdo obrazów w odcieniach szarości. Interfejs graficzny został napisany z użyciembibliotek 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ń Ma-tlaba).

Standardowe biblioteki wejścia i wyjścia Javy zapewniają pełne wsparcie dlaformatu graficznego GIF. Kompatybilność z innymi formatami, w szczególnościJPEG i BMP, może być zależna od rodzaju środowiska Javy lub / i systemuoperacyjnego.

1.2 Otwieranie i zapisywanie plików

Otwieranie pliku graficznego do edycji możliwe jest poprzez wybranie polece-nia „Otwórz” w menu „Plik”. Akceptowane są obrazy w formatach graficznychGIF, JPEG oraz PNG. Wszystkie operacje graficzne wykonywane są na zazna-czonym 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 „Za-pisz”. Należy dodatkowo podać nazwę pliku i rozszerzenie, jeżeli domyślna niejest satysfakcjonująca.

2

Page 4: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

UWAGA Obsługiwane formaty zapisu mogą zależeć od zainstalowanej wersjiJavy. Wskazane jest korzystanie z formatu GIF.

1.3 Technika półtonów

Ten moduł programu pozwala na przybliżanie obrazu w odcieniach szarościobrazem binarnym. Działa w sposób blokowy. Każdemu blokowi o rozmiarze3× 3 w oryginalnym obrazie przyporządkowuje blok o tym samym rozmiarze wobrazie wynikowym. Nowy blok zawiera może zawierać jedynie dwie wartości 0czyli czarny lub 255 — biały. Pośrednie odcienie szarości przybliżane są poprzezodpowiednie proporcje białych i czarnych pikseli w bloku. Przybliżenie to bazujena ś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 ichilość pozostaje niezmieniona.

1.4 Filtry przestrzenne

Ten moduł pozwala na poddawanie obrazów procesowi filtracji. Od stronymatemetycznej 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, oznaczmypoprzez 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−12∑

i=− k−12

l−12∑

j=− l−12

p(x + i, y + j) ·m(i +k − 1

2, j +

l − 12

)

Program udostępnia kilka filtrów predefiniowanych, oraz możliwość edycjiwł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 orazmniejszymi niż 25.

• Wartości wpisywane w pola maski muszą być całkowite.

• W razie konieczności należy dodatkowo ustawić wspólny dzielnik dla ma-ski. Finalna wartość będzie ilorazem wpisanej wartości w masce i dzielnika.Dzielnik nie może być zerem.

3

Page 5: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

1.5 Transformata Fouriera

Ten moduł pozwala na obliczenie transformaty Fouriera dla obrazy. Zaim-plementowano algorytm szybkiej transformaty Fouriera (FFT), co za tym idziewymagane są wymiary obrazu będące potęgami liczby 2. Program automatycz-nie 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 szu-mem impulsowym.

1.6.1 Szum Gaussowski

Szum Gaussowski polega na dodaniu do każdego piksela liczby losowanej nie-zależ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 nieza-leżny dla każdego piksela według poniższych wzorów

Pn =

val1 z prawdopodobieństwem p1

val2 z prawdopodobieństwem p2

Ps z prawdopodobieństwem 1− p1 − p2

W oknie dialogowym należy podać wartości parametrów:

p1 — prawdopodobieństwo zaszumienia wartością val1, p1 ≥ 0,

p2 — prawdopodobieństwo zaszumienia wartością val2, p1 ≥ 0, p1 + p2 ≤ 1,

val1 — wartość piksela, wstawiana z prawdopodobieństwem p1, 0 ≤ val1 ≤ 255

val2 — wartość piksela, wstawiana z prawdopodobieństwem p2, 0 ≤ val2 ≤ 255

4

Page 6: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

1.7 Niestandardowe funkcje pakietu Matlab

Program dodatkowo pozwala na wywoływanie niektórych funkcjipakietu Ma-tlab. 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 lubskryptu startuwego Matlaba. Może się okazać niezbędna w sytuacji gdy Matlabnie jest dostępny w domyślnym katalogu, bądź występuje pod inną niż domyślnanazwą. W oknie dialogowym należy wybrać plik wykonywalny: matlab.bat wsystemie windows lub matlab na Linuxie.

1.7.2 Duplikowanie Pikseli

Ten skrypt pozwala na zwiększanie rozmiaru obrazu poprzez duplikowaniepikseli. Wymaga sprecyzowania dwóch parametrów m,n ∈ N≥1. 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 przeskalowaniewartoś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. Dostępne sąnastępujące tryby:

• neg — negatyw obrazu, nie wymaga ddakowych parametrów.

• log — transformacja logrytmiczna obrazu, wymaga parametru skalującegowynik,

• gamma — transformacja gamma (lub korekcja gamma), wymaga jednegoparametru odpowiedzialnego za wynikowy kontrast,

• stretch — transformacja kontrastująca, wymaga dwóch parametrów.

5

Page 7: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Rozdział 2

Prezentacja wyników

2.1 Technika Półtonów

Poniżej zaprezentowane są wyniki działania techniki półtonów dla różnychobrazów.

Jak widać na załączonych ilustracjach choć ilość poziomów kwantyzacji zo-stała zredukowana do dwóch obraz nadal jest czytelny. Technika półtonów pre-definiowanych wydaje się dawać obraz płytszy i w „mniejszej” ilości odcieni, aleteż znacznie bardziej regularny. Gdy półtony były generowane losowo, obrazzyskiwał delikatniejszy światłocień. Jednocześnie sprawia wrażenie silnie za-szumionego nieregularnym rozkładem pikseli. Aby uzyskać optymalne wrażenienależy oddalić się na pewną odległość.

Może to nie być widoczne na zamieszczonych obrazach, ale obraz otrzymanypierwszą 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 wybra-nych obrazach.

Filtr Gaussowski ma właściwości rozmywające. Zaprezentowane są od lewej:obraz oryginalny, po przefiltrowaniu jednokrotnym, po przefiltrowaniu trzykrot-nym. Można zaobserwować postępujące rozmycie obrazu.

Widać że wyraźnie zostały wzmocnione krawędzie: pionowe dla filtru Sobela Yi poziome dla filtru X. Co jednak ciekawe filtr omija krawędzie gdy ciemniejszyobszar znajduje się powyżej (w przypadku filtru X) lub na lewo (filtr Y) odkrawędzi.

W edytorze filtrów dodatkowo zdefiniowano filtr Laplace’a, a następnie pod-dano obraz filtracji. Jak widać wychwycone zostały wszystkie krawędzie, za-równo poziome jak i pionowe. Z drugiej jednak strony są one znacznie cieńsze,

6

Page 8: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

(a) Obraz zawierający kolejne wartości sza-roś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. malowany technikąpółtonów losowych.

Rysunek 2.1: Malowanie techniką półtonów dla obrazu prerenderowanago i plikuLena.jpg.

7

Page 9: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Rysunek 2.2: Plik text.jpg. Obraz oryginalny, obraz po jednokrotnym zastoso-waniu filtru Gaussa, po trzykrotnym przefiltrowaniu.

przez co mniej widoczne. Przemnożenie wynikowego obrazu przez 2 znaczniepoprawił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 ifaza, w wersjach bez przesunięć do środka transformaty oraz z nimi, i dodatkowopo logarytmowaniu z różnymi skalarami (rysunek 2.4).

2.4 Szum

Rysunki prezentują działanie szumów dodanych do pliku circuit.jpg. Zasto-sowane 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). Widocznajest wyraźna strata jakości, ale widać również że typy szumów nie są do siebiepodobne.

2.5 Niestandardowe Funkcje Matlaba

Ponizej zostaly przedstawione wyniki działania funkcji matlabowskich dla ob-razu Leny (lena.jpg). Zamieszczone zostały negatyw, transformacje logaryt-miczne i gamma, moduł stretch oraz konwersja skali szarości minmax.

8

Page 10: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

(a) Plik oryginalny.

(b) Po zaaplikowaniu filtrów Sobela X i Y.

(c) Po zaaplikowaniu filtru Laplace’a w edytorze filtrów oraz dodatkowopo przemnożeniu wartości pikseli przez 2.

Rysunek 2.3: Plik tyre.jpg poddawany różnym filtrom.

9

Page 11: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

(a) Obraz oryginalny. (b) Obraz amplitudy. (c) Obraz amplitudy po prze-sunięciu do środka transfor-maty

(d) Obraz amplitudy po prze-sunięciu i transformacji loga-rytmicznej z parametrem 11.

(e) Obraz amplitudy po prze-sunięciu i transformacji loga-rytmicznej z parametrem 33.

(f) Obraz amplitudy po prze-sunięciu i transformacji loga-rytmicznej z parametrem 66.

(g) Obraz fazy po transforma-cji logarytmicznej z parame-trem 100.

(h) Obraz fazy po przesunię-ciu i logarytmowaniu z para-metrem 100.

Rysunek 2.4: FFT dla pliku testpat1.jpg

10

Page 12: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

(a) Obraz oryginalny. (b) Obraz z szumem gaussow-skim µ = 0, σ2 = 200.

(c) Obraz z szumem gaussow-skim µ = 0, σ2 = 400.

(d) Obraz z szumem impulso-wym p1 = 0.05, p2 = 0.05,val1 = 0, val2 = 255.

(e) Obraz z szumem impulso-wym p1 = 0.05, p2 = 0.00,val1 = 0, val2 = 255.

(f) Obraz z szumem impulso-wym p1 = 0.00, p2 = 0.05,val1 = 0, val2 = 255.

Rysunek 2.5: Szum dla pliku circuit.jpg

11

Page 13: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

(a) Obraz oryginalny. (b) Obraz po duplikacji pikseli m = n = 2.

(c) Obraz po zmianie skaliszarości min = 0, max = 0.5(gscale.m).

(d) Obraz po zmianie skaliszarości min = 0.25, max =0.75 (gscale.m).

(e) Obraz w negatywie (in-transbis.m)

(f) Obraz po operacji logaryt-mowania ze skalarem równym10 (intransbis.m).

(g) Obraz po korekcji gammaγ = 0.2 (intransbis.m).

(h) Obraz po operacji stretchm = 0.2, e = 0.5 (intrans-bis.m).

Rysunek 2.6: Niestandardowe funkcje Matlaba dla obrazu Leny

12

Page 14: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Rozdział 3

Listingi kodu źródłowego

3.1 Przechowywanie obrazu

Obrazy w programie są przechowywane w klasie GrayImage.java. We-wnętrznie dane są przechowywane w java.awt.image.BufferedImage jednakżeograniczono dostęp do niech dostęp. Możliwe jest jedynie podawanie wartościpikseli 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;

} // ifreturn 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

Page 15: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

3.2 Filtr obrazów

Klasa ImageFilter.java impementuje operację filtrowania obrazu. Po usta-leniu maski filtru i podaniu obrazu wejściowego tworzony jest nowy obraz oidentycznych wymiarach, do którego zapisywane są wartości pikseli po przefi-trowaniu.

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 iprzyporządkowywany jest odpowiadający blok pikseli (wyłącznie białych i czar-nych) 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

Page 16: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

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 ireturn 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 --;

}} // whilereturn maska;

} // generujLosowaMaske()

15

Page 17: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

3.4 Transformata Fouriera

FFT na obrazach została zaimplementowana w klasie TransformataFo-uriera.java, jednakże, sama operacja FFT, znajduje się w Wielomian.java.Klasa TransformataFouriera.java jest interfejsem tłumaczącym zapis obrazudo postaci, na której możliwe jest wykonanie FFT i tłumaczącym wyniki z po-wrotem do formy graficznej. Odpowiada również za obliczenia amplirudy i fazy zwielomianu zespolinego. Właściwe obliczenia znajdują się w Wielomian.java.Jest to fragment kodu pisany na potrzeby innego projektu, jednakże po nie-wielkich modyfikacjach znakomicie sprawdza się również tu. Dodatkowo wyko-nuje operacje transformacji logarytmicznej, przed zapisaniem obrazu do buforajava.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/2Wielomian 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

Page 18: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

gamma.setWspolczynnik( i+n/2, c);} // for ireturn gamma;

} // FFT

3.5 Szum

Za dodawanie szumu do obrazu odpowiedzialne są klasy SzumGaussow-ski.java oraz SzumImpulsowy.java. Wykorzystano generator liczb pseudo-losowych ze standardoeych bibiotek Javy java.utils.Random. Zaszumianiepikseli następuje niezależnie od siebie. Wartość pikseli po zaszumieniu jest przy-bliżana do najbliższej dopuszczalnej wartości dla pikseli tj liczby całkowitej zprzedział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

Page 19: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

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 klasieWpsoMainWindow.java. Okna dialogowe pozwalają na wybór parametrów po-lecenia.

Operacja jest wykonywana na kopii obrazu, która zostaje skonwertowanaautomatycznie 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

Page 20: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

return;} // iftry {Runtime.getRuntime().exec(matlabSciezka +" -nodesktop"+

"-nojvm -r " + skrypt);} catch (IOException ex){JOptionPane.showMessageDialog(...);System.err.format("%s\n", ex);

} // try .. catch} // wykonajSkrypt

19

Page 21: Uniwersytet Mikołaja Kopernika Wydział Matematyki i ...piersaj/www/contents/wpso/... · Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Jarosław Piersa piersaj(at)mat.uni.torun.pl

Bibliografia

[1] Notatki z wykładu WPSO.

[2] Ryszard Paweł Kostecki, W miarę krótki i praktyczny kurs LATEX-a w πe

minut.

[3] JavaTM 2 Platform Standard Edition 5.0 API Specification, strona www:(http://java.sun.com/j2se/1.5.0/docs/api/index.html)

20