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学习笔记之os模块使用总结
Nov 03 Python
Python字符串中查找子串小技巧
Apr 10 Python
python实现自动更换ip的方法
May 05 Python
python检测某个变量是否有定义的方法
May 20 Python
在cmd中运行.py文件: python的操作步骤
May 12 Python
python如何生成各种随机分布图
Aug 27 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
python实现简单五子棋游戏
Jun 18 Python
Django admin model 汉化显示文字的实现方法
Aug 12 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
python中def是做什么的
Jun 10 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
用于deeplink的js方法(判断手机是否安装app)
2014/04/02 Javascript
js检测输入内容全为空格的方法
2014/05/03 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
2015/03/03 Javascript
JQuery报错Uncaught TypeError: Illegal invocation的处理方法
2015/03/13 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
关于vue里页面的缓存详解
2019/11/04 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
Python实现网站注册验证码生成类
2017/06/08 Python
python 调用c语言函数的方法
2017/09/29 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
python tkinter图形界面代码统计工具
2019/09/18 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
tensorflow 实现打印pb模型的所有节点
2020/01/23 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
BRASTY捷克:购买香水、化妆品、手袋和手表
2017/07/12 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
C/C++程序员常见面试题一
2012/12/08 面试题
企业消防安全制度
2014/02/02 职场文书
如何写好建议书
2014/03/13 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
小学运动会加油词
2015/07/18 职场文书