Harris角点检测

这篇具有很好参考价值的文章主要介绍了Harris角点检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

图像特征的分类:边缘、角点、纹理。
角点检测(准确来说角点不是特征,但检测出来的角点可以用来提取和表示总结为特征)也被称为特征点检测,Harris是基于角点的特征描述子,主要用于图像特征点的匹配,属于图像的局部特征。

  1. 在局部小范围里,如果在各个方向上移动窗口,窗口区域内的灰度发生较大变化,就认为在窗口内遇到了角点,如下图右边第三幅图所示。
  2. 在局部小范围里,如果窗口在某个方向移动时,窗口内图像的灰度发生了较大的变化,而在另一些方向上没有发生变化,那么就认为窗口内的图像可能就是边缘区域,如下图第二幅图所示。
    Harris角点检测
    下面我们描述下Harris角点检测的原理。
    对于局部区域来说,局部窗可以向四周移动。我们假设当前窗内的每个像素坐标为 ( x i , y j ) \left(x_i,y_j\right) (xi,yj),其中 ( x i , y j ) ∈ W \left(x_i,y_j\right)\in W (xi,yj)W,如果窗口为3x3大小,那么 i = 1 , 2 , 3 ; j = 1 , 2 , 3 i=1,2,3;j=1,2,3 i=1,2,3;j=1,2,3。当我们令窗偏移 ( u , v ) \left(u,v\right) (u,v)像素时,则我们定义差分平方的加权求和(SSD)为: E ( u , v ) = ∑ ( x i , y j ) ∈ W ω ( x i , y j ) [ I ( x i + u , y j + v ) − I ( x i , y j ) ] 2 E(u,v)=\displaystyle\sum_{(x_i,y_j)\in W} \omega(x_i,y_j)[I(x_i+u,y_j+v)-I(x_i,y_j)]^2 E(u,v)=(xi,yj)Wω(xi,yj)[I(xi+u,yj+v)I(xi,yj)]2
    其中 ω ( x i , y j ) , i = 1 , 2 , 3 ; j = 1 , 2 , 3 \omega(x_i,y_j),i=1,2,3;j=1,2,3 ω(xi,yj),i=1,2,3;j=1,2,3表示每个像素的权重,常用的权重核为高斯核,也可以设置全都是1。
    我们用图详细描述下上面的这个过程。
    取7x7图像局部区域如下:

Harris角点检测

在其中我们又取一个3x3的窗口(用绿色标出)。
上面的 ω ( x i , y j ) , i = 1 , 2 , 3 ; j = 1 , 2 , 3 \omega(x_i,y_j),i=1,2,3;j=1,2,3 ω(xi,yj),i=1,2,3;j=1,2,3可以理解为就是一个3x3的高斯核(RBF,径向基函数)。具体计算如下:
一维正态分布函数(也叫高斯函数),它的公式是: f ( x ) = 1 σ 2 π e − ( x − μ ) 2 / 2 σ 2 f(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-(x-\mu)^2/2\sigma^2} f(x)=σ2π 1e(xμ)2/2σ2
其中, μ \mu μ是x的均值, σ \sigma σ是x的方差,在计算平均值时,中心点就是原点,所以 μ = 0 \mu=0 μ=0
根据一维高斯函数,可以推导得到二维高斯函数: G ( x , y ) = 1 2 π σ 2 e − ( x 2 + y 2 ) / 2 σ 2 G(x,y)=\frac{1}{2\pi\sigma^2}e^{-(x^2+y^2)/2\sigma^2} G(x,y)=2πσ21e(x2+y2)/2σ2
通过这个函数,我们就可以计算高斯核中每一个像素点位置的权重。假定中心点坐标是(0,0),那么距离它最近的8个点坐标如下:
Harris角点检测
然后通过上面的二维高斯函数计算权重矩阵,公式中x和y已知, σ \sigma σ未知,所以需要设定 σ \sigma σ的值。这里假定 σ = 1.5 \sigma=1.5 σ=1.5,则权重矩阵如下:
Harris角点检测
这九个点的权重和等于0.47871,我们要计算的是每个像素点的加权平均,所以必须让它们的权重之和等于1,因此上面9个值还要分别除以0.47871,得到最终的权重矩阵 ω ( x , y ) \omega(x,y) ω(x,y)
Harris角点检测
再次观察 E ( u , v ) E(u,v) E(u,v)的公式,现在我们已经知道了 ω ( x i , y i ) \omega(x_i,y_i) ω(xi,yi),这里我们假设 u = 2 , v = 2 u=2,v=2 u=2,v=2,那么 [ I ( x i + u , y j + v ) − I ( x i , y j ) ] 2 [I(x_i+u,y_j+v)-I(x_i,y_j)]^2 [I(xi+u,yj+v)I(xi,yj)]2在图像局部区域中如下红色部分表示:
Harris角点检测
相当于将以前的窗口行和列都加2。
这时我们将 ω \omega ω中各点的权重和其红色区域中对应的像素点相乘然后相加就可以得到 E ( 2 , 2 ) E(2,2) E(2,2)的值。
我们的目标:就是研究找像素点,该像素无论在哪个方向上,SSD都会有很大的值。

