-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathharris_corner.m
104 lines (88 loc) · 2.59 KB
/
harris_corner.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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
function harris_corner(im)
%harris_corner -- This function determines corners in an image
% Gaussian mask [1 -1] with prewit operator
mx = [-1 0 1
-1 0 1
-1 0 1];
my = [1 1 1
0 0 0
-1 -1 -1];
edgex_im = filter2(mx,im); %Correlate
edgey_im = filter2(my,im); %Correlate
mag_im = edgex_im.*edgey_im;
%Display edge detection images
figure();
imshow(edgex_im,[]);
title('Edge Detection: X-Direction');
figure();
imshow(edgey_im,[]);
title('Edge Detection: Y-Direction');
%Gaussian Filter
G = fspecial('gaussian',[5 5],2);
edgex_im = filter2(G,edgex_im.^2);
edgey_im = filter2(G,edgey_im.^2);
mag_im = filter2(G,mag_im);
figure();
imshow(mag_im,[]);
title('Edge Magnitude');
%Alocate space
result = zeros(size(im,1),size(im,2));
R = zeros(size(im,1),size(im,2));
%Apply corner operation
for ii = 1:size(im,1)
for jj = 1:size(im,2)
M = [edgex_im(ii,jj) mag_im(ii,jj);mag_im(ii,jj) edgey_im(ii,jj)];
co(ii,jj) = det(M)-0.05*(trace(M))^2;
end
end
figure();
imshow(co);
title('Corner Output');
co_max = max(max(co));
Thresh = 0.1*co_max; %Compute threshold Note: found manually
%Put positions of corners
for ii = 2:size(im,1)-1
for jj = 2:size(im,2)-1
if co(ii,jj) > Thresh
%Only grab 1 of the pixels detected
if co(ii,jj) > co(ii-1,jj-1) && co(ii,jj) > co(ii-1,jj) && co(ii,jj) > co(ii-1,jj+1) && co(ii,jj) > co(ii,jj-1) && co(ii,jj) > co(ii,jj+1) && co(ii,jj) > co(ii+1,jj-1) && co(ii,jj) > co(ii+1,jj) && co(ii,jj) > co(ii+1,jj+1)
result(ii,jj) = 1;
end
end
end
end
[c,r] = find(result == 1);
%Ignore the beginning and end rows
c(10) = [];
c(9) = [];
c(2) = [];
c(1) = [];
r(10) = [];
r(9) = [];
r(2) = [];
r(1) = [];
figure();
imshow(im);
hold on;
plot(r,c,'r.');
title('Corners Detected');
disp(r);
disp(c);
%Remove outside corners
r(6) = [];
r(3) = [];
r(1) = [];
c(6) = [];
c(3) = [];
c(1) = [];
for ii = 1:3
rr(ii,1) = round(r(ii)*cosd(10) + c(ii)*sind(10)) - 40;
cc(ii,2) = round(c(ii)*cosd(10) - r(ii)*sind(10)) + 50;
end
im_triangle_rotate = imread('rotatetriangle.jpg');
figure();
imshow(im_triangle_rotate);
hold on;
plot(rr,cc,'r.');
title('Corners Detected (Rotation)');
end