summaryrefslogtreecommitdiffstats
path: root/SD-VBS/common/toolbox/ikkjin/harris.m
blob: 92a65437fbdd10b11581f2da074576156234b03c (plain) (blame)
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

% Sample code for detecting Harris corners, following 
% Brown et al, CVPR 2005
%        by Alyosha Efros, so probably buggy...
%        slightly modified by ikkjin

function [x,y,v] = harris(imrgb);
[nr nc nb]=size(imrgb);
if nb==3
    im=rgb2gray(imrgb);
else
    im=imrgb;
end

im = im2double(im);
g1 = fspecial('gaussian', 9,1);  % Gaussian with sigma_d 
g2 = fspecial('gaussian', 11,1.5); % Gaussian with sigma_i 
img1 = conv2(im,g1,'same');  % blur image with sigma_d
Ix = conv2(img1,[-1 0 1],'same');  % take x derivative 
Iy = conv2(img1,[-1;0;1],'same');  % take y derivative

% Compute elements of the Harris matrix H
%%% we can use blur instead of the summing window
Ix2 = conv2(Ix.*Ix,g2,'same');
Iy2 = conv2(Iy.*Iy,g2,'same');
IxIy = conv2(Ix.*Iy,g2,'same');
R = (Ix2.*Iy2 - IxIy.*IxIy) ... % det(H) 
    ./ (Ix2 + Iy2 + eps);       % trace(H) + epsilon

% don't want corners close to image border
R([1:15, end-16:end], :) = 0;
R(:,[1:15,end-16:end]) = 0;

% non-maxima supression within 3x3 windows
nonmax = inline('max(x)');
Rmax = colfilt(R,[3 3],'sliding',nonmax); % find neighbrhood max
Rnm = R.*(R == Rmax);  % supress non-max

% extract all interest points
[y,x,v] = find(Rnm);