opencv角点检测

一、简介

1.1 什么是角点?
通常我们认为三角形有3个角点,矩形有4个角点,角点是两条边的交点;在图像中,角点是有某些特征的图像点,有坐标,代表着一些局部极值。
1.2 图像上的像素点?
1、边缘点 2、角点 3、平坦区域
1.3 原理: 在图像上某一点在任意方向的一个微小变动都会引起很大的灰度变化,这就是角点。

二、常见的角点检测算法—Harris角点检测

2.1 Harris函数API

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

参数src:单通道8位或32位浮点数图。
参数dst:函数调用后的运算结果存放在这,即存放的是角点检测的响应值,和原图一样的大小和类型。     d s t ( x , y ) = d e t M − k ∗ ( t r M ) 2 dst(x,y)=detM-k\ast (trM)^{2} dst(x,y)=detMk(trM)2
参数blockSize:窗口邻域大小。
参数ksize:表示Sobel()算子的孔径大小,Sobel()算子用来计算偏导数 I x 、 I y I_{x}、I_{y} IxIy
参数k:Harris函数的参数,一般默认为0.04~0.06。
参数borderType:扩充边界类型。

2.2 Harris角点检测原理
  使用一个固定窗口在图像任意方向上进行滑动,比较滑动前与滑动后窗口对应位置像素值的变化,如果在任意方向上像素值变化很大,那么就认为该窗口中有角点。
在这里插入图片描述
上图中,那么窗口滑动前与滑动后对应的窗口中的像素变化用数学描述如下:

   E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v)=\sum_{x,y} w(x,y)[I(x+u,y+v)-I(x,y)]^{2} E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

显然 E ( u , v ) E(u,v) E(u,v)越大,越可能存在角点。
其中: ( u , v ) (u,v) (u,v)表示窗口(或中心点)相对于原图中心点的偏移量(或偏移方向)。
    ( x , y ) (x,y) (x,y)表示窗口对应的像素值的坐标位置。
    w ( x , y ) w(x,y) w(x,y)是窗口权重系数,表示窗口内对应的像素值的权重系数,一般设置为二维高斯分布。
  通常的窗口权重系数有两种:
   在这里插入图片描述
E ( u , v ) E(u,v) E(u,v)的进一步表示:

   E ( u , v ) = ∑ x , y w ( x , y ) [ I ( x + u , y + v ) − I ( x , y ) ] 2 E(u,v)=\sum_{x,y} w(x,y)[I(x+u,y+v)-I(x,y)]^{2} E(u,v)=x,yw(x,y)[I(x+u,y+v)I(x,y)]2

二元函数泰勒级数展开公式对其化简:

   I ( x + u , y + v ) = I ( x , y ) + u I x + v I y I(x+u,y+v)=I(x,y)+uI_{x}+vI_{y} I(x+u,y+v)=I(x,y)+uIx+vIy

所以 E ( u , v ) = ∑ x , y w ( x , y ) [ u I x + v I y ] 2 E(u,v)=\sum_{x,y} w(x,y)[uI_{x}+vI_{y}]^{2} E(u,v)=x,yw(x,y)[uIx+vIy]2

       = ∑ x , y w ( x , y ) ( [ u v ] [ I x I x I x I y I y I x I y I y ] [ u v ] ) =\sum_{x,y} w(x,y)(\begin{bmatrix}u &v \end{bmatrix}\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix}\begin{bmatrix}u\\v \end{bmatrix}) =x,yw(x,y)([uv][IxIxIyIxIxIyIyIy][uv])

       = [ u v ] ( ∑ x , y w ( x , y ) [ I x I x I x I y I y I x I y I y ] ) [ u v ] =\begin{bmatrix}u &v \end{bmatrix}(\sum_{x,y} w(x,y)\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix})\begin{bmatrix}u\\v \end{bmatrix} =[uv](x,yw(x,y)[IxIxIyIxIxIyIyIy])[uv]

令  M = ∑ x , y w ( x , y ) [ I x I x I x I y I y I x I y I y ] M=\sum_{x,y} w(x,y)\begin{bmatrix}I_{x}I_{x} &I_{x}I_{y} \\ I_{y}I_{x} &I_{y}I_{y} \end{bmatrix} M=x,yw(x,y)[IxIxIyIxIxIyIyIy],可以看出 E ( u , v ) E(u,v) E(u,v)是一个二次型 f = A T X A f=A^{T}XA f=ATXA,

其中 f f f代表 E ( u , v ) E(u,v) E(u,v) X X X代表 M M M,而 M M M是个实对称矩阵,有两个特征根 λ 1 \lambda _{1} λ1 λ 2 \lambda _{2} λ2

  由正定矩阵的定义:设X是n阶方阵,如果对任何非零向量A,都有 f = A T X A f=A^{T}XA f=ATXA>

