piątek, 16 września 2016

Wykrywanie krawędzi i narożników - Image Features Detection

W przetwarzaniu obrazów jednymi z najważniejszych elmentów z jakimi należy się zapoznać jest detekcja cech charakterystycznych obrazów (ang. image features detection). Cechami charakterystycznymi możemy nazwać wszelkiego rodzaju fragmenty obrazu, które mogą być w jakiś sposób przydatne w dalszej obróbce (detekcji obiektów, twarzy, znaków, itp). Przykładem takich cech mogą być na przykład krawędzie, narożniki lub BLOB'y.


Niestety (lub stety) nie istnieje jedna uniwersalna definicja pozwalająca wyróżnić cechy obrazów. Wszystko zależy od pożądanych zastosowań i używanych algorytmów. Cecha może być zarówno widoczna dla człowieka gołym okiem jak i stanowić wynik obliczeń różnych funkcji matematycznych na danych graficznych, które nie są w oczywisty sposób widoczne na obrazie.

W MATLAB'ie do dyspozycji mamy szereg funkcji umożliwiających nam łatwe wykrywanie danych cech. Przyjrzyjmy się im z bliska.

WYKRYWANIE KRAWĘDZI
Krawędzie są jednym z najbardziej elementarnych obiektów, które możemy wyróżnić na obrazie. Koncepcja krawędzi to nic innego, jak ścieżka podążająca wzdłuż linii dużej, ostrej zmiany intesywności kolorów na obrazie. Krawędzie stanowią bazę do wyznaczania innych cech obrazów, na przykład narożników.
Istnieje wiele algorytmów ich wyznaczania, te najbardziej znane to:

Metoda Canny'ego: wyznacza krawędzie przeszukując obraz w poszukiwaniu maksimów lokalnych gradientów wokół pikseli, krawędź uznaje się za znalezioną, gdy gradient osiągnie odpowiednią wartość. Czułość algorytmu można dostroić za pomocą dwóch progów - górnego i dolnego. Dzięki temu algorytm jest odporny na szumy i błędne wykrycia krawędzi.

Operator Sobel'a i Operator Prewitt'a to operatory dyskretnego różniczkowania, który wyznacza pochodne kierunkowe intensywności obrazu w ośmiu kierunkach co 45°. Polegają na obliczeniu dyskretnego splotu macierzy obrazu z macierzami 3x3 charakterystycznymi dla danego kierunku. Obie metody są do siebie podobne, jednak różnią się czułością.
img=imread('obraz.jpg');
img_gray=rgb2gray(img);

edges_canny=edge(img_gray,'Canny');  %CANNY
edges_sobel=edge(img_gray,'Sobel');  %SOBEL
edges_prewitt=edge(img_gray,'Prewitt');  %PREWITT


subplot(2,2,1); imshow(img_gray); title('Oryginalny obraz');
subplot(2,2,2); imshow(edges_canny); title('Canny');
subplot(2,2,3); imshow(edges_sobel); title('Sobel');
subplot(2,2,4); imshow(edges_prewitt); title('Prewitt');
W wyniku działania powyższego kodu otrzymujemy różną dokładność wykrycia krawędzi w zadanym obrazie:


WYKRYWANIE NAROŻNIKÓW

Kolejnym ważnym elementem są narożniki, które możemy rozumieć na przykład jako przecięcie dwóch krawędzi. Popularnymi metodami wykrywającymi krawędzie są: FAST, algorytm Harris&Stephens, algorytm Shi-Tomasi.

FAST (ang. Features From Accelerated Segment Test) jest algorytmem po raz pierwszy zaprezentowanym w 2006 roku przez Edwarda Rostena oraz Toma Drummond. Największą jego zaletą jest wysoka wydajność obliczeniowa, adekwatnie do swojej nazwy jest on bardzo szybkim algorytmem zalecanym i często wykorzystywanym w systemach czasu rzeczywistego.

Algorytm Harris'a i Stephens'a jest zaliczany do metod gradientowych. Zakłada, że dla każdego piksela obliczana jest macierz kowariancji gradientu. Punkt narożny jest wyznaczony przez wybór lokalnych maksimów.

Algorytm Shi-Tomasi jest udoskonalonym algorytmem Harris'a i Stephensa. Złożoność obliczeniowa jest zbliżona, jednak Shi-Tomashi wykrywa najwięcej wierzchołków z wymienionych tu algorytmów. 
img=imread('obraz.jpg');        % wczytuję plik z obrazem
img_gray=rgb2gray(img);         % konwertuję obraz do skali szarości

% ALGORYTM FAST
corners_fast=detectFASTFeatures(img_gray);
% ALGORYTM HARRIS&STEPHENS
corners_harris=detectHarrisFeatures(img_gray);
% ALGORYTM SHI&TOMASI
corners_minEigen=detectMinEigenFeatures(img_gray);

subplot(2,2,1); subimage(img_gray); title('Oryginalny obraz');
subplot(2,2,2); subimage(img_gray); hold on;
title('FAST'); plot(corners_fast); hold off;
subplot(2,2,3); subimage(img_gray); hold on;
title('HARRIS'); plot(corners_harris); hold off;
subplot(2,2,4); subimage(img_gray); hold on;
title('Min. eigen'); plot(corners_minEigen); hold off;
efektem wykonania powyższego kodu jest seria obrazów prezentująca kolejne algorytmy wykrywania krawędzi:


Wykrywanie krawędzi i narożników w obrazach to ledwie początek przygody z przetwarzaniem obrazów. W kolejnych wpisach pokażę kolejne metody wykrywania cech w obrazach, a także bardziej złożone zastosowania computer vision.

Brak komentarzy:

Prześlij komentarz