
目录
角点是图像重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配和实时处理。下面将介绍Harris角点检测 及 Matlab实验。
1 基础知识
1.1 图像变化的类型

1.2 提取点特征的作用
图像的点特征是许多计算机视觉算法的基础:使用特征点来代表图像的内容,在运动目标跟踪、物体识别、图像配准、全景图像拼接 和 三维重建 等方向有较多的用处。
有一类重要的点特征:角点(corner points)
角点(corner points):局部窗口沿各方向移动,均产生明显变化的点,图像局部曲率突变的点
典型的角点检测算法:Harris角点检测 , CSS角点检测等。下图展示的是不同学者提出的角点检测算法。

下图为不同类型的角点,那么,怎么才算的好的角点检测算法呢?下面将慢慢介绍。

1.3 什么是好的角点检测算法?
(1)检测出图像中“真实的”角点;
(2)准确的定位性能;
(3)很高的重复检测率(稳定性好);
(4)具有对噪声的鲁棒性;
(5)具有较高的计算效率。
2 Harris 角点检测
1988年,Harris提出角点检测的方法效果较好。从谷歌学术来看,引用已达到1万6千多次,佩服佩服。

2.1 Harris角点检测基本思想
基本思想:从图像局部的小窗口观察图像特征。
角点定义:窗口向任意方向的移动都导致图像灰度的明显变化。


