Wiem, że to pytanie może nie być zbyt istotne dla programowania, ale jeśli nie zrozumiem teorii leżącej u podstaw przetwarzania obrazu, nigdy nie będę w stanie zaimplementować czegoś w praktyce.
Jeśli dobrze to rozumiem, filtry Gaussa są splecione z obrazem w celu redukcji szumów, ponieważ obliczają średnią ważoną sąsiedztwa piksela i są bardzo przydatne w wykrywaniu krawędzi, ponieważ można zastosować rozmycie i uzyskać obraz jednocześnie po prostu splecione z pochodną funkcji Gaussa.
Ale czy ktoś może mi wyjaśnić lub podać odniesienia do sposobu ich obliczania?
Np . Wykrywacz krawędzi Canny'ego mówi o filtrze Gaussa 5x5, ale jak uzyskali te konkretne liczby? Jak przeszli od ciągłego splotu do mnożenia macierzy?
Odpowiedzi:
Aby ta operacja zadziałała, musisz sobie wyobrazić, że twój obraz jest przekształcany jako wektor. Następnie wektor ten jest mnożony po lewej stronie przez macierz splotu w celu uzyskania zamazanego obrazu. Zauważ, że wynikiem jest również wektor tego samego rozmiaru co dane wejściowe, tj. Obraz o tym samym rozmiarze.
Każdy rząd macierzy splotu odpowiada jednemu pikselowi na obrazie wejściowym. Zawiera wagę wkładu wszystkich innych pikseli w obrazie do rozmytego odpowiednika rozpatrywanego piksela.
Weźmy przykład: rozmycie pola wielkości3 × 3 piksele na obrazie wielkości 6 × 6 piksele. Przekształcony obraz to kolumna 36 wybranych, a matryca rozmycia ma rozmiar36 × 36 .
Wizualną ilustrację ściśle powiązanego procesu (splot + odejmowanie) można znaleźć w tym poście na blogu (z mojego osobistego bloga).
źródło
W przypadku aplikacji do obrazów lub sieci splotowych, w celu bardziej wydajnego wykorzystania mnożników macierzy we współczesnych procesorach graficznych, dane wejściowe są zwykle przekształcane w kolumny macierzy aktywacji, które można następnie zwielokrotnić za pomocą wielu filtrów / jąder jednocześnie.
Sprawdź ten link w CS231n Stanforda i przewiń w dół do sekcji „Implementacja jako mnożenie macierzy”, aby uzyskać szczegółowe informacje.
Proces ten polega na pobraniu wszystkich lokalnych poprawek na obrazie wejściowym lub mapie aktywacji, które zostałyby pomnożone przez jądro, i rozciągnięciu ich do kolumny nowej macierzy X za pomocą operacji zwanej im2col. Jądra są również rozciągane, aby zapełnić rzędy macierzy wagowej W, aby podczas wykonywania operacji macierzowej W * X uzyskana macierz Y miała wszystkie wyniki splotu. Na koniec macierz Y należy ponownie przekształcić, przekształcając kolumny z powrotem w obrazy za pomocą operacji zwykle zwanej cal2im.
źródło
Konwolucja w dziedzinie czasu równa się mnożeniu macierzy w dziedzinie częstotliwości i odwrotnie.
Filtrowanie jest równoważne splotowi w dziedzinie czasu, a zatem zwielokrotnieniu macierzy w dziedzinie częstotliwości.
Jeśli chodzi o mapy lub maski 5x5, pochodzą one od dyskrecji operatorów canny / sobel.
źródło
Napisałem funkcję, która rozwiązuje to w moim StackOverflow Q2080835 GitHub Repository (spójrz na
CreateImageConvMtx()
).Właściwie funkcja może obsługiwać dowolny kształt splot, który chcesz -
full
,same
ivalid
.Kod jest następujący:
Stworzyłem również funkcję do tworzenia matrycy do filtrowania obrazów (podobne pomysły do MATLAB
imfilter()
):Kod został sprawdzony pod kątem MATLAB
imfilter()
.Pełny kod jest dostępny w moim repozytorium GitHub StackOverflow Q2080835 .
źródło