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程序员开发中常犯的10个错误
Jul 07 Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 Python
Python与Redis的连接教程
Apr 22 Python
基于Python3.6+splinter实现自动抢火车票
Sep 25 Python
Django-Rest-Framework 权限管理源码浅析(小结)
Nov 12 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
在Python 中实现图片加框和加字的方法
Jan 26 Python
python内存动态分配过程详解
Jul 15 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
python 图像插值 最近邻、双线性、双三次实例
Jul 05 Python
celery在python爬虫中定时操作实例讲解
Nov 27 Python
Python常用断言函数实例汇总
Nov 30 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上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php通过PHPExcel导入Excel表格到MySQL数据库的简单实例
2016/10/29 PHP
PHP中类的自动加载的方法
2017/03/17 PHP
用jquery设置按钮的disabled属性的实现代码
2010/11/28 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
原生js实现日历效果
2020/03/02 Javascript
Electron整合React使用搭建开发环境的步骤详解
2020/06/07 Javascript
[01:01:22]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python聊天程序实例代码分享
2013/11/18 Python
python正则分析nginx的访问日志
2017/01/17 Python
使用Python的package机制如何简化utils包设计详解
2017/12/11 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
科颜氏加拿大官方网站: Kiehl’s加拿大
2016/08/16 全球购物
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
什么是URL
2015/12/13 面试题
党性观念心得体会
2014/09/03 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
就业协议书范本
2014/10/08 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python