0,就称X为正定矩阵。因为 E ( u , v ) E(u,v) E(u,v)始终大于0,这里不考虑等于0的情况,所以 M M M是正

定矩阵,所以 λ 1 、 λ 2 \lambda _{1}、\lambda _{2} λ1λ2都是正数

  由二次型定理可知 E ( u , v ) E(u,v) E(u,v)可以转化为标准型:

     f = λ 1 y 1 2 + λ 2 y 2 2 f=\lambda _{1}y_{1}^{2}+\lambda _{2}y_{2}^{2} f=λ1y12+λ2y22

E ( u , v ) = 常 数 E(u,v)=常数 E(u,v)=;即 f = 常 数 f=常数 f=;则标准型可以表示为一个椭圆
在这里插入图片描述
上图中椭圆的性质:特征根影响灰度值得变化,越大变化越快。
①若 λ 1 \lambda _{1} λ1 λ 2 \lambda _{2} λ2均很大,那么在水平和垂直方向均变化很快,窗口中含有角点。
②若 λ 1 \lambda _{1} λ1很大、 λ 2 \lambda _{2} λ2很小,那么在水平或垂直其中一个方向变化很快,窗口中含有边缘。
③若 λ 1 \lambda _{1} λ1 λ 2 \lambda _{2} λ2均很小,那么在水平和垂直方向均变化很慢,窗口处在平坦区域。

令响应值 R = λ 1 ⋅ λ 2 − k ⋅ ( λ 1 + λ 2 ) 2 = d e t M − k ⋅ ( t r M ) 2 R=\lambda _{1}\cdot\lambda _{2}-k\cdot(\lambda _{1}+\lambda _{2})^{2}=detM-k\cdot(trM)^{2} R=λ1λ2k(λ1+λ2)2=detMk(trM)2

①若 λ 1 \lambda _{1} λ1 λ 2 \lambda _{2} λ2均很大, ( λ 1 (\lambda _{1} (λ1+ λ 2 ) 2 ≈ 4 ⋅ λ 1 ⋅ λ 2 \lambda _{2})^{2}\approx4\cdot\lambda _{1}\cdot\lambda _{2} λ2)24λ1λ2,且 k k k远小于1,所以 1 − 4 k ≈ 1 1-4k\approx1 14k1

R ≈ ( 1 − 4 k ) λ 1 λ 2 ≈ λ 1 λ 2 R\approx(1-4k)\lambda _{1}\lambda _{2}\approx\lambda _{1}\lambda _{2} R(14k)λ1λ2λ1λ2

②若 λ 1 > > λ 2 \lambda _{1}>>\lambda_{2} λ1>>λ2 k ⋅ λ 1 > > λ 2 k\cdot\lambda _{1}>>\lambda _{2} kλ1>>λ2,则 R ≈ λ 2 ⋅ λ 1 − k ⋅ λ 1 2 < 0 R\approx\lambda _{2}\cdot\lambda _{1}-k\cdot\lambda _{1}^{2} <0 Rλ2λ1kλ12<0

③若 λ 1 \lambda _{1} λ1 λ 2 \lambda _{2} λ2均很小,则 R ≈ 0 R\approx0 R0

结论:响应大于0窗口中含有角点,小于0窗口中含有边缘,等于0窗口处在平坦区域

2.3 Harris角点检测算法具有性质

①Harris角点检测算子对亮度和对比度的仿射变换不敏感
图像亮度和对比度的仿射变换并不改变Harris角点响应极值点出现的位置。
在这里插入图片描述
在这里插入图片描述
②Harris角点检测算子具有旋转不变性
Harris角点检测算子使用的是角点附近的区域灰度的二阶矩矩阵,其中二阶矩矩阵可以表示成一个椭圆,当旋转椭圆时,特征值不发生变化,即响应值不变,角点依然存在,所以具有旋转不变性。
在这里插入图片描述
③Harris角点检测算子不具有尺度不变性
如图当原图被缩小时,窗口尺寸不变的情况下,边缘可能被检测成角点。
在这里插入图片描述
2.4 Harris角点检测算法实现
①用Sobel()算子计算窗口对应的原图位置的偏导数(或者叫梯度) I x 、 I y I_{x}、I_{y} IxIy

②计算图像两个方向的梯度乘积:

   I x ⋅ I x 、 I x ⋅ I y 、 I y ⋅ I x 、 I y ⋅ I y I_{x}\cdot I_{x}、I_{x}\cdot I_{y}、I_{y}\cdot I_{x}、I_{y}\cdot I_{y} IxIxIxIyIyIxIyIy

③使用高斯函数进行加权。

④计算每个像素的响应值R

⑤进行阈值化,设置阈值去除掉一些角点

⑥进行非极大值抑制,去除掉簇拥在一起的角点

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值