Canny

Z Wikipedii, wolnej encyklopedii
Skocz do: nawigacji, wyszukiwania

Canny – metoda detekcji krawędzi występujących w obrazie. Opracowana została ona przez Johna F. Canny w 1986 roku. Wykorzystuje wielostopniowy algorytm w celu detekcji wielu różnych krawędzi w obrazie. Najważniejszy jednak pozostaje fakt, że Canny przedstawił teorię obliczeniową wyjaśniającą zasadę działania tej metody.

Rozwój algorytmu Canny[edytuj | edytuj kod]

Celem metody Canny jest określenie optymalnego algorytmu detekcji. Słowo "optymalny" oznacza tu:

  • dobrą detekcję – algorytm powinien wykryć tak dużo krawędzi jak to tylko możliwe.
  • dobre umiejscowienie – oznaczona krawędź powinna być jak najbliżej rzeczywistej krawędzi na obrazie.
  • minimalną odpowiedź – konkretna krawędź powinna być oznaczona tylko raz, i jeśli tylko możliwe, zakłócenia (szum) w obrazie nie powinny tworzyć fałszywych krawędzi.

Aby spełnić powyższe wymagania Canny wykorzystał rachunek wariacyjny – technikę która wyszukuje funkcję, która optymalizuje dany funkcjonał. Optymalna funkcja w detektorze Canny'ego opisana jest przez sumę czterech wykładniczych warunków, ale może być przybliżona pierwszą pochodną funkcji Gaussa.

Kroki algorytmu Canny'ego[edytuj | edytuj kod]

Redukcja szumu[edytuj | edytuj kod]

Detektor krawędzi Canny'ego wykorzystuje filtr bazujący na pierwszej pochodnej funkcji Gaussa, ponieważ jest czuły na obecność szumu w surowym nieobrobionym obrazie. Więc, aby zacząć, należy dokonać splotu obrazu z filtrem Gaussa. Efektem tego działania jest lekko rozmazany obraz, który nie jest dotknięty pojedynczymi zakłóceniami w żaden znaczący sposób.

Poniżej mamy przykład filtru Gaussa 5x5, wykorzystywanego do obróbki obrazu z \sigma = 1.4:


\mathbf{B} = \frac{1}{159} \begin{bmatrix}
2 & 4 & 5 & 4 & 2 \\
4 & 9 & 12 & 9 & 4 \\
5 & 12 & 15 & 12 & 5 \\
4 & 9 & 12 & 9 & 4 \\
2 & 4 & 5 & 4 & 2
\end{bmatrix} * \mathbf{A}

Szukanie natężenia gradientu obrazu[edytuj | edytuj kod]

Krawędź na obrazie może być skierowana w różnych kierunkach. Algorytm Canny'ego wykorzystuje więc cztery filtry do detekcji poziomych, pionowych oraz przekątnych krawędzi na wygładzonym obrazie. Operatory detekcji krawędzi (np. Krzyż Robertsa , Prewitt, Sobel) zwracają wartości pierwszej pochodnej dla kierunku poziomego (Gy) i kierunku pionowego (Gx). Nachylenie (gradient, szybkość narastania) krawędzi oraz jej kierunek mogą być określony na podstawie poniższych wzorów:

\mathbf{G} = \sqrt{ {\mathbf{G}_x}^2 + {\mathbf{G}_y}^2 }
\qquad \qquad
\mathbf{\Theta} = \operatorname{arctan}\left({ \mathbf{G}_y \over \mathbf{G}_x }\right)

Kąt detekcji krawędzi zaokrąglony jest do czterech przypadków reprezentujących pion, poziom oraz dwóch przekątnych (np. 0, 45, 90 i 135 stopni)

Usuwanie niemaksymalnych pikseli[edytuj | edytuj kod]

Trzeci etap obejmuje "pocienianie" krawędzi w sposób zapewniający ich ciągłość. Efektem jest ciągła linia złożona z pojedynczych pikseli.

Progowanie z histerezą[edytuj | edytuj kod]

Ostatni etap – progowanie ma na celu usunięcie nieistotnych krawędzi, które mają nachylenie (stromość) poniżej ustawionego progu. Progowanie z histerezą powoduje, że do już wykrytych krawędzi są dołączane następne piksele mimo spadku nachylenia, aż do osiągnięcia dolnego progu wykrywania. Takie postępowanie zpobiega dzieleniu krawędzi w miejcach słabszego kontrastu.

Podsumowanie[edytuj | edytuj kod]

Algorytm Canny'ego można wykorzystać w wielu różnych środowiskach. Jego parametry pozwalają na takie ich modyfikacje, aby dostosować go do rozpoznawania krawędzi o różnych cechach, w zależności od aktualnych oczekiwań. Oryginalna praca Canny'ego, pochodne optymalnych filtrów prowadziła do Filtr o skończonej odpowiedzi impulsowej.

Bibliografia[edytuj | edytuj kod]

  • Canny, J., A Computational Approach To Edge Detection, IEEE Trans. Pattern Analysis and Machine Intelligence, 8:679-714 (1986).
  • R. Deriche: Using Canny's criteria to derive a recursively implemented optimal edge detector. The International Journal of Computer Vision, 1(2):167-187, May 1987..

Linki zewnętrzne[edytuj | edytuj kod]