python 实现Harris角点检测算法


Posted in Python onDecember 11, 2020

算法流程:

  1. 将图像转换为灰度图像
  2. 利用Sobel滤波器求出 海森矩阵 (Hessian matrix) :

python 实现Harris角点检测算法

  • 将高斯滤波器分别作用于Ix²、Iy²、IxIy
  • 计算每个像素的 R= det(H) - k(trace(H))²。det(H)表示矩阵H的行列式,trace表示矩阵H的迹。通常k的取值范围为[0.04,0.16]。
  • 满足 R>=max(R) * th 的像素点即为角点。th常取0.1。

Harris算法实现:

import cv2 as cv 
import numpy as np
import matplotlib.pyplot as plt


# Harris corner detection
def Harris_corner(img):

	## Grayscale
	def BGR2GRAY(img):
		gray = 0.2126 * img[..., 2] + 0.7152 * img[..., 1] + 0.0722 * img[..., 0]
		gray = gray.astype(np.uint8)
		return gray

	## Sobel
	def Sobel_filtering(gray):
		# get shape
		H, W = gray.shape

		# sobel kernel
		sobely = np.array(((1, 2, 1),
						(0, 0, 0),
						(-1, -2, -1)), dtype=np.float32)

		sobelx = np.array(((1, 0, -1),
						(2, 0, -2),
						(1, 0, -1)), dtype=np.float32)

		# padding
		tmp = np.pad(gray, (1, 1), 'edge')

		# prepare
		Ix = np.zeros_like(gray, dtype=np.float32)
		Iy = np.zeros_like(gray, dtype=np.float32)

		# get differential
		for y in range(H):
			for x in range(W):
				Ix[y, x] = np.mean(tmp[y : y + 3, x : x + 3] * sobelx)
				Iy[y, x] = np.mean(tmp[y : y + 3, x : x + 3] * sobely)
			
		Ix2 = Ix ** 2
		Iy2 = Iy ** 2
		Ixy = Ix * Iy

		return Ix2, Iy2, Ixy


	# gaussian filtering
	def gaussian_filtering(I, K_size=3, sigma=3):
		# get shape
		H, W = I.shape

		## gaussian
		I_t = np.pad(I, (K_size // 2, K_size // 2), 'edge')

		# gaussian kernel
		K = np.zeros((K_size, K_size), dtype=np.float)
		for x in range(K_size):
			for y in range(K_size):
				_x = x - K_size // 2
				_y = y - K_size // 2
				K[y, x] = np.exp( -(_x ** 2 + _y ** 2) / (2 * (sigma ** 2)))
		K /= (sigma * np.sqrt(2 * np.pi))
		K /= K.sum()

		# filtering
		for y in range(H):
			for x in range(W):
				I[y,x] = np.sum(I_t[y : y + K_size, x : x + K_size] * K)
				
		return I

	# corner detect
	def corner_detect(gray, Ix2, Iy2, Ixy, k=0.04, th=0.1):
		# prepare output image
		out = np.array((gray, gray, gray))
		out = np.transpose(out, (1,2,0))

		# get R
		R = (Ix2 * Iy2 - Ixy ** 2) - k * ((Ix2 + Iy2) ** 2)

		# detect corner
		out[R >= np.max(R) * th] = [255, 0, 0]

		out = out.astype(np.uint8)

		return out

	
	# 1. grayscale
	gray = BGR2GRAY(img)

	# 2. get difference image
	Ix2, Iy2, Ixy = Sobel_filtering(gray)

	# 3. gaussian filtering
	Ix2 = gaussian_filtering(Ix2, K_size=3, sigma=3)
	Iy2 = gaussian_filtering(Iy2, K_size=3, sigma=3)
	Ixy = gaussian_filtering(Ixy, K_size=3, sigma=3)

	# 4. corner detect
	out = corner_detect(gray, Ix2, Iy2, Ixy)

	return out


# Read image
img = cv.imread("../qiqiao.jpg").astype(np.float32)

# Harris corner detection
out = Harris_corner(img)

cv.imwrite("out.jpg", out)
cv.imshow("result", out)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:

原图:

python 实现Harris角点检测算法

Harris角点检测算法检测结果:

python 实现Harris角点检测算法

以上就是python 实现Harris角点检测算法的详细内容,更多关于python Harris角点检测算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python分割文件的常用方法
Nov 01 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
Django中数据库的数据关系:一对一,一对多,多对多
Oct 21 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
使用Python3内置文档高效学习以及官方中文文档
May 19 Python
Window10下python3.7 安装与卸载教程图解
Sep 30 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
在python中求分布函数相关的包实例
Apr 15 Python
Python自带的IDE在哪里
Jul 01 Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 Python
python非标准时间的转换
Jul 25 Python
Django框架之路由用法
Jun 10 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
Dec 11 #Python
Python3 用matplotlib绘制sigmoid函数的案例
Dec 11 #Python
python 基于opencv 实现一个鼠标绘图小程序
Dec 11 #Python
Python 用__new__方法实现单例的操作
Dec 11 #Python
python实现图像高斯金字塔的示例代码
Dec 11 #Python
Pycharm plot独立窗口显示的操作
Dec 11 #Python
Python OpenCV中的numpy与图像类型转换操作
Dec 11 #Python
You might like
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP简单实现无限级分类的方法
2016/05/13 PHP
php+iframe 实现上传文件功能示例
2020/03/04 PHP
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
2009/08/04 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
Firefox中autocomplete="off" 设置不起作用Bug的解决方法
2011/03/25 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
node.js中的path.isAbsolute方法使用说明
2014/12/08 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
Bootstrap每天必学之基础排版
2015/11/20 Javascript
jQuery常用知识点总结以及平时封装常用函数
2016/02/23 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
python内存管理分析
2015/04/08 Python
对于Python的框架中一些会话程序的管理
2015/04/20 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
Python操作mongodb的9个步骤
2018/06/04 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
python 绘制国旗的示例
2020/09/27 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
创建文明学校实施方案
2014/03/11 职场文书
节水标语大全
2014/06/11 职场文书
爱与责任师德演讲稿
2014/08/26 职场文书
放飞理想演讲稿
2014/09/09 职场文书
领导干部个人整改措施落实情况汇报
2014/10/29 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
初中生思想道德自我评价
2015/03/09 职场文书
入党介绍人考察意见
2015/06/01 职场文书
发票退票证明
2015/06/24 职场文书