OPENCV学习——角点检测

harris角点检测

1、图像特征

  • 平面:平坦区域,没有什么确切的特征,沿水平和竖直方向运动均无明细那变化
  • 边界:物体的边缘,位于交界处,沿某一方向移动有明显变换,能大致定位到
  • 角点:物体的一些角落,沿水平和竖直两个方向移动均会发生明显变化

2、基本数学原理

对于图像I(x, y),当在点的(x, y)出平移( Δ \Delta Δx, Δ \Delta Δy)后的自相似性:
c ( x , y ; Δ x , Δ y ) = ∑ ( u , v ) ϵ W ( x , y ) ω ( u , v ) ( I ( u , v ) − I ( u + Δ x , v + Δ y ) ) 2 c(x,y;\Delta x,\Delta y)=\sum_{(u,v)\epsilon W(x,y)} \omega (u,v)(I(u,v)-I(u+\Delta x,v+\Delta y))^2 c(x,y;Δx,Δy)=(u,v)ϵW(x,y)ω(u,v)(I(u,v)I(u+Δx,v+Δy))2
W(x,y)是以点(x,y)为中心的窗口,即可是常数,也可以是高斯加权函数
I(u,v)为图像灰度
I ( u + Δ x , v + Δ y ) I(u+\Delta x,v+\Delta y) I(u+Δx,v+Δy)是平移后的图像灰度
求解:
基于泰勒展开,对图像I(x,y)在平移 ( Δ x , Δ y ) (\Delta x,\Delta y) (Δx,Δy)后进行一阶近似:
I ( u + Δ x , v + Δ y ) = I ( u , v ) + I x ( u , v ) Δ x + I y ( u , v ) Δ y + O ( Δ x 2 , Δ y 2 ) ≈ I ( u , v ) + I x ( u , v ) Δ x + I y ( u , v ) Δ y I(u+\Delta x,v+\Delta y)=I(u,v)+I_x(u,v)\Delta x+I_y(u,v)\Delta y +O(\Delta x^2,\Delta y^2)\approx I(u,v)+I_x(u,v)\Delta x+I_y(u,v)\Delta y I(u+Δx,v+Δy)=I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy+O(Δx2,Δy2)I(u,v)+Ix(u,v)Δx+Iy(u,v)Δy
其中 I x I_x Ix, I y I_y Iy是I(x,y)的偏导数
近似可得:
c ( x , y ; Δ x , Δ y ) ≈ ∑ ( u , v ) ϵ W ( x , y ) ( I ( u , v ) − I ( u + Δ x , v + Δ y ) ) 2 = [ Δ x , Δ y ] M ( x , y ) [ Δ x Δ y ] c(x,y;\Delta x,\Delta y)\approx \sum_{(u,v)\epsilon W(x,y)}(I(u,v)-I(u+\Delta x,v+\Delta y))^2=[\Delta x,\Delta y]M(x,y) \begin{bmatrix} \Delta x\\ \Delta y \end{bmatrix} c(x,y;Δx,Δy)(u,v)ϵW(x,y)(I(u,v)I(u+Δx,v+Δy))2=[Δx,Δy]M(x,y)[ΔxΔy]
其中M:
M ( x , y ) = ∑ w [ I x ( x , y ) 2 I x ( x , y ) I y ( x , y ) I x ( x , y ) I y ( x , y ) I y ( x , y ) 2 ] = [ ∑ w I x ( x , y ) 2 ∑ w I x ( x , y ) I y ( x , y ) ∑ w I x ( x , y ) I y ( x , y ) ∑ w I y ( x , y ) 2 ] = [ A C C B ] M(x,y) = \sum_w\begin{bmatrix} I_x(x,y)^2 & I_x(x,y)I_y(x,y) \\ I_x(x,y)I_y(x,y) & I_y(x,y)^2 \end{bmatrix} = \begin{bmatrix} \sum_w I_x(x,y)^2 &\sum_w I_x(x,y)I_y(x,y) \\ \sum_w I_x(x,y)I_y(x,y) &\sum_w I_y(x,y)^2 \end{bmatrix} = \begin{bmatrix} A & C \\ C &B \end{bmatrix} M(x,y)=w[Ix(x,y)2Ix(x,y)Iy(x,y)Ix(x,y)Iy(x,y)Iy(x,y)2]=[wIx(x,y)2wIx(x,y)Iy(x,y)wIx(x,y)Iy(x,y)wIy(x,y)2]=[ACCB]
化简可得:
c ( x , y ; Δ x , Δ y ≈ A Δ x 2 + 2 C Δ x Δ y + B Δ y 2 ) c(x,y;\Delta x,\Delta y \approx A\Delta x^2+2C\Delta x \Delta y +B\Delta y^2) c(x,y;Δx,ΔyAΔx2+2CΔxΔy+BΔy2)
A = ∑ w I x 2 , B = ∑ x I y 2 , C = ∑ w I x I y A = \sum_wI_x^2,B = \sum_xI_y^2,C = \sum_wI_xI_y A=wIx2,B=xIy2,C=wIxIy

二次函数本质上是一个椭圆方程

角点响应R值:
R = d e t M − α ( t r a c e M ) 2 R = detM - \alpha(traceM)^2 R=detMα(traceM)2
d e t M = λ 1 λ 2 , t r a c e M = λ 1 + λ 2 detM = \lambda1\lambda2,traceM = \lambda1+\lambda2 detM=λ1λ2,traceM=λ1+λ2
判断:
边界:一个特征值大,一个特征值小, λ 1 > > λ 2 \lambda1>>\lambda2 λ1>>λ2 λ 1 < < λ 2 \lambda1<<\lambda2 λ1<<λ2。自相关函数值在某一个方向上大,在其他方向上小。R<0
平面:两个特征值都小,且近似相等;自相关函数值在各个方向上都小。 R ≈ 0 R \approx 0 R0
角点:两个特征值都大,且近似相等;自相关函数值在各个方向上都大。R > 0

代码实现

import cv2
import numpy as np
'''
img: 数据类型为float32的图像
blockSize:角点检测中指定区域的大小
ksize:Sobel求导中使用的窗口大小
k:取值参数为[0.04,0.06]
'''
img = cv2.imread('image/chessbroad.jpg')
print('img.shape:',img.shape)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
print('dst.shape:',dst.shape)

img[dst>0.01*dst.max()] = [0,0,255]
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果显示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值