【图像预处理】 Harris角点检测器原理及C++实现

在图像中,点的位置很多时候是很有用的。我们经常会在图像处理的过程中提取我们的兴趣点,而角点是很好的兴趣点。在解决许多实际问题时,使用角点特征的效果优于线(或者边缘)。这是因为观察一条移动直线时,只有其垂直于线段的运动分量能被观测到,而语线段共线的分量则不可见。角点则不同,他们提供唯一匹配。
Harris角点检测器是一种比较常用的检测器,它对二维平移和旋转、少量光照变化和视角变化具有鲁棒性,并且计算量很小。另外,该算法通过构造矩阵,利用矩阵的特征值来描述图像局部信息的思想是值得学习的。

原理

Harris角点检测考虑了灰度值平方差的和的差分。从一幅二维图像f中,选取一个图像块这里写图片描述, 平且平移这里写图片描述。则图像块W内,灰度值与其平移后的图像之差的平方和S为: 这里写图片描述 (1)
将平移后图像灰度值用一阶泰勒展开近似,有:这里写图片描述 (2),
此时,(1)式有解析解,将(2)式代入(1)式并化简,有以下公式:
这里写图片描述 (3)
式中AW矩阵表示图像区域W在点(x,y)处的二阶导数的一半。记A为两倍AW,称为Harris矩阵代表了图像的局部结构。
这里写图片描述 (4)

通常会使用一个各向同性的窗用A并用,常用高斯窗。由于高斯算子是线性算子,故可先对图像进行高斯平滑后,在计算A。A是一个半正定对称矩阵,其主要变换模式对应正交方向的偏微分,并由其两个特征值反映。有以下三种不同的情形:1. 两个特征值都很小,意味着水平与竖直方向的变换都很小,中心像素处于平坦区域,没有角点;2. 一个特征值很大,另一个很小,意味着图像位于边缘,垂直于边缘的运动方向,f的变化很大,而沿着边缘的方向变化很小。也认为不是角点;3.两个特征值都很大,意味着水平竖直方向的变化率都很快,任何方向稍有运动图像都会发生显著的变化,此时认为是角点。


算法实现过程

Harris提出了一种不用计算矩阵的特征值而可以得到局部特征信息的方法。通过构造一个响应函数:这里写图片描述 (5)
式中,kappa是可调参数,建议值在0.04~0.15。


  1. 对输入图像进行高斯滤波
  2. 遍历图像,计算每个像素的水平,竖直方向梯度的大小。使用近似于导数的差分核做两次卷积即可。
  3. 对每一像素设置一定半径的邻域,计算局部特征矩阵A(式4)以及响应函数(式5)。
  4. 为响应函数选取一个阈值,为了选择最佳的候选角点,使用非极大抑制方法。

代码C++

/
//输入图像数组 BYTE* m_pBitmap;
//宽×高:m_dwHeight * m_dwWidth;
//位深:8位灰度图像

实现过程中用到的函数:
高斯滤波

void ImgGaussSmooth(BYTE* pBitmap, int dwHeight, int dwWidth, float seta)
{
    double pi = 3.1415926;
    int i, j, m, n;
    int nHWndSize = (int)(3.0 * sqrt(2.0) * seta + 0.5) - 1;        // 模板半宽 
    int nWndSize  = (nHWndSize << 1) + 1;                       // 模板宽

    if( nHWndSize < 1 ) return
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡逸超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值