Harris角点检测 及 Matlab实验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zaishuiyifangxym/article/details/89515923

目录

1 基础知识

1.1 图像变化的类型

1.2 提取点特征的作用

1.3 什么是好的角点检测算法?

2 Harris 角点检测

2.1 Harris角点检测基本思想

2.2 Harris角点检测:数学描述

3 总结

4 Matlab 实验

参考资料


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

 

1 基础知识

1.1 图像变化的类型

 

1.2 提取点特征的作用

图像的点特征是许多计算机视觉算法的基础:使用特征点来代表图像的内容,在运动目标跟踪、物体识别、图像配准、全景图像拼接 和 三维重建 等方向有较多的用处。

有一类重要的点特征:角点(corner points)

角点(corner points):局部窗口沿各方向移动,均产生明显变化的点,图像局部曲率突变的点

典型的角点检测算法:Harris角点检测 , CSS角点检测等。下图展示的是不同学者提出的角点检测算法。

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

1.3 什么是好的角点检测算法?

(1)检测出图像中“真实的”角点;

(2)准确的定位性能;

(3)很高的重复检测率(稳定性好);

(4)具有对噪声的鲁棒性;

(5)具有较高的计算效率。

 

Harris 角点检测

1988年,Harris提出角点检测的方法效果较好。从谷歌学术来看,引用已达到1万6千多次,佩服佩服。

2.1 Harris角点检测基本思想

基本思想:从图像局部的小窗口观察图像特征。

角点定义:窗口向任意方向的移动都导致图像灰度的明显变化。

2.2 Harris角点检测:数学描述

将图像窗口平移 [u,v] 产生灰度变化 E(u,v)

                                                            E(u,v) = \sum\limits_{x,y} {w(x,y){{\left[ {I(x + u,y + v) - I(x,y)} \right]}^2}}

由:I(x + u,y + v) = I(x,y) + {I_x}u + {I_y}v + O({u^2},{v^2})

得到:

                                                           E(u,v) = \sum\limits_{x,y} {w(x,y){{\left[ {{I_x}u + {I_y}v + O({u^2},{v^2})} \right]}^2}}

                                                             {\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]

于是对于局部微小的移动量 [u,v] ,可以近似得到下面的表达:

                                                                           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]

其中,M2 \times 2 矩阵,可由图像的导数求得:

                                                                    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]}

窗口移动导致的图像变化:实对称矩阵M的特征值分析

                                                                        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]

其中,M的特征值{\lambda _{\max }},{\rm{ }}{\lambda _{\min }} 。

定义角点响应函数R

                                                                           R = \det M - k{\left[ {{\mathop{\rm trace}\nolimits} (M)} \right]^2}

其中,\det M = {\lambda _1}{\lambda _2}{\text{ , trace (}}M) = {\lambda _1} + {\lambda _2} 。

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

 

3 总结

上面是Harris角点检测的数学推导,通过查阅相关文献,对Harris角点检测的推导过程进行整理,其简要步骤如下:

Harris角点检测器分为三步:梯度计算矩阵形成 特征值计算。首先,计算 x 和 y 方向上的平滑 (使用高斯函数) 梯度来检测给定灰度图像 I(x,y) 中的角点,由下面的式子给出:

                                                                           {g_x}(x,y) = \frac{{ - x}}{{2\pi \tau _g^4}}\exp \left( { - \frac{{{x^2} + {y^2}}}{{2\tau _g^2}}} \right)

                                                                           {g_y}(x,y) = \frac{{ - y}}{{2\pi \tau _g^4}}\exp \left( { - \frac{{{x^2} + {y^2}}}{{2\tau _g^2}}} \right)

其中,{\tau _g} 是平滑参数。

计算图像I(x,y) 的平滑梯度为:

                                                                               {I_x} = {g_x}(x,y) \otimes I(x,y)

                                                                              {I_y} = {g_y}(x,y) \otimes I(x,y)

其中,“ \otimes ” 表示二维卷积运算。

Harris角点检测器依赖于计算一个矩阵(与自相关函数有关),由下面的式子给出:

                                                                              A(x,y) = \left( {\begin{array}{*{20}{c}} {{a_{xx}}}&{{a_{xy}}}\\ {{a_{xy}}}&{{a_{yy}}} \end{array}} \right)

其中,

                                                                              {a_{xx}} = {\sum\limits_{{x_i} \in W} {\sum\limits_{{{\text{y}}_i} \in W} {[{I_x}({x_i},{y_i})]} } ^2}

                                                                              {a_{yy}} = {\sum\limits_{{x_i} \in W} {\sum\limits_{{{\text{y}}_i} \in W} {[{I_y}({x_i},{y_i})]} } ^2}

                                                                        {a_{xy}} = \sum\limits_{{x_i} \in W} {\sum\limits_{{{\text{y}}_i} \in W} {{I_x}({x_i},{y_i})} } {I_y}({x_i},{y_i})

从上面的式子可以看出,{a_{xx}},{a_{yy}} 和 {a_{xy}} 表示平均梯度幅值,矩阵A 的特征值提供关于给定位置的边缘的信息。如果给定位置的矩阵的特征值都很大,那么大部分区域均为角点。Harris通过计算响应函数可以避免精确的特征值计算,由下面的式子给出:

                                                                               R = \det A - k{\left[ {{\mathop{\rm trace}\nolimits} (A)} \right]^2}

其中,\det A = {\lambda _1}{\lambda _2}{\text{ , trace (}}A) = {\lambda _1} + {\lambda _2} , k是可调参数,一般设置在区间 [0.04, 0.06] 内。通过判定 R 大小来判断像素点是否为角点,对于角点\left| R \right| 的值很;而平坦的区域\left| R \right| 的值很

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/78930239

参考资料

[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/u010703122/article/details/49308153

[4] https://blog.csdn.net/woxincd/article/details/60754658

[5] https://blog.csdn.net/linqianbi/article/details/78930239

猜你喜欢

转载自blog.csdn.net/zaishuiyifangxym/article/details/89515923