uniwersytet mikołaja kopernika wydział matematyki i ...piersaj/www/contents/wpso/... ·...
TRANSCRIPT
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.
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
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
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
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
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
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
(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
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
(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
(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
(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
(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
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
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
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
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
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
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
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
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