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删除java文件头上版权信息的方法
Jul 31 Python
python实现颜色rgb和hex相互转换的函数
Mar 19 Python
在Python的循环体中使用else语句的方法
Mar 30 Python
Python实现简单的用户交互方法详解
Sep 25 Python
Python3中列表list合并的四种方法
Apr 19 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
Python常用数据类型之间的转换总结
Sep 06 Python
python kafka 多线程消费者&手动提交实例
Dec 21 Python
python读取Kafka实例
Dec 23 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
matplotlib自定义鼠标光标坐标格式的实现
Jan 08 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/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
2014/06/23 PHP
PHP语法小结之基础和变量
2015/11/22 PHP
分享php邮件管理器源码
2016/01/06 PHP
javascript 计算两个整数的百分比值
2009/12/26 Javascript
jQuery 复合选择器应用的几个例子
2014/09/11 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
jQuery对于显示和隐藏等常用状态的判断方法
2014/12/13 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
IE8兼容Jquery.validate.js的问题
2016/12/01 Javascript
bootstrap配合Masonry插件实现瀑布式布局
2017/01/18 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
fullpage.js最后一屏滚动方式
2018/02/06 Javascript
nodejs搭建本地服务器轻松解决跨域问题
2018/03/21 NodeJs
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
angular4 获取wifi列表中文显示乱码问题的解决
2018/10/20 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
2020/06/29 Javascript
对于Python的框架中一些会话程序的管理
2015/04/20 Python
使用python加密自己的密码
2015/08/04 Python
pandas dataframe添加表格框线输出的方法
2019/02/08 Python
python实现猜数游戏(保存游戏记录)
2020/06/22 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python 如何调用远程接口
2020/09/11 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
2015/09/21 HTML / CSS
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
赞美老师的演讲稿
2014/05/22 职场文书
人事文员岗位职责
2015/02/04 职场文书
医生行业员工的辞职信
2019/06/24 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript