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中使用第三方库xlutils来追加写入Excel文件示例
Apr 05 Python
Python映射拆分操作符用法实例
May 19 Python
Python yield 使用方法浅析
May 20 Python
Python学习思维导图(必看篇)
Jun 26 Python
python使用super()出现错误解决办法
Aug 14 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
python将时分秒转换成秒的实例
Dec 07 Python
Python Gluon参数和模块命名操作教程
Dec 18 Python
python实现简单坦克大战
Mar 27 Python
python 数据分析实现长宽格式的转换
May 18 Python
python实现计算器简易版
Dec 17 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缓存技术介绍
2006/11/25 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
Mac OS下配置PHP+MySql环境
2015/02/25 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP连接access数据库
2015/03/27 PHP
php处理静态页面:页面设置缓存时间实例
2017/06/22 PHP
IE Firefox 使用自定义标签的区别
2009/10/15 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
实现一个简单的vue无限加载指令方法
2017/01/10 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
Vue实现带进度条的文件拖动上传功能
2018/02/23 Javascript
React中的render何时执行过程
2018/04/13 Javascript
基于vue通用表单解决方案的思考与分析
2019/03/16 Javascript
vue router 用户登陆功能的实例代码
2019/04/24 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
Python实现的检测web服务器健康状况的小程序
2014/09/17 Python
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
python 识别图片中的文字信息方法
2018/05/10 Python
详解Python中的四种队列
2018/05/21 Python
python3使用flask编写注册post接口的方法
2018/12/28 Python
python打印异常信息的两种实现方式
2019/12/24 Python
面向对象概念面试题(.NET)
2016/11/04 面试题
初中生自我鉴定
2014/02/04 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
2014年国庆节广播稿
2014/09/19 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
十岁生日答谢词
2015/01/05 职场文书
公司放假通知怎么写
2015/04/15 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
python周期任务调度工具Schedule使用详解
2021/11/23 Python