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批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python实现感知器
Dec 19 Python
实例讲解python中的序列化知识点
Oct 08 Python
Python中修改字符串的四种方法
Nov 02 Python
python 批量解压压缩文件的实例代码
Jun 27 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
Python进度条的制作代码实例
Aug 31 Python
pytorch 实现tensor与numpy数组转换
Dec 27 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Pycharm编辑器功能之代码折叠效果的实现代码
Oct 15 Python
Python实现自动玩连连看的脚本分享
Apr 04 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实现查询百度google收录情况(示例代码)
2013/08/02 PHP
非常实用的PHP常用函数汇总
2014/12/17 PHP
PHP Streams(流)详细介绍及使用
2015/05/12 PHP
帝国cms常用标签汇总
2015/07/06 PHP
php is_executable判断给定文件名是否可执行实例
2016/09/26 PHP
jquery cookie插件代码类
2009/05/26 Javascript
javascript 面向对象编程基础:封装
2009/08/21 Javascript
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
2016/12/08 Javascript
微信小程序登录时如何获取input框中的内容
2019/12/04 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
python中bisect模块用法实例
2014/09/25 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python实现的大数据分析操作系统日志功能示例
2019/02/11 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
python获取txt文件词向量过程详解
2019/07/05 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
python画图常规设置方式
2020/03/05 Python
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
大学生简单自荐信
2013/11/10 职场文书
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
学前教育求职自荐信范文
2013/12/25 职场文书
有关环保的标语
2014/06/13 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书