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面向对象编程中的类和对象学习教程
Mar 30 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
用Python写一个无界面的2048小游戏
May 24 Python
Python处理JSON时的值报错及编码报错的两则解决实录
Jun 26 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
Flask框架Jinjia模板常用语法总结
Jul 19 Python
Python函数返回不定数量的值方法
Jan 22 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
python解析xml简单示例
Jun 21 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
Python通过4种方式实现进程数据通信
Mar 12 Python
Python常用编译器原理及特点解析
Mar 23 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php include和require的区别深入解析
2013/06/17 PHP
php时间戳转换的示例
2014/03/31 PHP
php数据访问之增删改查操作
2016/05/09 PHP
Laravel中获取路由参数Route Parameters的五种方法示例
2017/09/29 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
javascript知识点收藏
2007/02/22 Javascript
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
2011/01/17 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
JavaScript的Polymer框架中dom-repeat与VM的相关操作
2015/07/29 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
Javascript json object 与string 相互转换的简单实现
2016/09/27 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
2017/09/20 jQuery
vue全局组件与局部组件使用方法详解
2018/03/29 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
Python实现读取json文件到excel表
2017/11/18 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
Python读写锁实现实现代码解析
2020/11/28 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
原材料检验岗位职责
2014/03/15 职场文书
财产保全担保书范文
2014/04/01 职场文书
假释思想汇报范文
2014/10/11 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js