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浅拷贝、深拷贝及引用机制
Dec 15 Python
浅谈function(函数)中的动态参数
Apr 30 Python
Python绑定方法与非绑定方法详解
Aug 18 Python
Python3 操作符重载方法示例
Nov 23 Python
python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
Feb 26 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
python 字典 setdefault()和get()方法比较详解
Aug 07 Python
Tensorflow累加的实现案例
Feb 05 Python
win10安装python3.6的常见问题
Jul 01 Python
Python实现粒子群算法的示例
Feb 14 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/04/30 PHP
php向js函数传参的几种方法
2014/08/10 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
JS类的封装及实现代码
2009/12/02 Javascript
分享几个超级震憾的图片特效
2012/01/08 Javascript
解析jquery获取父窗口的元素
2013/06/26 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
js父窗口关闭时子窗口随之关闭完美解决方案
2014/04/29 Javascript
PHP PDO操作总结
2014/11/17 Javascript
node.js中RPC(远程过程调用)的实现原理介绍
2014/12/05 Javascript
JavaScript判断浏览器类型的方法
2015/02/10 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
NodeJS中的MongoDB快速入门详细教程
2016/11/11 NodeJs
微信小程序 Button 组件详解及简单实例
2017/01/10 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
django处理select下拉表单实例(从model到前端到post到form)
2020/03/13 Python
详解Python中namedtuple的使用
2020/04/27 Python
Vans澳大利亚官网:购买鞋子、服装及配件
2019/09/05 全球购物
请用用Java代码写一个堆栈
2012/01/26 面试题
本科毕业生专业自荐书范文
2014/02/05 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
国王的演讲观后感
2015/06/03 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
MySQL非空约束(not null)案例讲解
2021/08/23 MySQL
nginx日志格式分析和修改
2022/04/28 Servers