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中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
Oct 23 Python
python实现用于测试网站访问速率的方法
May 26 Python
python 字符串和整数的转换方法
Jun 25 Python
python 字符串只保留汉字的方法
Nov 16 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
python各种excel写入方式的速度对比
Nov 10 Python
pyspark对Mysql数据库进行读写的实现
Dec 30 Python
python爬虫之爬取笔趣阁小说
Apr 22 Python
TensorFlow的自动求导原理分析
May 26 Python
python 爬取华为应用市场评论
May 29 Python
Python利用机器学习算法实现垃圾邮件的识别
Jun 28 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
其他功能
2006/10/09 PHP
模板引擎Smarty深入浅出介绍
2006/12/06 PHP
jquery限制输入字数,并提示剩余字数实现代码
2012/12/24 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
得到jQuery detach()后节点中的某个值实现代码
2013/02/05 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
jquery组件WebUploader文件上传用法详解
2020/10/23 Javascript
js实现按座位号抽奖
2017/04/05 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
JQuery判断radio单选框是否选中并获取值的方法
2019/01/17 jQuery
vue实现一拉到底的滑动验证
2019/07/25 Javascript
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
2020/04/29 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
原生js生成图片验证码
2020/10/11 Javascript
js实现碰撞检测
2021/01/29 Javascript
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
Django 使用logging打印日志的实例
2018/04/28 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
python连接PostgreSQL过程解析
2020/02/09 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
matplotlib 三维图表绘制方法简介
2020/09/20 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
三年级音乐教学反思
2014/01/28 职场文书
学生打架检讨书
2014/02/14 职场文书
《春到梅花山》教学反思
2014/04/16 职场文书
班级学习计划书
2014/04/27 职场文书
需求分析说明书
2014/05/09 职场文书
Vue如何实现组件间通信
2021/05/15 Vue.js
Python 用户输入和while循环的操作
2021/05/23 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers