Android OpenCV(五十二):Harris角点检测

这是我参与更文挑战的第 23 天,活动详情查看: 更文挑战

什么是角点?

角点就是极值点,即在某方面属性特别突出的点。当然,你可以自己定义角点的属性(设置特定熵值进行角点检测)。角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点。角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界。常见的角点有:

  • 灰度梯度的最大值对应的像素点;
  • 两条直线或者曲线的交点;
  • 一阶梯度的导数最大值和梯度方向变化率最大的像素点;
  • 一阶导数最大,二阶导数为零的像素点(指示物体边缘变化不连续的方向)。

为什么要检测角点?

角点是图像很重要的特征,对图像图形的理解和分析有很重要的作用。角点在保留图像图形重要特征的同时,可以有效地减少信息的数据量,使其信息的含量很高,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。角点在三维场景重建、运动估计、目标跟踪、目标识别、图像配准与匹配等计算机视觉领域起着非常重要的作用。

Harris角点检测

人眼对角点的识别通常是在一个局部的小区域或小窗口完成的。如果在各个方向上移动这个特征的小窗口,窗口内区域的灰度发生了较大的变化,那么就认为在窗口内遇到了角点。如果这个特定的窗口在图像各个方向上移动时,窗口内图像的灰度没有发生变化,那么窗口内就不存在角点;如果窗口在某一个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么,窗口内的图像可能就是一条直线的线段。

基本原理

Harris角点检测原理用公式演算如下:

E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2=x,yw(x,y)[I(x,y)+Ixu+Iyv+O(u2,v2)I(x,y)]2x,yw(x,y)[Ixu+Iyv]2=x,yw(x,y)[u2Ix2+2uvIxIy+v2Iy2]=x,yw(x,y)[uv][Ix2IxIyIxIyIy2][uv]=[uv](x,yw(x,y)[Ix2IxIyIxIyIy2])[uv]E(u,v)= \sum_{x,y}w(x,y)[I(x+u,y+v)-I(x,y)]^2 \\ =\sum_{x,y}w(x,y)[I(x,y)+I_xu+I_yv+O(u^2,v^2)-I(x,y)]^2 \\ \approx\sum_{x,y}w(x,y)[I_xu+I_yv]^2 \\ =\sum_{x,y}w(x,y)[u^2I_x^2+2uvI_xI_y+v^2I_y^2]\\ =\sum_{x,y}w(x,y)\begin{bmatrix}u & v\end{bmatrix}\begin{bmatrix} I_x^2 & I_xIy \\ I_xI_y & I_y^2\end{bmatrix}\begin{bmatrix}u \\ v\end{bmatrix}\\ =\begin{bmatrix}u & v\end{bmatrix}(\sum_{x,y}w(x,y)\begin{bmatrix} I_x^2 & I_xIy \\ I_xI_y & I_y^2\end{bmatrix})\begin{bmatrix}u \\ v\end{bmatrix}

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享