1. 图像中角点定义

沿各个方向,图像灰度均发生变化;

2.Harris原理

Harris中也是根据角点定义经角点定义,Harris中使用该像素点周围像素块和其周围的其它像素块的相关性刻画角点,相关性用平方差之和进行计算(SSD),SSD越大,相关性差,中心像素点越有可能成为角点。其数学表达形式为:

Where Q 是矩阵M的特征向量组成的正交矩阵,向量左乘正交矩阵相当于旋转了一定角度,但是大小保持不变。
在x轴和y轴梯度均增大的点就是梯度点,为了方便,设置相应函数,相应函数的设计原理如下图所示:

图(1) Harris角点检测原理图
响应函数为:

Where K是一个经验值,通常取0.04~0.06。

3.Harris代码实现

'''
@Author:noodles
@date:2020-7-17 20:31:46
'''
import cv2
import numpy as np
threshold = 0.01
def responseFunc(M):k = 0.04det = np.linalg.det(M)trace = np.trace(M)R = det - k * trace **2return R
def getHarrisFeaturePoints(src,NMS=False):global thresholdh, w = src.shape[:2]# Step1: convert rgb image grayScalegray_image = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)cornerPoint = np.zeros_like(gray_image,dtype=np.float32)# Step2: compute gradient of x,y axis respectivelygrad = np.zeros((h, w, 2), dtype=np.float32)grad[:,:,0] = cv2.Sobel(gray_image,cv2.CV_16S,1,0)grad[:,:,1] = cv2.Sobel(gray_image,cv2.CV_16S,0,1)Ixx = grad[:,:,0] ** 2Iyy = grad[:,:,1] ** 2Ixy = grad[:,:,0] * grad[:,:,1]# gaussian_kernal =cv2.getGaussianKernel(3,2)Ixx = cv2.GaussianBlur(Ixx, (3, 3), sigmaX=2)Iyy = cv2.GaussianBlur(Iyy, (3, 3), sigmaX=2)Ixy = cv2.GaussianBlur(Ixy, (3, 3), sigmaX=2)# print(Ixx, Iyy,Ixy)# Step3: compute structure matrixfor i in range(gray_image.shape[0]):for j in range(gray_image.shape[1]):struture_matrix = [[Ixx[i][j], Ixy[i][j]], [Ixy[i][j], Iyy[i][j]]]# Step4: response calculation,determine weather it is corner or notR = responseFunc(struture_matrix)cornerPoint[i][j] = R# Step5: non-max suppression,reduce the quantity of cornercorners = np.zeros_like(gray_image,dtype=np.float32)counter = 0maxValue = np.max(cornerPoint)for i in range(cornerPoint.shape[0]):for j in range(cornerPoint.shape[1]):if NMS:if cornerPoint[i][j] > threshold * maxValue and cornerPoint[i][j] == np.max(cornerPoint[max(0, i - 1):min(i + 1, h - 1), max(0, j - 1):min(j + 1, w - 1)] ):counter+=1corners[i][j] = 255else:if cornerPoint[i][j] > threshold * maxValue:counter+=1corners[i][j] = 255print('FeaturePoints=', counter)return cornersif __name__ == '__main__':image_path = 'grid.jpg'src = cv2.imread(image_path)img = cv2.resize(src, dsize=(600, 400))NMS = Falsedst = getHarrisFeaturePoints(img,NMS)#print(dst)img[dst == 255] = [0, 0, 255]cv2.imshow('src',img)cv2.waitKey()

实验结果:


图(2) opencv库函数测试结果

图(3) 编码实现测试结果
可以看到对于同一张图,调用opencv和和自己编码实现检测的角点的位置和数量一致,验证了自己代码的正确性。

4.疑难和理解

Q1:为什么研究M矩阵?

A1:根据化简式子1,发现M影响E(x,y)变化快慢。

Q2:为什么要求M的特征值?


图(4) 矩阵特征值和Ix,Iy分布关系图
理解思路1:绘制了特征值和窗口内Ix,Iy的函数,如上图(4),发现了对应结论。
理解思路2:发现M矩阵和PCA中的矩阵很相似,原始数据可以理解为窗口中的Ix,Iy二维数据,M的特征值对应Ix,Iy的主成分,两个主成分都比较大,则认为在像素点周围存在至少两个像素变化的方向。

Q3:响应函数设计的原理?

A3:为了避免计算特征值。

图(5)原文中响应函数设计原理

图(6)Harris响应函数的曲线图
结合Harris函数的本身特点和二维矩阵与特征值与矩阵元素的关系设计。
矩阵值和矩阵元素存在如下关系:

Q4:为什么具有旋转不变性?

A4:图像旋转只会改变特征椭圆的方向,并不会改变椭圆的长短轴的长度,因此R并不会改变。

Q5:Harris角点检测算子对亮度和对比度的变化不灵敏


