Proste przetwarzanie obrazów

23.12.2009 - Rafał Kozik
TrudnośćTrudność

4. Filtry uwzględniające otoczenie

Drugim popularnym rodzajem filtrów służących do przetwarzania obrazów są filtry uwzględniają otaczanie przetwarzanego piksela. Filtry te wykonują obliczenia na każdej składowej obrazu osobno.

Filtr uwzględniający otoczenie można reprezentować przez macierz opisującą jaki wpływ na przetwarzany piksel mają jego sąsiedzi. Nowa wartość piksela będzie wynikiem średniej ważonej pewnego obszaru, gdzie wagi będą zapisane w macierzy (przetwarzany piksel będzie w jej środku). Dla uproszczenia będziemy zajmować się filtrami używającymi macierzy 3x3. Każdą operację można jednak rozszerzyć na większą macierz.

Przykład:

identyczność

Jaką operację wykonuje filtr, którego wagi są opisane taką macierzą? Jeżeli Twoja odpowiedź brzmiała 'żadną', to jest ona prawidłowa. Na wynik przekształcenia będzie składał się tylko przetwarzany piksel, więc otrzymamy dokładnie to samo od czego zaczęliśmy.

Wypadałoby powiedzieć jeszcze kilka słów na temat wag zawartych w macierzy. Aby wynik średniej mieścił się w odpowiednim zakresie, wszystkie wagi powinny sumować się do 1. Ponieważ jest to niewygodne do zapisu, nie będziemy przestrzegać tej zasady. Aby efekt końcowy był odpowiedni, wynik obliczeń dzielimy przez sumę wszystkich wag, dzięki czemu uzyskamy odpowiednie rezultaty (wyjątkiem będą filtry wykrywające krawędzie, gdzie suma wag będzie wynosiła 0). Zajmiemy się teraz trochę bardziej skomplikowanymi filtrami.

Rozmycie (Box Filter)

Pierwszym filtrem, który jest jednocześnie najprostszym, jest box filter. Jest to prosty filtr służący do rozmywania obrazu. Co to oznacza, że obraz jest rozmyty? Sąsiednie piksele są do siebie bardziej podobne, przez co wszelkie detale są mniej wyraźne. W jaki sposób możemy to osiągnąć? Po prostu uśrednijmy cały obszar:

box filter

Gaussian Blur

Poprzedni filtr ma jedną dużą wadę -- wszystkie piksele z otoczenia traktowane są jednakowo. Nie jest to do końca to czego byśmy chcieli, bo jednak piksel znajdujący się w środku powinien mieć większe znaczenie niż jego sąsiedzi. Tylko w jaki sposób dobrać odpowiednie wagi? Aby to zrobić posłużymy się rozkładem Gaussa (rozkładem normalnym). Krzywa opisująca rozkład Gaussa doskonale nadaje się do wyboru wag dla poszczególnych pikseli:

gamma wykres

Środek przetwarzanego obszaru ma mieć największą wagę, a czym bardziej się od niego oddalamy wagi stają się coraz mniejsze. Osoby zainteresowane rozkładem Gaussa odsyłam do informacji na wikipedii.

Dobrane wagi będą pewnym przybliżeniem tego rozkładu -- ma to szczególne znaczenie przy przetwarzaniu obrazu gdy korzystamy tylko z liczb całkowitych (np. ze względów wydajnościowych). Odpowiednia macierz i efekt jej użycia wyglądają tak:

gaussian

Wyostrzenie

Zasada działania tego filtru jest odwrotna do tej na jakiej działają filtry rozmywające. Jeżeli chcemy coś wyostrzyć, to chcemy zwiększyć różnicę między sąsiednimi pikselami. W jaki sposób to osiągnąć? Wprowadzimy ujemne wagi dla pikseli otaczających. Nie zrobimy tego jednak dla wszystkich pikseli, a w sposób bardziej podobny do tego jaki został użyty w przypadku gaussian blur:

sharpen

Moc filtru możemy regulować za pomocą wagi w środku macierzy (czym większa, tym mniejszy wpływ na wynik będą miały okoliczne piksele). Na podobnej zasadzie można też zbudować inne filtry wyostrzające, które mogą uwzględniać więcej sąsiednich pikseli.

Wykrywanie krawędzi

Filtry wykrywające krawędzie stanowią bardzo ciekawą grupę. Jest ich wiele i mogą służyć do różnych zastosowań. Zastanówmy się w jaki sposób, podobny do poprzednich, moglibyśmy wykrywać krawędzie? Jeżeli mamy pionową krawędź to możemy zrobić to tak, że od podwojonego aktualnego piksela odejmiemy jego sąsiadów w poziomie. Jeżeli nie ma krawędzi to otrzymamy wartość bliską 0, bo wszystkie wartości biorące udział w obliczeniach są podobne. Jeżeli krawędź się pojawi, to wartość ta będzie większa. Jak to działa w praktyce? Zobaczmy:

edge v

Filtr wykrywający krawędzie poziome wygląda analogicznie:

edge h

Jeżeli chcemy uwzględnić krawędzie poziome i pionowe, możemy zsumować te dwa filtry:

edge b

Niestety nasz filtr wykrywa tylko pionowe i poziome krawędzie. A co z krawędziami, które znajdują się pod kątem? Możemy to rozwiązać w taki sposób: zsumujmy filtr wykrywający krawędzie pionowe i poziome z jego obrotem o 45 stopni. Nie jest to operacja dokładna, ale pokazuje skąd wziął się ten filtr:

edge a

Filtr ten nazywa się Laplacian.

5. Filtry uwzględniające otoczenie -- aplet

Po zapoznaniu się z podstawowymi filtrami uwzględniającymi otoczenie, znów możemy trochę poeksperymentować. Poniższy aplet ma wbudowane wszystkie filtry, które zostały pokazane powyżej. Pozwala też na podanie własnej macierzy przekształcenia.

Your browser is not Java enabled.
Zgłoś problem z apletem

6. Podsumowanie

Pokazałem trochę informacji, które stanowią wprowadzenie w świat przetwarzania obrazów. Duże programy graficzne posiadają setki filtrów i ogromne możliwości. Część z nich bazuje na podobnych koncepcjach do tych, które zostały tu zaprezentowane, część używa zaawansowanej matematyki, a trochę to po prostu proste sztuczki dające ciekawe efekty -- czasami warto poeksperymentować z filtrami programu graficznego i zastanowić się przez chwilę jak działa dana operacja na obrazie. Mam nadzieję, że ten artykuł będzie zachętą i pomocą przy takich rozważaniach.

Masz pytania, uwagi? Znalazłeś błąd? Powiedz o tym na forum.

4.333335
Twoja ocena: Brak Ocena: 4.3 (3 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com