2.2 Harris角点检测:数学描述
将图像窗口平移
产生灰度变化 
![E(u,v) = \sum\limits_{x,y} {w(x,y){{\left[ {I(x + u,y + v) - I(x,y)} \right]}^2}}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
由:
得到:
![E(u,v) = \sum\limits_{x,y} {w(x,y){{\left[ {{I_x}u + {I_y}v + O({u^2},{v^2})} \right]}^2}}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
![{\left[ {{I_x}u + {I_y}v} \right]^2} = [u,v]\left[ {\begin{array}{*{20}{c}} {I_x^2}&{{I_x}{I_y}}\\ {{I_x}{I_y}}&{I_y^2} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
于是对于局部微小的移动量
,可以近似得到下面的表达:
![E(u,v) \cong \left[ {u,} \right.\left. v \right]\begin{array}{*{20}{c}} {} \end{array}M\begin{array}{*{20}{c}} {} \end{array}\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
其中,
是
矩阵,可由图像的导数求得:
![M = \sum\limits_{x,y} {w(x,y)\left[ {\begin{array}{*{20}{c}} {I_x^2}&{{I_x}{I_y}}\\ {{I_x}{I_y}}&{I_y^2} \end{array}} \right]}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
窗口移动导致的图像变化:实对称矩阵
的特征值分析
![E(u,v) \cong \left[ {u,} \right.\left. v \right]\begin{array}{*{20}{c}} {} \end{array}M\begin{array}{*{20}{c}} {} \end{array}\left[ {\begin{array}{*{20}{c}} u\\ v \end{array}} \right]](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
其中,
的特征值
。


定义角点响应函数:
![R = \det M - k{\left[ {{\mathop{\rm trace}\nolimits} (M)} \right]^2}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
其中,
。

Harris角点检测结果如下图所示:

3 总结
上面是Harris角点检测的数学推导,通过查阅相关文献,对Harris角点检测的推导过程进行整理,其简要步骤如下:
Harris角点检测器分为三步:梯度计算,矩阵形成 和 特征值计算。首先,计算
和
方向上的平滑 (使用高斯函数) 梯度来检测给定灰度图像
中的角点,由下面的式子给出:


其中,
是平滑参数。
计算图像
的平滑梯度为:


其中,“
” 表示二维卷积运算。
Harris角点检测器依赖于计算一个矩阵(与自相关函数有关),由下面的式子给出:

其中,
![{a_{xx}} = {\sum\limits_{{x_i} \in W} {\sum\limits_{{{\text{y}}_i} \in W} {[{I_x}({x_i},{y_i})]} } ^2}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
![{a_{yy}} = {\sum\limits_{{x_i} \in W} {\sum\limits_{{{\text{y}}_i} \in W} {[{I_y}({x_i},{y_i})]} } ^2}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)

从上面的式子可以看出,
和
表示平均梯度幅值,矩阵
的特征值提供关于给定位置的边缘的信息。如果给定位置的矩阵的特征值都很大,那么大部分区域均为角点。Harris通过计算响应函数可以避免精确的特征值计算,由下面的式子给出:
![R = \det A - k{\left[ {{\mathop{\rm trace}\nolimits} (A)} \right]^2}](https://javaforall.net/wp-content/uploads/2020/11/2020110817443450.jpg)
其中,
,
是可调参数,一般设置在区间 [0.04, 0.06] 内。通过判定
大小来判断像素点是否为角点,对于角点,
的值很大;而平坦的区域,
的值很小。
4 Matlab 实验
Harris角点检测 Matlab 代码如下:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% Harris角点检测算法 Matlab code %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; clc ;tic; ori_im = imread('lena.tiff'); % 读取图像 if(size(ori_im,3)==3) ori_im = rgb2gray(uint8(ori_im)); %转为灰度图像 end % fx = [5 0 -5;8 0 -8;5 0 -5]; % 高斯函数一阶微分,x方向(用于改进的Harris角点提取算法) fx = [-2 -1 0 1 2]; % x方向梯度算子(用于Harris角点提取算法) Ix = filter2(fx,ori_im); % x方向滤波 % fy = [5 8 5;0 0 0;-5 -8 -5]; % 高斯函数一阶微分,y方向(用于改进的Harris角点提取算法) fy = [-2;-1;0;1;2]; % y方向梯度算子(用于Harris角点提取算法) Iy = filter2(fy,ori_im); % y方向滤波 Ix2 = Ix.^2; Iy2 = Iy.^2; Ixy = Ix.*Iy; clear Ix; clear Iy; h= fspecial('gaussian',[7 7],2); % 产生7*7的高斯窗函数,sigma=2 Ix2 = filter2(h,Ix2); Iy2 = filter2(h,Iy2); Ixy = filter2(h,Ixy); height = size(ori_im,1); width = size(ori_im,2); result = zeros(height,width); % 纪录角点位置,角点处值为1 R = zeros(height,width); for i = 1:height for j = 1:width M = [Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; % auto correlation matrix R(i,j) = det(M)-0.06*(trace(M))^2; end end cnt = 0; for i = 2:height-1 for j = 2:width-1 % 进行非极大抑制,窗口大小3*3 if R(i,j) > R(i-1,j-1) && R(i,j) > R(i-1,j) && R(i,j) > R(i-1,j+1) && R(i,j) > R(i,j-1) && R(i,j) > R(i,j+1) && R(i,j) > R(i+1,j-1) && R(i,j) > R(i+1,j) && R(i,j) > R(i+1,j+1) result(i,j) = 1; cnt = cnt+1; end end end Rsort=zeros(cnt,1); [posr, posc] = find(result == 1); for i=1:cnt Rsort(i)=R(posr(i),posc(i)); end [Rsort,ix]=sort(Rsort,1); Rsort=flipud(Rsort); ix=flipud(ix); ps=100; posr2=zeros(ps,1); posc2=zeros(ps,1); for i=1:ps posr2(i)=posr(ix(i)); posc2(i)=posc(ix(i)); end imshow(ori_im); hold on; plot(posc2,posr2,'g+'); toc;
运行结果如下图所示:

C++实验代码可参见:https://blog.csdn.net/linqianbi/article/details/
参考资料
[1] C.Harris, M.Stephens. “A Combined Corner and Edge Detector”. Proc. of 4th Alvey Vision Conference, 1988.
[2] Harris角点检测 PPT
[3] https://blog.csdn.net/u0/article/details/
[4] https://blog.csdn.net/woxincd/article/details/
[5] https://blog.csdn.net/linqianbi/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175757.html原文链接:https://javaforall.net
