harris角點檢測計算詳細步驟
阿新 • • 發佈:2019-01-07
說明
某人說,演算法看不懂,公式不明白,舉個栗子咯,能看到具體數值的那種。
好吧,舉個最簡單的角點檢測演算法吧。以下程式碼為matlab。
步驟
一、生成影象
構造一個棋盤影象作為測試影象,並且為了使資料在可見範圍內,只生成單格5個畫素共2x2大小的棋盤格
image = checkerboard(5,1,1);
imshow(image);
看看image是什麼:
對應10x10的資料,不要問為什麼不是0~255。。。。
二、梯度
xg=imfilter(image,[-1 0 1], 'replicate','same','conv');
xg=xg(2 :end-1,2:end-1);
yg=imfilter(image,[-1 0 1]','replicate','same','conv');
yg=yg(2:end-1, 2:end-1);
要丟掉影象邊界的值。在兩個方向上與(-1 0 1)卷積(反轉平移乘積求和)。
對應兩個數值表如下,灰度是要截斷的資料:
x方向梯度
y方向
是不是出現了兩個方向的邊緣線出來了。這就是為什麼各大邊緣演算法都是基於梯度。
三、計算A、B、C
c=xg.*yg;
a=xg.*xg;
b=yg.*yg;
分別是什麼呢,看下圖。
c
a
b
四、濾波
filter_coef = [0.120078384243213 ;0.233880756585350;0.292081718342872;0.233880756585350;0.120078384243213;];
filter_coef = filter_coef(:);
w = filter_coef * filter_coef';
% filter A, B, and C
a = imfilter(a,w,'replicate','full','conv');
b = imfilter(b,w,'replicate','full','conv');
c = imfilter(c,w,'replicate','full','conv');
% clip to image size
removed = (numel(filter_coef)-1) / 2 - 1;
a = a(removed+1:end-removed,removed+1:end-removed);
b = b(removed+1:end-removed,removed+1:end-removed);
c = c(removed+1:end-removed,removed+1:end-removed);
濾波的主觀感受就是眼睛對感興趣區特別清晰,而背景虛化。類似於單反效果給人的感覺。
a濾波後
b濾波後
c濾波後
資料一下變得又長又黑。。。。。
五、特徵值計算
sensitivity_factor = 0.04;
% 'Harris'
cMetric = (a .* b) - (c .^ 2) - sensitivity_factor * ( a + b ) .^ 2;
對應數值如下:
好,特徵值出來了,那就完成了。自己數橫座標6,縱座標5。打完收工。
六、最小值抑制
還是用程式碼數吧,人眼已瞎。
quality_level = 0.01;
BW = imregionalmax(cMetric,8);
max_cmetric = max(cMetric(:));
min_metric = quality_level * max_cmetric;
BW(cMetric < min_metric) = false;
BW = bwmorph(BW,'shrink',Inf); %n = Inf時,將目標縮成一個點。沒有孔洞的目標縮成一個點,有孔洞的目標縮成一個連通環。
ind = find(BW);
[~,sorted_ind] = sort(cMetric(ind),'descend');
[r,c] = ind2sub(size(BW),ind(sorted_ind));
xpeak = c;
ypeak = r;
corners = [xpeak, ypeak];
plot(corners(:,1), corners(:,2), '.', 'Color', 'g')
這裡數值不貼了,沒意思。主要是去掉了值小的點, imregionalmax這個是用來判斷是否為8臨點最大值。
最後打點顯示結果,影象是放大了效果,看起來偏離了中心,下面一張是實際大小。