数学推导

对SSD公式进行泰勒展开, o ( I ) o(I) o(I)表示高阶小项: I ( x + u , y + v ) = I ( x , y ) + ∂ I ∂ x u + ∂ I ∂ y v + o ( I ) I(x+u,y+v)=I(x,y)+\frac{\partial I}{\partial x}u+\frac{\partial I}{\partial y}v+o(I) I(x+u,y+v)=I(x,y)+xIu+yIv+o(I)
去掉高阶小项,令 I x = ∂ I ∂ x I_x=\frac{\partial I}{\partial x} Ix=xI I y = ∂ I ∂ y I_y=\frac{\partial I}{\partial y} Iy=yI,表示像素在x方向和y方向的梯度。可以近似为: I ( x + u , y + v ) ≈ I ( x , y ) + [ I x I y ] [ n k ] I(x+u,y+v)\approx I(x,y)+\lbrack I_x \quad I_y\rbrack{n\brack k} I(x+u,y+v)I(x,y)+[IxIy][kn]
这时SSD近似等于: E ( u , v ) ≈ ∑ ( x , y ) ∈ W ω ( x , y ) [ [ I x I y ] [ n k ] ] 2 E(u,v)\approx \displaystyle\sum_{(x,y)\in W}\omega(x,y)\lbrack \lbrack I_x \quad I_y\rbrack{n\brack k}\rbrack^2 E(u,v)(x,y)Wω(x,y)[[IxIy][kn]]2
因为:
[ [ I x I y ] [ n k ] ] 2 = [ u v ] [ I x 2 I x I y I y I x I y 2 ] [ u v ] \lbrack \lbrack I_x \quad I_y\rbrack{n\brack k}\rbrack^2=\lbrack u\quad v\rbrack \begin{bmatrix} I_x^2 & I_xI_y \\ I_yI_x & I_y^2 \end{bmatrix}{u\brack v} [[IxIy][kn]]2=[uv][Ix2IyIxIxIyIy2][vu]
我们发现 [ u v ] \lbrack u\quad v\rbrack [uv]是可以单独拿出来到 ∑ \displaystyle\sum 外面的,因此近似的SSD可以写为: E ( u , v ) ≈ [ u v ] ( ∑ ( x , y ) ∈ W ω ( x , y ) [ I x 2 I x I y I y I x I y 2 ] ) [ u v ] E(u,v)\approx \lbrack u \quad v\rbrack(\displaystyle\sum_{(x,y)\in W}\omega(x,y) \begin{bmatrix} I_x^2 & I_xI_y \\ I_yI_x & I_y^2 \end{bmatrix}){u\brack v} E(u,v)[uv]((x,y)Wω(x,y)[Ix2IyIxIxIyIy2])[vu]
我们将中间括号里面的部分称为自相关系数矩阵A。之后,对角点特征的分析就转换为了对自相关系数矩阵A的分析。
A = ∑ ( x , y ) ∈ W ω ( x , y ) [ I x 2 I x I y I y I x I y 2 ] A=\displaystyle\sum_{(x,y)\in W}\omega(x,y) \begin{bmatrix} I_x^2 & I_xI_y \\ I_yI_x & I_y^2 \end{bmatrix} A=(x,y)Wω(x,y)[Ix2IyIxIxIyIy2]
我们的目标:寻找像素点,该像素点无论在哪个方向上,SSD都会有很大的值。即对于角点, I x I_x Ix I y I_y Iy的变化范围都很大。对于平坦区域, I x I_x Ix I y I_y Iy的变化范围都很小。
我们分析 E ( u , v ) E(u,v) E(u,v)的形式可得, E ( u , v ) E(u,v) E(u,v) ( u , v ) (u,v) (u,v)而变化,其值紧和A有关,故我们需要研究A是否存在某种特性,使得 ( u , v ) (u,v) (u,v)在某个局部区域变化时, E ( u , v ) E(u,v) E(u,v)都能达到很大的值。
A进一步等于: A = [ A 1 , 1 A 1 , 2 A 2 , 1 A 2 , 2 ] A=\begin{bmatrix} A_{1,1} & A_{1,2} \\ A_{2,1} & A_{2,2} \end{bmatrix} A=[A1,1A2,1A1,2A2,2]
SSD化为二次型的标准型,其中 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2为特征向量:
E ( u , v ) = [ u v ] A [ u v ] = [ u ′ v ′ [ λ 1 0 0 λ 2 ] ] [ u ′ v ′ ] E(u,v)=\lbrack u \quad v\rbrack A{u\brack v}=\lbrack u' \quad v' \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}\rbrack {u'\brack v'} E(u,v)=[uv]A[vu]=[uv[λ100λ2]][vu]
E ( u , v ) E(u,v) E(u,v)为常数,得到该标准型的椭圆形式,其中二次方项的系数分别为 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2,因此得到椭圆的形状为(设较大的特征值为 λ m a x \lambda_{max} λmax,较小的特征值为 λ m i n \lambda_{min} λmin):
Harris角点检测
( u , v ) (u,v) (u,v)沿着 λ m a x \lambda_{max} λmax表示的方向变化时,可以用最快速度达到我们设定的 E ( u , v ) E(u,v) E(u,v)常数,当 ( u , v ) (u,v) (u,v)沿着 λ m i n \lambda_{min} λmin表示的方向变化时,会以最慢的速度达到我们设定的 E ( u , v ) E(u,v) E(u,v)常数。
现在我们恢复 E ( u , v ) E(u,v) E(u,v)的自由变化, E ( u , v ) E(u,v) E(u,v)的值是一个随着 u u u v v v变化时也在变化的值了。当两个 λ \lambda λ越大时, u u u v v v变大后 E ( u , v ) E(u,v) E(u,v)才会越大。因此我们希望 λ m i n \lambda_{min} λmin λ m a x \lambda_{max} λmax都要足够大才可以。

  1. 当特征值都很大时, I x I_x Ix I y I_y Iy在各个方向都能快速变到很大。我们可以想象出,图像在x方向和y方向整体变化都很大,因此这就是个角点。
  2. 当特征值一个很大一个很小时, I x I_x Ix I y I_y Iy只在某个方向能快速变到很大,我们可以想象出,图像仅在某个方向变化很大,因此这就是边缘区域。
  3. 当特征值都很小时,该局部区域里 I x I_x Ix I y I_y Iy都很小,因此这属于平坦区域,没有特征点。
    Harris角点检测
    使用特征值判断角点不是很方便,因此定义角点响应函数R: R = λ 1 λ 2 − k ( λ 1 + λ 2 ) 2 = d e t ( M ) − k ( t r a c e ( M ) ) 2 R=\lambda_1\lambda_2-k(\lambda_1+\lambda_2)^2=det(M)-k(trace(M))^2 R=λ1λ2k(λ1+λ2)2=det(M)k(trace(M))2
    det表示矩阵求行列式的值,trace表示矩阵的迹。 k k k一般取值(0.04-0.06)。
    Harris角点检测
    我们检测出来以后可以对所有角点的R响应进行排序,得到R值最大的n个角点作为特征点;以及对一个局部区域取R最大值作为角点。
    上面的计算过程中我们会计算图像的梯度,在实际运算中,图像梯度的计算经常会使用Sobel算子对一个局部区域3x3进行卷积。
    S o b l e x Soble_x Soblex S o b e l y Sobel_y Sobely分别是卷积核:
    S o b e l x = [ − 1 0 1 − 2 0 2 − 1 0 1 ] Sobel_x=\begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix} Sobelx= 121000121
    S o b e l y = [ 1 2 1 0 0 0 − 1 − 2 − 1 ] Sobel_y=\begin{bmatrix} 1 & 2 & 1 \\ 0 & 0 & 0 \\ -1 & -2 & -1 \end{bmatrix} Sobely= 101202101
    通过卷积操作,这样我们就可以得到 I x I_x Ix I y I_y Iy,之后再得到每个像素处的 I x 2 、 I y 2 、 I x I y I_x^2、I_y^2、I_xI_y Ix2Iy2IxIy,然后对这些图像进行高斯卷积。
    最后根据它们计算R响应值就行了。

