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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
Python实现的数据结构与算法之队列详解
Apr 22 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
pyshp创建shp点文件的方法
Dec 31 Python
PyQt5 QTableView设置某一列不可编辑的方法
Jun 25 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
Python 使用matplotlib模块模拟掷骰子
Aug 08 Python
python3使用Pillow、tesseract-ocr与pytesseract模块的图片识别的方法
Feb 26 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 Python
python爬虫中url管理器去重操作实例
Nov 30 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 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/06/30 PHP
jQuery 可以拖动的div实现代码 脚本之家修正版
2009/06/26 Javascript
JQuery 学习笔记 选择器之二
2009/07/23 Javascript
js 纯数字不重复排列的另类方法
2010/07/17 Javascript
善用事件代理,警惕闭包的性能陷阱。
2011/01/20 Javascript
Javascript 检测键盘按键信息及键码值对应介绍
2013/01/03 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
修改或扩展jQuery原生方法的代码实例
2015/01/13 Javascript
使用javascript实现雪花飘落的效果
2015/01/13 Javascript
JS简单计算器实例
2015/01/20 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
JavaScript使用FileReader实现图片上传预览效果
2020/03/27 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
微信小程序排坑指南详解
2018/05/23 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
bootstrap下拉分页样式 带跳转页码
2018/12/29 Javascript
Python内置函数 next的具体使用方法
2017/11/24 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
2020/04/02 Python
python实现文字版扫雷
2020/04/24 Python
Django框架请求生命周期实现原理
2020/11/13 Python
python 6种方法实现单例模式
2020/12/15 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
初中考试作弊检讨书
2014/02/01 职场文书
党员干部承诺书
2014/03/25 职场文书
儿童生日会策划方案
2014/05/15 职场文书
胡雪岩故居导游词
2015/02/06 职场文书
什么是SOLID
2022/03/24 Javascript