该算法通过图像差分计算角点,两种对比度变化如上图所示,可见光照图像差分影响并不大,也不会改变角点在图像中的位置,但是因为阈值设置的原因,会形象特征点的数量。
Note:
交单检测主要分为基于灰度图像的角点检测、基于二值图像的角点检测、基于轮廓曲线的角点检测。而Harris角点检测属于基于灰度图像的角点检测。
下面这张图像使用基于灰度检测的角点图像效果就会很差:

原图

使用Harris角点检测出来的结果
通过对比发现,角点检测过程,首先需要确定角点的种类,然后选用不同的角点检测算法,这样才能有效准确的检测处图像角点。

5.reference

参考文献:
[1]: https://www.cnblogs.com/zyly/p/9508131.html
[2]: https://www.cnblogs.com/ronny/p/4009425.html
[3]: https://blog.csdn.net/f290131665/article/details/80064479
[4]: A Combined Corner and Edge Detector[J],1988.Jianbo Shi and Carlo Tomasi

Harris 角点检测原理及实现相关推荐

  1. Harris角点检测原理详解(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广 ...

  2. Harris角点检测原理详解

    Harris角点特征提取算法流程: Harris角点检测的缺点:不能应对尺度变换 关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配).相机标定等.网上也有很多博客对Harris角点检测 ...

  3. harris角点检测c语言,Harris角点检测原理及实现

    为便于理解,先简要介绍角点的概念和角点检测背景 一.角点及角点检测背景: 角点概念: 角点,通常可理解为两条边的角点,也可理解为像素值在多个方向有显著变化的点或局部区域内某个属性明显的点.如多个轮廓的 ...

  4. harris角点检测原理

    目录 1.角点概述 2.数学知识 3.Harris角点检测基本原理 4.优化改进 1.角点概述 如果一个点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点,也就是一阶导数(即灰 ...

  5. Harris 角点检测原理详解

    var html = document.getElementById("artContent").innerHTML; document.getElementById(" ...

  6. Harris角点检测原理-

    本文是本人看bilibili教学结合官方文档的观后笔记,链接在下: (全)基于python的Opencv项目实战_哔哩哔哩_bilibili 如果有什么理解不到位的地方,欢迎指正. 理论: 先放角点定 ...

  7. 特征提取与检测(一)---Harris与Shi-Tomasi角点检测原理

    一.Harris角点检测原理 1. 何为角点? 下面有两幅不同视角的图像,通过找出对应的角点进行匹配. 我们可以直观的概括下角点所具有的特征: >轮廓之间的交点: >对于同一场景,即使视角 ...

  8. 基于Python手动实现Harris角点检测

    最近在上数字图像处理课程,需要使用Python手动编写Harris角点检测算法,但是网上几乎没有找到手动编写的,只能手敲. 同时作为自己的第一篇博客,在这里记录一下. 一.Harris角点检测 原理( ...

  9. Harris角点检测python实现及基于opencv实现

    写在前面: 黄宁然, 七月,骄阳似火. 参考文献镇楼: [1]袁志聪,基于harris特征的点云配准方法研究 [2]高亭,基于改进Harris角点检测的印刷体文档图像检索技术 [3]景庆阳,基于har ...

最新文章

  1. 深度学习与传统图像识别
  2. javascript判断输入的值是不是正整数
  3. java spring context_java将对象注册到spring context中 | 学步园
  4. 数据中心即服务(DCaaS):建筑设计师的下一个重大机遇
  5. 浏览器访问solr报错:HTTP Status 500 - {msg=SolrCore 'collection1' is not available due to init failure
  6. Boost:parallel grep测试程序
  7. 下一清分日期是几年前_下一清分日期是什么意思
  8. 【网络编程】之六、选择select
  9. C#抓取网页HTML内容
  10. 咨询报告生成:使用python生成pptx格式的报告
  11. 一些jquery的使用方法
  12. 带你看论文丨全局信息对于图网络文档解析的影响
  13. tcp云服务器连接,云服务器可以tcp通讯吗
  14. 小波分析及相应MATLAB实现
  15. 揭秘|Axway API在银行业的应用
  16. linux清理垃圾缓存文件在哪,Linux系统需要清理垃圾文件和优化系统吗?
  17. objective-c感悟(四)class、catagory、class extension、optional
  18. keep-alive包裹的el-tabs中有两个页面使用echart渲染空白问题
  19. 物联网毕业设计 - 智能运动计步系统(物联网 嵌入式 单片机 stm32)
  20. 如何查看夜神、逍遥模拟器的端口

热门文章

  1. Android 杀后台太狠,谷歌:看不下去了,势必要揪出“凶手”!
  2. 【C】北理C语言——有意思的题第一题
  3. 曹云金回应公式相声_2年前开创公式相声,还调侃郭德纲的“博士相声夫妇”,结果呢?...
  4. 卸载DreamScene
  5. Linux系统搭建Samba服务
  6. 千锋杭州python培训
  7. android媒体播放器课程设计,基于Android的多媒体播放器课程设计报告 ()
  8. windows下配置canal
  9. 你被窥视了吗?清醒看移动应用程序隐私保护
  10. 哪些邮箱能注册个人powerbi?