Splot Funkcji: Filtracja Obrazu i Definicja

W tym wpisie szczegółowo wyjaśniam działanie funkcji splotu, matematycznej operacji która znakomicie przydaje się w przetwarzaniu obrazów. Ponadto jest jednym z głównych bloków w sieciach konwolucyjnych.

Convolutional Neural Networks (#ConvNets) stanowią jeden z fundamentów wśród metod klasyfikacji i rozpoznawania obrazów, swoją siłę zawdzięczają właśnie wykorzystaniu warstw dokonujących operacji splotu pomiędzy obrazem (lub warstwami dolnymi) a macierzą wag w danej warstwie. Lecz zanim zaczniemy analizować architekturę sieci konwolucyjnych warto nabrać intuicji czym ta operacja jest oraz jaką rolę pełni w przetwarzaniu obrazów.

Operacja splotu po raz pierwszy do sieci neuronowych została wprowadzona w pracy LeCunn at al, lecz jest to operacja matematyczna, której pierwsze wzmianki przypisuje się D’Alebert’owi w 1754. Formalnie zdefiniowana jest w dość zawiły sposób z wykorzystaniem całek, lecz spróbujmy rozłożyć to na czynniki pierwsze.

Konwolucja (splot) czyli połączenie dwóch funkcji

Po pierwsze jest to operacja wykonywana na dwóch funkcjach np. \(f(t), g(t)\), w wyniku której otrzymamy nową funkcję \(h(t)\). Jak to otrzymujemy nową funkcję? To na funkcjach można wykonywać działania? A no można, już pewnie wcześniej takie operacje wykonywałeś np. dodawanie funkcji lub mnożenie, np. niech \(f(t)=t^2, g(t)=\sin(t)\), możemy określić działania:

\begin{align}h(t)=&(f+g)(t)=f(t)+g(t)=t^2+\sin(t) \\\h(t)=&(f \cdot g)(t)=f(t) \cdot g(t)=t^2\cdot\sin(t)\end{align}

Przeczytaj także: AirSonic HB - szczegóły

Analogicznie możemy określić działanie splotu funkcji wykorzystując szereg złożonych operacji: mnożenie funkcji, odbicie funkcji, translację oraz operacje całkowania:

\(h(t)=(f*g)(t)=\int\limits_{0}^t f(x)g(t-x) dx\)

Co to za poczwarka, skąd nagle wzięły się dwie literki \(t, x\) i jak mam rozumieć tę całkę?

Po pierwsze, zauważ że główną zmienną jest cały czas u nas \(t\), zmienna \(x\) służy tylko jako zmienna do całkowania, ostatecznie zniknie ona w wyniku obliczenia całki. Wyobraź sobie ze chcemy policzyć \(h(5)\), czyli wszędzie w wzorach za t podstawiamy wartość 5.

Pod całką obliczamy zwykły iloczyn dwóch funkcji \(f, g\) z tym, że funkcja \(g\) jest odbita względem osi OY, \(g(-x)\) oraz przesunięta o t \(g(t-x)\).

Przeczytaj także: Definicja i pomiar filtracji kłębuszkowej

Na funkcję \(g(t)\) można patrzeć jak na funkcję określającą wagi dla funkcji \(f(t)\) (jak przy średniej ważonej).

Całkowanie można rozumieć jako zsumowanie wartości poszczególnych iloczynów z pewnej okolicy (przedzału).

Ja osobiście tłumaczę to sobie następująco, wybieram wartość \(t=t_1\), następnie wiem, że będę dokonywał sumowania wartości dla z pewnej okolicy \(t_1\), w naszym przykładzie \(x \in [0,t_1]\), dla każdej wartości z przedziału obliczam iloczyn pomiędzy \(f(x)\cdot g(t_1-x)\) oraz sumuje je.

Bardzo pomocnym w zrozumieniu tej operacji jest przypadek dyskretny, w którym zmienne przyjmują wartości naturalne.

Splot funkcji z wartościami dyskretnymi

W tym przypadku nasze funkcje są ciągami o wyrazach \(f=\{ f[0],f[1],f[2], \dots \}\) oraz \( g=\{ g[0],g[1], g[2],\dots \}\), operację konwolucji dyskretnej możemy zdefiniować następująco:

Przeczytaj także: Webber AP8400 - wymiana filtrów

\((f*g)[n] =\sum _{{m }}^{{n }}f[m]\,g[n-m]\)

Tak na dobrą sprawę wzór jest taki sam, z tym że znak całki został zamieniony na znak sumy. Zakres zmiennej indeksującej \(m\) kolejno zmienia się w zależności od długości ciągu \(g\) oraz na której pozycji dla której chcemy obliczyć splot.

Zobaczmy to na przykładzie, zwróćcie uwagę na różną długość ciągów oraz zmienną \(m\)

Policzmy przykład. Mamy dwa ciągi skończone \(f=\{1,0,1,1,1,0\}, g=\{1,1,0\}\), w których wyrazy numerujemy od zera, obliczmy kolejno \(h[0],h[1],…\)

\begin{align}n=0, m&=0 \\\h[0] &= f[0] \cdot g[0]=1 \cdot 1=1 \\\n=1, m&=0,1 \\\h[1]&= f[0] \cdot g[1-0]+f[1] \cdot g[1-1]=1 \cdot 1+0 \cdot 1=1 \\\n=2, m&=0,1,2 \\\h[2]&= f[0] \cdot g[2-0]+f[1] \cdot g[2-1]+f[2] \cdot g[2-2] \\\&= 1 \cdot 0+0 \cdot 1+1 \cdot1=1 \\\\end{align}

A teraz uwaga, jak policzyć \(h[3]\)? Powyższe przykłady, zarówno ciągły jak i dyskretny były jednowymiarowe, tzn. funkcje \(f, g\) były funkcjami jednej zmiennej.

Zobaczmy jak to wygląda dla sygnału dwuwymiarowego, którego dobrym przykładem jest właśnie obraz.

Operacja splotu w analizie obrazów

Cała idea konwolucji, w głównej mierze polega na przesuwaniu okna z wartościami z \(g\) (nazwijmy tę funkcję filtrem) wzdłuż sygnału \(f\), przemnażaniu odpowiadających wartości oraz dodawaniu tych iloczynów do siebie. W przypadku dwuwymiarowym, przesuwanie to będzie odbywało się z lewej do prawej, a następnie z góry na dół, formalnie prezentuje się to następująco:

\(h[m,n]=(f*g)[m,n]=\sum _{j}\sum _{k}{f[j,k]g[m-j,n-k]} \)

W kontekście przetwarzania obrazów funkcja \(f\) jest dwuwymiarową macierzą zawierającą wartości pikseli obrazu, zazwyczaj ma ona duże wymiary np. 600x400px, natomiast funkcja \(g\), nasz filtr, jest zdecydowanie mniejszą macierzą np. 3x3px, 5x5px itp.

W wyniku konwolucji obrazu z filtrem, otrzymamy nowy obraz, w którym każdy piksel \(h[m,n]\) został utworzony na podstawie jego sąsiedztwa. W zależności do wyboru filtra możemy otrzymać obraz rozmyty, wyostrzony lub z uwypuklonymi krawędziami.

Implementacja operacji splotu w Python’ie

Operacja konwolucji jest na tyle standardową operacją, że nie musimy jej sami implementować. Dwie popularne biblioteki numeryczne Numpy i Scipy mają tą operację zaimplementowaną.

W liniach 1-4 importujemy niezbędne biblioteki, następnie odczytujemy obraz i dzieląc przez 255 normalizujemy wartości pikseli do przedziału [0,1]. W liniach 12-14 definiujemy filtr o wymiarach 3×3, na początku definiujemy macierz składającą się z samych jedynek o później dzielimy przez ilość elementów w macierzy.

Operację konwolucji stosujemy do każdego kanału RGB oddzielnie (linie 17-19) podając do funkcji convolve2d kolejno: obraz, filtr (kernel) oraz sposób w jaki mają być obsłużone wartości na krawędziach. Następnie (linie 22-23) składamy z powrotem poszczególne kanały wyniku w obraz, denormalizujemy wartości z [0,1] na [0,255] i rzutujemy na int.

Ostatnie linie służą wyświetleniu wyniku:

Typy Filtrów

  • 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.
  • 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.
  • 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.
  • 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.
  • Filtry górnoprzepustowe (ang. high-pass) przepuszczają i wzmacniają elementy obrazu o dużej częstotilości, są to szumy, drobne szczegóły i krawędzie. Tłumieniu natomiast ulegają elementy o niskiej częstotliwości. Wynikiem działania takich fitrów jest wyostrzenie obrazu, a także zwiększenie ilości szumów.
  • usuń średnią (ang. Filtry przesuwania i odejmowania, wykonują przesunięcie obrazu a następnie odejmowanie obrazu od swojej kopii. Filtry te służą do wykrywania krawędzi w obrazie. W zależności od kierunku przesuwania obrazu będą to krawędzie pionowe, poziome bądź ukośne. Należy zauważyć, że w wyniku działania tego rodzaju filtrów wynikowa wartość składowej punktu może wyjść ujemna. W takim wypadku należy użyć wartości bezwzględnej albo sprowadzić wartość do 0.
  • Gradientowe filtry kierunkowe (ang. gradient directional) służą również do wykrywania krawędzi w obrazie. Nazwa kolejnych przedstawionych filtrów określa krawędzie- zgodnie z kierunkiem geograficznym, które będą wykryte na obrazie wynikowym.
  • Filtry uwypuklające (ang. embossing) wprowadzają złudzenie wypukłości i wklęsłości w miejscach, gdzie w obrazie znajdują się krawędzie - daje to efekt podobny do płaskorzeźby. Nazwa kolejnych przedstawionych filtrów określa krawędzie- zgodnie z kierunkiem geograficznym, które będą uwypuklone w obrazie wynikowym.
  • Filtry Laplace'a - stosowane są do wykrywania krawędzi. W porównaniu do innych przedstawionych tutaj filtrów cechuje je wielokierunkowość - wykrywają krawędzie we wszystkich kierunkach. Ponadto dają w efekcie ostrzejsze krawędzie.
  • Filtry konturowe - służą do wykrywania krawędzi. Podstawowymi filtrami konturowymi są filtry Sobel'a o Prewitt'a.
  • Filtry statystyczne - wykorzystuje się je podobnie jak przedstawione powyżej filtry liniowe. Wartość wynikowa jednak powstaje nie w wyniku obliczenia sumy ważonej (funkcji splotu) poszczególnych piksli lecz poprzez wybranie wartości odpowiedniego piksla pod maską.
  • 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 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.
  • 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.
  • 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. 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.

tags: #splot #funkcji #filtracja #obrazu #definicja

Popularne posty: