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正则表达式re模块详解
Jun 25 Python
跟老齐学Python之赋值,简单也不简单
Sep 24 Python
Python编程修改MP3文件名称的方法
Apr 19 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
Python实现动态图解析、合成与倒放
Jan 18 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
python实现年会抽奖程序
Jan 22 Python
Python+OpenCV图片局部区域像素值处理详解
Jan 23 Python
使用python读取.text文件特定行的数据方法
Jan 28 Python
用Python生成HTML表格的方法示例
Mar 06 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
python办公自动化之excel的操作
May 23 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
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
PHP捕获Fatal error错误的方法
2014/06/11 PHP
PHP封装的分页类与简单用法示例
2019/02/25 PHP
网页设计常用的一些技巧
2006/12/22 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
解析Jquery的LigerUI如何实现文件上传
2013/07/09 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
jQuery+HTML5实现弹出创意搜索框层
2016/12/29 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
2017/01/22 Javascript
Angular.Js之Scope作用域的学习教程
2017/04/27 Javascript
详解angular中的作用域及继承
2017/05/31 Javascript
微信小程序 上传头像的实例详解
2017/10/27 Javascript
React中的refs的使用教程
2018/02/13 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
移动端 Vue+Vant 的Uploader 实现上传、压缩、旋转图片功能
2019/06/10 Javascript
vue实现一个矩形标记区域(rectangle marker)的方法
2020/10/28 Javascript
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
Python中%r和%s的详解及区别
2017/03/16 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
三维科技面试题
2013/07/27 面试题
制衣厂各岗位职责
2013/12/02 职场文书
校友会欢迎辞
2014/01/13 职场文书
创业计划实施的7大步骤
2014/02/05 职场文书
上市公司董事长岗位职责
2015/04/16 职场文书
幼儿园安全教育月活动总结
2015/05/08 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电