角点检测

角点指的是角的顶点,如桌角椅角墙角的顶点。数学描述上,如果一个点在两个正交的方向上都有明显导数,那么这个点是角点。直观看来,角点就是在一张图上能找到,换个角度再拍一张图,还能找到的点。

最普遍使用的角点定义是Harris提出的,指的是至少在两个不同方向上有明显灰度变化的点。对于一幅灰度图片中的点(x,y)(x,y)(x,y),灰度值为I(x,y)I(x,y)I(x,y),采用一阶近似
I(x+u,y+v)=I(x,y)+uIx(x,y)+vIy(x,y) I(x+u,y+v)=I(x,y)+uI_x(x,y)+vI_y(x,y) I(x+u,y+v)=I(x,y)+uIx(x,y)+vIy(x,y)

(I(x+u,y+v)−I(x,y))2=[u,v][Ix2IxIyIxIyIy2][uv] (I(x+u,y+v)-I(x,y))^2=[u,v] \left[ \begin{matrix} I_x^2 & I_xI_y \\ I_xI_y & I_y^2 \end{matrix} \right] \left[ \begin{matrix} u \\ v \end{matrix} \right] (I(x+u,y+v)I(x,y))2=[u,v][Ix2IxIyIxIyIy2][uv]

使用SVD分解
(I(x+u,y+v)−I(x,y))2=[u′,v′][λ100λ2][u′v′]=λ1u′2+λ2v′2 (I(x+u,y+v)-I(x,y))^2=[u',v'] \left[ \begin{matrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{matrix} \right] \left[ \begin{matrix} u' \\ v' \end{matrix} \right] =\lambda_1 u'^2+\lambda_2v'^2 (I(x+u,y+v)I(x,y))2=[u,v][λ100λ2][uv]=λ1u2+λ2v2
λ1\lambda_1λ1λ2\lambda_2λ2代表了两个不同方向上的灰度变化剧烈程度,因此希望两个特征值越大越好。通过计算角点的响应,公式如下
R=det(M)−k∗trace(M) R=det(M)-k*trace(M) R=det(M)ktrace(M)
其中det(M)=λ1λ2det(M)=\lambda_1 \lambda_2det(M)=λ1λ2trace(M)=λ1+λ2trace(M)=\lambda_1+\lambda_2trace(M)=λ1+λ2kkk一般选择0.04~0.06。如果R>TR>TR>T,则判定该点是角点。

实际计算中,为了去除噪声影响,在计算得到水平边缘图IxI_xIx和垂直边缘图IyI_yIy,进而得到Ix2I_x^2Ix2Iy2I_y^2Iy2IxIyI_xI_yIxIy后,会对这三张导数图进行滤波,通常使用高斯滤波器,因此
M=[G(Ix2)G(IxIy)G(IxIy)G(Iy2)] M=\left[ \begin{matrix} G(I_x^2) & G(I_xI_y) \\ G(I_xI_y) & G(I_y^2) \end{matrix} \right] M=[G(Ix2)G(IxIy)G(IxIy)G(Iy2)]
其中G(Ix2)=∑−K≤i,j≤Kwi,jIx2(x+i,y+j)G(I_x^2)=\sum_{-K\leq i,j \leq K} w_{i,j}I_x^2(x+i,y+j)G(Ix2)=Ki,jKwi,jIx2(x+i,y+j)wijw_{ij}wij是高斯权重。

OpenCV中的实现会直接计算MMM的两个特征值,如果特征值较小的一个大于最小阈值,则会得到强角点,在很多情况下可以得到比原始算法更好的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值