Harris角点检测(Python-OpenCV)
来源:互联网 发布:linux dhcp 作用 编辑:程序博客网 时间:2024/06/07 10:57
Harris角点检测(Python-OpenCV)
author@jason
http://blog.csdn.net/lql0716/
1 角点
- 角点:是一类含有足够信息且能从当前帧和下一帧中都能提取出来的点。
- 最普遍使用的角点的定义是由
Harris
提出的。 - 典型的角点检测算法:
Harris角点检测
、CSS角点检测
- 好的角点检测算法的特点:1、检测出图像中“
真实
的”角点;2、准确
的定位性能;3、很高的重复检测率(稳定性
好);4、具有对噪声的鲁棒性
;5、具有较高的计算效率
2 Harris角点检测原理
图像:
图像的灰度值(指单个像素值):
图像的平移向量:
平移产生的灰度变化:
高斯窗口系数:
在我们解决问题时,往往希望找到特征点,“特征”顾名思义,指能描述物体本质的东西,还有一种解释就是这个特征微小的变化都会对物体的某一属性产生重大的影响。而角点就是这样的特征。
观察日常生活中的“角落”就会发现,“角落”可以视为所有平面的交汇处,或者说是所有表面的发起处。假设我们要改变一个墙角的位置,那么由它而出发的平面势必都要有很大的变化。所以,这就引出了图像角点的定义
“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”.
由上面的定义,检测图像像素的灰度变化情况,即求解
要求解
将(2)式代入(1)式:
其中
Harris算子:
也可表示为:
即
其中
像上面这样去求解,原则上是没有问题的,可是,众所周知,原始的Harris角点检测算法不具有尺度不变性,也就是说如果图像的尺度发生变化,那么可能原来是角点的点在新的尺度就不是角点了。所以,我们在进行运算的开始,先将图像转换到尺度空间表示,即将原图像进行尺度变换,而尺度变换的方式就是问题的输入信号与尺度核函数做卷积运算:
- Harris角点检测实现步骤:
1、求出
I(x,y) 在x、y方向上的梯度Ix 、Iy
2、分别求出在x、y方向上的梯度乘积,I2x=Ix∗Ix ,I2y=Iy∗Iy ,Ixy=Ix∗Iy
3、对I2x ,I2y ,Ixy 进行高斯加权,从而产生A ,B ,C 三个元素,如下:
A=g(I2x)=I2x∗w ,B=g(I2y)=I2y∗w ,C=g(I2xy)=I2xy∗w
4、求出每个像素的Harris响应值R ,令小于阈值(阈值一般为0.01*np.max(R))的响应值R 为0
5、进行3*3邻域非极大值抑制,即如果该点的值比3*3邻域的其它角点小,则删除该角点。
6、记录下角点在原图像的位置,即图像角点所在的位置
3 Harris角点检测算法代码
import cv2import numpy as npimport matplotlibimport mathfrom matplotlib import pyplot as plt #根据一阶锐化算子,求x,y的梯度,显示锐化图像#读取图片filename = 'girl.jpg'tu = cv2.imread(filename)#转换为灰度图gray = cv2.cvtColor(tu, cv2.COLOR_RGB2GRAY)#获取图像属性print '获取图像大小: 'print gray.shapeprint '\n'#打印数组grayprint '灰度图像数组:\n %s \n \n' % (gray)#输出n*n的数组#print gray[:2,:2]#转换为矩阵m = np.matrix(gray)#计算x方向的梯度的函数(水平方向锐化算子)delta_h = mdef grad_x(h): a = int(h.shape[0]) b = int(h.shape[1]) for i in range(a): for j in range(b): if i-1>=0 and i+1<a and j-1>=0 and j+1<b: c = abs(int(h[i-1,j-1]) - int(h[i+1,j-1]) + 2*(int(h[i-1,j]) - int(h[i+1,j])) + int(h[i-1,j+1]) - int(h[i+1,j+1]))# print c if c>255:# print c c = 255 delta_h[i,j] = c else: delta_h[i,j] = 0 print 'x方向的梯度:\n %s \n' %delta_h return delta_h##计算y方向的梯度的函数(水平方向锐化算子)def grad_y(h): a = int(h.shape[0]) b = int(h.shape[1]) for i in range(a): for j in range(b): if i-1>=0 and i+1<a and j-1>=0 and j+1<b: c = abs(int(h[i-1,j-1]) - int(h[i-1,j+1]) + 2*(int(h[i,j-1]) - int(h[i,j+1])) + (int(h[i+1,j-1]) - int(h[i+1,j+1]))) #注意像素不能直接计算,需要转化为整型# print c if c > 255: c = 255 delta_h[i,j] = c else: delta_h[i,j] = 0 print 'y方向的梯度:\n %s \n' %delta_h return delta_h# Laplace 算子 img_laplace = cv2.Laplacian(gray, cv2.CV_64F, ksize=3) dx = np.array(grad_x(gray))dy = np.array(grad_y(gray))#dxy = dx + dy#print 'dxy1:'#print dxyA = dx * dxB = dy * dy C = dx * dyprint Aprint Bprint CA1 = AB1 = BC1 = CA1 = cv2.GaussianBlur(A1,(3,3),1.5)B1 = cv2.GaussianBlur(B1,(3,3),1.5)C1 = cv2.GaussianBlur(C1,(3,3),1.5)print A1print B1print C1a = int(gray.shape[0])b = int(gray.shape[1])R = np.zeros(gray.shape)for i in range(a): for j in range(b): M = [[A1[i,j],C1[i,j]],[C1[i,j],B1[i,j]]] R[i,j] = np.linalg.det(M) - 0.06 * (np.trace(M)) * (np.trace(M))print Rcv2.namedWindow('R',cv2.WINDOW_NORMAL)cv2.imshow('R',R)cv2.waitKey(0)cv2.destroyAllWindows()
参考:
(1)、Harris角点检测原理与流程
http://wenku.baidu.com/link?url=JUReQprTfBoxAp3yT_Y8sJPkqJUnMO7uU7Lo88fESIsJvJ1krtLn31_Ed_5wwG9ldv936VE-vMIb2-Moy8hDkc-fuUNg4PKKgrJLc2m9jF_###
(2)、Harris角点检测算法原理及其MATLAB编程实现
http://wenku.baidu.com/view/3c0dfdf7680203d8cf2f246d.html?from=search
4 FAST角点检测算法
链接:http://blog.csdn.net/lql0716/article/details/65662648
- Harris角点检测(Python-OpenCV)
- OpenCV + Python Harris角点检测
- opencv harris角点检测
- opencv-Harris 角点检测
- Opencv Harris角点检测
- Harris角点检测原理与opencv(python)实现
- python opencv入门 Harris角点检测(31)
- python检测Harris角点
- opencv学习_12 (harris角点检测)
- Opencv学习笔记------Harris角点检测
- opencv的Harris角点检测
- OpenCV Harris 角点检测子
- Opencv学习笔记------Harris角点检测
- opencv学习_12 (harris角点检测)
- opencv中的harris角点检测函数
- 基于OpenCV的harris角点检测
- OpenCV角点检测之Harris角点检测
- ★OpenCV 角点检测之Harris角点检测
- failed to push some refs to 'git@github.com怎么办
- SQL Server里建表保存后要修改遇到无法保存修改的问题
- 排序算法题
- Oracle10g自定义聚合函数(字符串拼接)
- http请求
- Harris角点检测(Python-OpenCV)
- STL -- 关于一些字符串处理用到的函数和数据结构
- android Binder
- 巧用ViewPager 打造不一样的广告轮播切换效果
- 互联网协议
- 最小生成树—Prim算法和Kruskal算法
- 编程面试过程中常见的10大算法概念汇总
- 利用Windows API实现精确计时器
- CCF认证 201604-3 路径解析