-
Notifications
You must be signed in to change notification settings - Fork 1
/
cornerHarris.m
64 lines (42 loc) · 1.39 KB
/
cornerHarris.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
function [featureX, featureY, R] = cornerHarris(im, wind, sigma, threshold, k)
% cornerHarris is the Harris
% проверка на то, что ядро с нечетной размерностью
if ~mod(wind, 2)
wind = wind + 1;
end
% переводим изображение в серое
dim = ndims(im);
if( dim == 3 )
I = rgb2gray(im);
else
I = im;
end
% переводим изображение в double
I = double(I);
% Удаляем шум из изображения
sI = filterGaussian(I, sigma, wind);
% Берем производные изображения по Х и по У
[Ix, Iy] = gradient(sI);
%derivative_X = [1, 2, 1, 0, 0, 0, -1, -2, -1];
%derivative_Y = [-1, 0, 1, -2, 0, 2, -1, 0, 1];
%Ix = conv2(I, derivative_X);
%Iy = conv2(I, derivative_Y);
%Ix = Ix .^ 2;
%Iy = Iy .^ 2;
% Элементы искомой матрицы М
Ix2 = Ix .^ 2;
Iy2 = Iy .^ 2;
Ixy = Ix .* Iy;
% Сглаживаем элементы матрицы
Sx2 = filterGaussian(Ix2, sigma, wind);
Sy2 = filterGaussian(Iy2, sigma, wind);
Sxy = filterGaussian(Ixy, sigma, wind);
% Вычисляем функцию отклика угла
R = (Sx2 .* Sy2 - Sxy .^ 2) - k * (Sx2 + Sy2) .^ 2;
% Отсекам по порогу те значения, которые ниже
R2 = (R > threshold);
% Находим точки, которые посчитались, как угловые
temp = imdilate(R, [1 1 1; 1 0 1; 1 1 1]);
R2 = R2 & (R > temp);
[featureX, featureY] = find(R2);
end