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类中super()和__init__()的区别
Oct 18 Python
Python3安装Pymongo详细步骤
May 26 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python如何生成树形图案
Jan 03 Python
详解js文件通过python访问数据库方法
Mar 03 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
Pygame的程序开始示例代码
May 07 Python
python 多进程和协程配合使用写入数据
Oct 30 Python
Python 转移文件至云对象存储的方法
Feb 07 Python
Python LMDB库的使用示例
Feb 14 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
GD输出汉字的函数的分析
2006/10/09 PHP
基于php下载文件的详解
2013/06/02 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
laravel5.5安装jwt-auth 生成token令牌的示例
2019/10/24 PHP
jquery 文本上下无缝滚动,鼠标放上去就停止 小例子
2013/06/05 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
js转换对象为xml
2017/02/17 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
基于js 本地存储(详解)
2017/08/16 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
简单说说angular.json文件的使用
2018/10/29 Javascript
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
vue.js实现会动的简历(包含底部导航功能,编辑功能)
2019/04/08 Javascript
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python绘制KS曲线的实现方法
2018/08/13 Python
python 检查文件mime类型的方法
2018/12/08 Python
python获取交互式ssh shell的方法
2019/02/14 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
浅析Python 条件控制语句
2020/07/15 Python
Python return语句如何实现结果返回调用
2020/10/15 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
Love, Bonito国际官网:新加坡女装品牌
2021/03/13 全球购物
仓管员岗位职责范文
2013/11/08 职场文书
自我介绍演讲稿
2014/01/15 职场文书
总经理任命书
2014/03/29 职场文书
简易离婚协议书范本2014
2014/10/15 职场文书
写给妈妈的感谢信
2015/01/22 职场文书
部门经理迟到检讨书
2015/02/16 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书