程序代码

int main()
{
    cv::Mat src = cv::imread("triangle.png");
    cv::Mat gray;
    cv::cvtColor(src, gray, CV_BGR2GRAY);
    cv::Mat dst = cv::Mat::zeros(gray.size(), CV_32FC1);
    //角点检测代码
    cv::cornerHarris(gray, dst, 2, 3, 0.04, BORDER_DEFAULT);
    //将dst内的值归一化到(0-255)之间(浮点数)
    cv::normalize(dst, dst, 0, 255, NORM_MINMAX, CV_32FC1, cv::Mat());
    //上面得到的浮点数缩放为8位uchar类型
    cv::convertScaleAbs(dst, dst);
    cv::Mat result = src.clone();
    //角点检测结果
    for (int r = 0; r < result.rows; r++)
    {
        uchar * curRow = dst.ptr(r);
        for (int c = 0; c < result.cols; c++)
        {
            if ((int)*curRow > 150)
            {
                cv::circle(result, cv::Point(c, r), 10, cv::Scalar(0, 255, 0), 2, 1, 0);  
            }
            curRow++;
        }
    }
    cv::imshow("input", src);
    cv::imshow("output", result);
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}

结果展示:
Harris角点检测

void cv::cornerHarris	(InputArray 	src,
						 OutputArray 	dst,
						 int 	blockSize,
						 int 	ksize,
						 double 	k,
						 int 	borderType = BORDER_DEFAULT 
)	

src:单通道的八位或者浮点型图像
dst:存储harris检测结果的图像,大小和src一样,类型位CV_32FC1
blockSize:邻域的大小。也就是上文中窗口的大小。
ksize:Sobel核的大小
k:就是我们在计算R时的k值
borderType:边界扩展的方法。因为在对每一个像素做Sobel操作时,涉及到边界的像素填充。

参考文章:https://dezeming.top/
https://docs.opencv.org/
https://senitco.github.io/2017/06/18/image-feature-harris/文章来源地址https://www.toymoban.com/news/detail-477303.html

到了这里,关于Harris角点检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV(四十二):Harris角点检测

    1.Harris角点介绍 什么是角点? 角点指的是两条边的交点,图中红色圈起来的点就是角点。 Harris角点检测原理:首先定义一个矩形区域,然后将这个矩形区域放置在我的图像中,求取这个区域内所有的像素值之和,之后沿着多个方向移动我这个区域,再次计算新区域的像素值

    2024年02月07日
    浏览(51)
  • OpenCV 入门教程: Harris角点检测

    Harris 角点检测是图像处理中常用的角点检测算法,用于寻找图像中的角点特征。角点是图像中具有明显边缘变化的位置,具有独特性和不变性,常用于图像匹配、目标跟踪和特征提取等应用。本文将以 Harris 角点检测为中心,为你介绍使用 OpenCV 进行角点检测的基本原理、步

    2024年02月16日
    浏览(41)
  • 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲。 同时作为自己的第一篇博客,在这里记录一下。 原理(略) 可以参考博主 拾牙慧者 的博客 角点检测(Harris角点检测法)_拾牙慧者的博客-CSDN博客_harri

    2023年04月14日
    浏览(44)
  • Python Opencv实践 - Harris角点检测

    参考资料:https://blog.csdn.net/wsp_1138886114/article/details/90415190  

    2024年02月09日
    浏览(45)
  • 基于MATLAB的Harris角点检测完成图片全景拼接

    目录 作业概要 1 原理及实现 1 2.1. 模块1 Harris角点检测 1 根据角点响应函数计算每个像素点的角点响应值; 2 2.2. 模块2 关键点的描述及其匹配 3 2.2.1. 生成描述向量 3 2.2.2. 匹配描述子 4 输出matched_points和匹配点对数count; 5 2.3. 模块3 转换矩阵的估计 5 输出仿射变换矩阵H。 6 2

    2024年01月17日
    浏览(42)
  • opencv进阶14-Harris角点检测-cv2.cornerHarris

    类似于人的眼睛和大脑,OpenCV可以检测图像的主要特征并将这 些特征提取到所谓的图像描述符中。然后,可以将这些特征作为数据 库,支持基于图像的搜索。此外,我们可以使用关键点将图像拼接起 来,组成更大的图像。(想象一下把很多图片放到一起组成一幅360°的全景

    2024年02月11日
    浏览(87)
  • Harris和Shi-tomasi角点检测笔记(详细推导)

            一般来说,角点就是极值点,在某些属性上强度最大或者最小的孤立点、线段的终点或拐点等。其实理解角点可以按照我们的直觉来理解,以下图为例,图中用颜色标注的地方都是角点:         原图地址:理解经典角点检测算法–Harris角点 | 码农家园         

    2024年02月11日
    浏览(41)
  • 基于Harris角点的多视角图像全景拼接算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 Harris角点检测 4.2 图像配准 4.3 图像变换和拼接 4.4 全景图像优化 5.算法完整程序工程 matlab2022a         基于Harris角点的多视角图像全景拼接算法是一种在计算机视觉和图像处理领域中广泛应用

    2024年01月18日
    浏览(43)
  • Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。

    搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的。于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris角点以及SUSAN角点。因此相关的理论还是有所了解的,不过那

    2024年02月06日
    浏览(49)
  • 【计算机视觉】图像分割与特征提取——基于Log、Canny的边缘检测

    个人简介:  📦个人主页:赵四司机 🏆学习方向:JAVA后端开发  ⏰往期文章:SpringBoot项目整合微信支付 🔔博主推荐网站:牛客网 刷题|面试|找工作神器 📣种一棵树最好的时间是十年前,其次是现在! 💖喜欢的话麻烦点点关注喔,你们的支持是我的最大动力。 前言:

    2024年02月03日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包