Wpisany przez Tomasz Lubiński,
15 sierpnia 2007 14:32
Zastosowanie filtrów w przetwarzaniu obrazów oznacza, że do obliczenia nowej wartości punktu brane są pod uwagę wartości punktów z jego otoczenia. Każdy piksel z otoczenia wnosi swój wkład - wagę podczas przeprowadzania obliczeń. Wagi te zapisywane są w postaci maski. Typowe rozmiary masek to 3 x 3, 5 x 5 bądź 7 x 7. Rozmiary masek są z reguły nieparzyste ponieważ piksel na środku reprezentuje piksel dla którego wykonywana jest operacja przekształcania filtrem. Przeanalizujmy filtrację na podstawie filtra o masce 3 x 3.
Wówczas nową wartość składowej punktu a o współrzędnych (i, j) obliczymy według następującego wzoru. Najpierw obliczymy sumę ważoną składowej punktu i wszystkich sąsiadów zgodnie z wagami wskazaymi przez maskę filtra.
Jak łatwo zauważyć próba zastosowania filtracji dla punktów położonych na krawędzi obrazu, prowadzi do sytuacji, w której maska "wystaje" poza przetwarzany obraz. Istnieje kilka sposobów obejścia tego problemu. Jednym z nich jest pominięcie procesu filtracji dla takich punktów, innym jest zmniejszenie obrazu po filtracji o punkty, dla których proces ten nie mógł być wykonany. Kolejnym sposobem jest dodanie do filtrowanego obrazu zduplikowanych pikseli znajdujących się na jego brzegu.
Filtry dolnoprzepustowe (ang. low-pass) przepuszczają elementy obrazu o małej częstotliwości. Elementy o wysokiej częstotliwości (szumy, drobne szczegóły) są natomiast tłumione bądź wręcz blokowane. Wynikiem działania takich fitrów jest zredukowanie szumów, w szczególności gdy jest on jedno, dwupikslowy ale również wygładzenie i rozmycie obrazu. Poniżej znajduje się przykładowy obraz przed (po lewej) i po zastosowaniu filtra dolnoprzepustowego:
f-1, -1 | f0, -1 | f1, -1 |
f-1, 0 | f0, 0 | f1, 0 |
f-1, 1 | f0, 1 | f1, 1 |
Wówczas nową wartość składowej punktu a o współrzędnych (i, j) obliczymy według następującego wzoru. Najpierw obliczymy sumę ważoną składowej punktu i wszystkich sąsiadów zgodnie z wagami wskazaymi przez maskę filtra.
s = f_{-1,-1} * a_{i-1,j-1} + f_{0,-1} * a_{i,j-1} + f_{1,-1} * a_{i+1,j-1} +\\\\
f_{-1,0} * a_{i-1,j} + f_{0,0} * a_{i,j} + f_{1,0} * a_{i+1,j} +\\\\
f_{-1,1} * a_{i-1,j+1} + f_{0,1} * a_{i,j+1} + f_{1,1} * a_{i+1,j+1}
Tak otrzymaną sumę dzielimy przez sumę wszystkich wag maski, jeżeli jest ona różna od 0. Ten proces normalizacji wartości składowej punktu zapobiegnie zmianie jasności przetwarzanego obrazu.
a'_{i,j} = \frac{s}{f_{-1,-1} + f_{0,-1} + f_{1,-1} + f_{-1,0} + f_{0,0} + f_{1,0} + f_{-1,1} + f_{0,1} + f_{1,1}}
Filtrację przeprowadza się osobno dla każdej składowej obrazu. Zatem jeżeli mamy obraz reprezentowany w modelu RGB, to wówczas będziemy wykonywać oddzielne przekształcenia dla składowej R, G oraz B.Jak łatwo zauważyć próba zastosowania filtracji dla punktów położonych na krawędzi obrazu, prowadzi do sytuacji, w której maska "wystaje" poza przetwarzany obraz. Istnieje kilka sposobów obejścia tego problemu. Jednym z nich jest pominięcie procesu filtracji dla takich punktów, innym jest zmniejszenie obrazu po filtracji o punkty, dla których proces ten nie mógł być wykonany. Kolejnym sposobem jest dodanie do filtrowanego obrazu zduplikowanych pikseli znajdujących się na jego brzegu.
Filtry dolnoprzepustowe (ang. low-pass) przepuszczają elementy obrazu o małej częstotliwości. Elementy o wysokiej częstotliwości (szumy, drobne szczegóły) są natomiast tłumione bądź wręcz blokowane. Wynikiem działania takich fitrów jest zredukowanie szumów, w szczególności gdy jest on jedno, dwupikslowy ale również wygładzenie i rozmycie obrazu. Poniżej znajduje się przykładowy obraz przed (po lewej) i po zastosowaniu filtra dolnoprzepustowego:
- filtr uśredniający - jest podstawowym filtrem dolnoprzepustowym, jego wynikiem jest uśrednienie każdego piksla razem ze swoimi ośmioma sąsiadami.
1 1 1 1 1 1 1 1 1 - filtr kwadratowy - jego wynikiem jest uśrednienie każdego piksla razem ze swoimi dwudziestoma czteroma sąsiadami, powoduje to odfiltrowanie większej liczby szczegółów jak w przypadku poprzedniego filtra.
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - filtr kołowy - jest pewną modyfikacją filtra kwadratowego, kształt jego maski zbliżony jest do koła, jego wynikiem jest uśrednienie każdego piksla razem ze swoimi dwudziestoma sąsiadami - punkty położone w narożnikach mają wagę 0, zatem nie biorą udziału w procesie filtracji.
0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 - LP1 - różni się od filtra uśredniającego zwiększeniem wagi, dla aktualnie przetwarzanego punktu, powoduje to zmniejszenie "efektu rozmycia" w stosunku do filtra uśredniającego.
1 1 1 1 2 1 1 1 1 - LP2 - różni się od filtra uśredniającego jeszcze mocniejszym zwiększeniem wagi, dla aktualnie przetwarzanego punktu niż filtr LP2.
1 1 1 1 4 1 1 1 1 - LP2 - różni się od filtra uśredniającego jeszcze mocniejszym zwiększeniem wagi, dla aktualnie przetwarzanego punktu niż filtr LP3.
1 1 1 1 12 1 1 1 1 - piramidalny - jeżeli kolejne komórki tego filtra przedstawionoby za pomocą słupków o wysokości odpowiadającej przypisanej wadze to w efekcie otrzymalibyśmy bryłę podobną do piramidy, stąd jego nazwa. Widać tutaj, że znaczenie wartości punktu rośnie wraz ze zmniejszaniem się odległości do obliczanego punktu.
1 2 3 2 1 2 4 6 4 2 3 6 9 6 3 2 4 6 4 2 1 2 3 2 1 - stożkowy - jeżeli kolejne komórki tego filtra przedstawionoby za pomocą słupków o wysokości odpowiadającej przypisanej wadze to w efekcie otrzymalibyśmy bryłę podobną do stożka, stąd jego nazwa. Znaczenie wartości punktu rośnie wraz ze zmniejszaniem się odległości do obliczanego punktu.
0 0 1 0 0 0 2 2 2 0 1 2 5 2 1 0 2 2 2 0 0 0 1 0 0 - gauss 1 - jeżeli kolejne komórki tego filtra przedstawionoby za pomocą słupków o wysokości odpowiadającej przypisanej wadze to w efekcie otrzymalibyśmy bryłę podobną do krzywej rozkładu normalnego - krzywej Gaussa. Zatem znaczenie wartości punktu rośnie wraz ze zmniejszaniem się odległości do obliczanego punktu, w sposób opisany przez funkcje Gaussa.
1 2 1 2 4 2 1 2 1 - gauss 2 - kolejna wersja filtru wykorzystującego funkcję Gaussa.
1 1 2 1 1 1 2 4 2 1 2 4 8 4 2 1 2 4 2 1 1 1 2 1 1 - gauss 3 - kolejna wersja filtru wykorzystującego funkcję Gaussa.
0 1 2 1 0 1 4 8 4 1 2 8 16 8 2 1 4 8 4 1 0 1 2 1 0 - gauss 4 - kolejna wersja filtru wykorzystującego funkcję Gaussa.
1 4 7 4 1 4 16 26 16 4 7 26 41 26 7 4 26 16 26 4 1 4 7 4 1 - gauss 5 - kolejna wersja filtru wykorzystującego funkcję Gaussa.
1 1 2 2 2 1 1 1 2 2 4 2 2 1 2 2 4 8 4 2 2 2 4 8 16 8 4 2 2 2 4 8 4 2 2 1 2 2 4 2 2 1 1 1 2 2 2 1 1
- usuń średnią (ang. mean removal) - jest to podstawowa wersja filtru górnoprzepustowego, jego użycie powoduje znaczne wyostrzenie obrazu, ale także wzmocnienie wszelkich szumów i zakłóceń.
-1 -1 -1 -1 9 -1 -1 -1 -1 - HP1 - w porównaniu do poprzedniego filtru, cechuje się mniejszym wyostrzeniem obrazu, nie uwypukla tak bardzo szumów znajdujących się w przetwarzanym obrazie.
0 -1 0 -1 5 -1 0 -1 0 - HP2 - w porównaniu do poprzedniego filtru, cechuje się jescze mniejszym wyostrzeniem obrazu.
1 -2 1 -2 5 -2 1 -2 1 - HP3 - powoduje najmniejsze z przedstawionych tutaj filtrów górnoprzepustowych wzmocnienie szumów.
0 -1 0 -1 20 -1 0 -1 0
- poziomy - wykonuje przesunięcie obrazu o jeden punkt w kierunku pionowym a następnie odjęcie wartości punktu od jego kopii, w ten sposób wykrywa krawędzie poziome w obrazie.
0 0 0 -1 1 0 0 0 0 - poziomy - wykonuje przesunięcie obrazu o jeden punkt w kierunku poziomym a następnie odjęcie wartości punktu od jego kopii, w ten sposób wykrywa krawędzie pionowe w obrazie.
0 -1 0 0 1 0 0 0 0 - ukośny - wykonuje przesunięcie obrazu o jeden punkt w kierunku ukośnym a następnie odjęcie wartości punktu od jego kopii, w ten sposób wykrywa krawędzie ukośne / w obrazie.
-1 0 0 0 1 0 0 0 0 - ukośny - wykonuje przesunięcie obrazu o jeden punkt w kierunku ukośnym a następnie odjęcie wartości punktu od jego kopii, w ten sposób wykrywa krawędzie ukośne \ w obrazie.
0 0 -1 0 1 0 0 0 0
- wschód
-1 1 1 -1 -2 1 -1 1 1 - południowy-wschód
-1 -1 1 -1 -2 1 1 1 1 - południe
-1 -1 -1 1 -2 1 1 1 1 - południowy-zachód
1 -1 -1 1 -2 -1 1 1 1 - zachód
1 1 -1 1 -2 -1 1 1 -1 - północny-zachód
1 1 1 1 -2 -1 1 -1 -1 - północ
1 1 1 1 -2 1 -1 -1 -1 - północny-wschód
1 1 1 -1 -2 1 -1 -1 1
- wschód
-1 0 1 -1 1 1 -1 0 1 - południowy-wschód
-1 -1 0 -1 1 1 0 1 1 - południe
-1 -1 -1 0 1 0 1 1 1 - południowy-zachód
0 -1 -1 1 1 -1 1 1 0 - zachód
1 0 -1 1 1 -1 1 0 -1 - północny-zachód
1 1 0 1 1 -1 0 -1 -1 - północ
1 1 1 0 1 0 -1 -1 -1 - północny-wschód
0 1 1 -1 1 1 -1 -1 0
- LAPL1
0 -1 0 -1 4 -1 0 -1 0 - LAPL2
-1 -1 -1 -1 8 -1 -1 -1 -1 - LAPL3
1 -2 1 -2 4 -2 1 -2 1 - Laplace'a ukośny
-1 0 -1 0 4 0 -1 0 -1 - Laplace'a poziomy - ograniczony do wykrywania krawędzi poziomych.
0 -1 0 0 2 0 0 -1 0 - Laplace'a pionowy - ograniczony do wykrywania krawędzi pionowych.
0 0 0 -1 2 -1 0 0 0
- poziomy filtr Sobel'a - wykrywa krawędzie poziome.
1 2 1 0 0 0 -1 -2 -1 - pionowy filtr Sobel'a - wykrywa krawędzie pionowe.
1 0 -1 2 0 -2 1 0 -1 - poziomy filtr Prewitt'a - wykrywa krawędzie poziome.
-1 -1 -1 0 0 0 1 1 1 - pionowy filtr Prewitt'a - wykrywa krawędzie pionowe.
1 0 -1 1 0 -1 1 0 -1
- filtr medianowy - mediana, to wartość środkowa. Wynikiem działania tego filtru jest wybranie piksla o wartości środkowej wszystkich piksli pod maską, czyli dla filtru 3x3 będzie to taka wartość punktu, że pozostałe 4 punkty mają wartość większą a pozostałe 4 wartość mniejszą. Można do tego zadania użyć algorytm Hoare'a. Filtr medianowy pozwala na eliminacje szumu z obrazu bez znacznego rozmycia
obrazu, tak charakterystycznego dla filtrów dolnoprzepustowych.
- filtr minimalny - zwany jest także filtrem kompresujacym albo erozyjnym. Jego działanie polega na wybraniu z pod maski punktu o wartości najmniejszej. Jego działanie powoduje zmniejszenie jasnosci obrazu dajace efekt erozji obiektów. Czasem mówi się, że daje on efekt jakby obraz namalowany został przy uzyciu frab olejnych.
- filtr maksymalny - zwany jest także filtrem dekompresujacym albo ekspansywnym. Jego działanie polega na wybraniu z pod maski punktu o wartości największej. Jego działanie powoduje zwiększenie jasnosci obrazu dajace efekt powiększania się obiektów.
- filtr Kuwahara - jest filtrem wygładzającym zachowującym krawędzie. W filtrze tym maska dzielona jest na regiony. Dla każdego regionu obliczana jest wartość średnia oraz wariancja (suma kwadratów odchyleń) względem tej wartości. Wynikiem działania filtru jest wartość średnia tego regionu, w którym wariancja jest najmniejsza.
Najczęsciej w filtrze Kuwahara punkty pod maską dzielone są na 4 regiony. Podział następuje w taki sposób, że krawędzie przylegających do siebie regionów są wspólne. Punkt centralny dla którego obliczany jest wynik występuje w każdym regionie. Przenalizujmy podział na regiony dla maski o rozmiarze 5x5.
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25
Poniżej kolejne regiony oznaczone są podkresleniem:
x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25
Obliczenia dla regionu pierwszego będą wyglądały następująco:s = \frac{x_1 + x_2 + x_3 + x_6 + x_7 + x_8 + x_{11} + x_{12} + x_{13}}{9}\\\\ wariancja = \frac{(s - x_1)^2 + (s - x_2)^2 + (s - x_3)^2 + (s - x_6)^2 + (s - x_7)^2 + (s - x_8)^2 + (s - x_{11})^2 + (s - x_{12})^2 + (s - x_{13})^2}{9}
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C/C++ | Borland Builder 6 | .cpp | .cpp | ***** / 14 |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 3 |
Poprawiony: 23 sierpnia 2012 14:55
ujemnych pikseli nie dostaniesz tylko ujemne wartości jasnosci mozesz to normalizowac od 0-255 dzieje sie tak dlatego ze w masce filtru masz wspolczynniki wieksze od 1 lub ujemne
1 2 1
0 0 0
-1 -2 -1
suma = 1+2+1+0+0+0-1-2-1 = 0
wiec obliczajac a' mamy dzielenie przez zero a'=s/suma
ktos wie co w takim przypadku?
Nie zmienia to faktu, że artykuł jest znakomity,
pozdrawiam, Olo
tego piksla, tych piksli, tym pikslom. Jak chcesz poprawiać polszczyznę, to się zastanów czy się nie poniżasz :)
Piszę w C funkcję filtrującą i dopóki używam masek o współczynnikach >=0 wszystko gra, ale nie wiem jak zapisać algorytm dla masek ze współczynnikami ujemnymi. Znalazlem w innych źródłach wzór z wykorzystaniem wartości max i min dla danego splotu, ale w efekcie dostaję tylko szum.
Mógłby ktoś łopatologicznie napisać jak postępować w przypadku masek o współczynnikach dodatnio/ujemnych?
Z góry dziękuję!
Taką informację można znaleźć np. w Wikipedii i tak wszyscy napisaliśmy na egzaminie, za co wykladowca dal nam punkty ujemne. Szczerze mówiąc, skoro wartość piksela badanego zależy od jego wartości i jego najbliższego otoczenia oraz zależy w jakim obszarze obrazu filtr dziala, to chyba można powiedzieć, że nie ma stalej maski, a nawet więcej - nie może jej mieć! Czy można prosić o wyjaśnienie tej kwestii? Przepraszam, nie można napisać litery "l" w formularzu, albo coś jest mojej klawiaturze.
Operuję na 2 kolorowej bitmapie bo tak jest szybcie zrobienie przekaształceń a dopierow na końcu nanoszę kolory ( taka maska).
Zna ktos sposób-rozwiązanie.