OpenCV角点检测的实现示例
作者:山居秋暝LS 发布时间:2023-06-25 06:49:10
Harris 角点检测算法
1. 角点
角点是水平方向、垂直方向变化都很大的像素。
角点检测算法的基本思想:
使用一个固定窗口在图像上进行任意方向上的滑动,比较滑动前与滑动后两种情况,窗口中的像素灰度变化程度,如果存在任意方向上的滑动,都有着较大灰度变化,那么我们可以认为该窗口中存在角点。
目前,角点检测算法还不是十分完善,许多算法需要依赖大量的训练集和冗余数据来防止和减少错误的特征的出现。对于角点检测算法的重要评价标准是:其对多幅图像中相同或者相似特征的检测能力,并且能够应对光照变化、或者图像旋转等影响。
关于角点的具体描述可以有几种:
一阶导数(即灰度的梯度)的局部最大所对应的像素点;
两条及两条以上边缘的交点;
图像中梯度值和梯度方向的变化速率都很高的点;
角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。
三类角点检测算法:
基于二值图像的角点检测;
基于轮廓曲线的角点检测;
基于灰度图像的角点检测:基于梯度、基于模板和基于模板和梯度组合三类方法;常见的基于模板的角点检测算法有:Kitchen-Rosenfeld角点检测算法,Harris角点检测算法,KLT角点检测算法及SUSAN角点检测算法。基于模板的方法主要是考虑像素领域点灰度的变化,即亮度的变化。
2. 流程
(1)找出角点
用高斯算子求出像素水平方向和垂直方向的梯度dx, dy,–> 对梯度的平方dxdx ,dydy, dxdy滤波得到Wxx ,Wxy,Wyy --> 在求的(WxxWyy - Wxy**2)/(Wxx + Wyy)作为候选角点。
(2)筛选角点
根据阈值筛选角点–> 取得角点的坐标 -->根据角点坐标得到角点所在的行 --> 在角点周围,删除掉其他角点。–> result
(3)标记角点
3. 实现
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import filters
## 1.找出角点
### 1.1 步骤:img求导 --> imx ,imy 滤波-->Wxx ,Wxy,Wyy --> (Wxx*Wyy - Wxy**2)/(Wxx + Wyy)
def compute_harris_response(img,sigma=3):
# 求梯度
imgx,imgy = np.zeros(img.shape),np.zeros(img.shape)
filters.gaussian_filter(img,(sigma,sigma),(0,1),imgx)
filters.gaussian_filter(img,(sigma,sigma),(1,0),imgy) # [260,263]
# 对梯度进行高斯滤波
wxx = filters.gaussian_filter(imgx**2,sigma)
wyy = filters.gaussian_filter(imgy**2,sigma) # [260,263]
wxy = filters.gaussian_filter(imgx*imgy,sigma)# [260,263]
## 求行列式和迹
wdet = wxx*wyy -wxy**2
wtr = wxx + wyy
return wdet/wtr
## 2 筛选角点
### 2.1 步骤:根据阈值筛选角点--> 取得角点的坐标 -->根据角点坐标得到角点所在的行 -->
# --> 在角点周围,删除掉其他角点
def get_harris_points(harri,min_dist=4,threshold=0.1):
corner_thre = harri.max()*threshold # 角点阈值
mask = (harri > corner_thre)*1 # 取出大于阈值的点为候选角点
cords = np.array(mask.nonzero()).T # 取候选角点的坐标
values = [harri[i[0],i[1]] for i in cords] # 候选角点的值
cls = np.argsort(values) # 对角点排序得到排序后的序列号,序列号也是候选角点所在的行
loc = np.zeros(harri.shape) # 划出可行性区域
loc[min_dist:-min_dist,min_dist:-min_dist] = 1
re_cords = []
for i in cls: # 筛选角点。先取出角点,角点周围的点不再取出
if loc[cords[i,0],cords[i,1]] == 1 :
re_cords.append(cords[i])
loc[cords[i,0]-min_dist:cords[i,0]+min_dist,cords[i,1]-min_dist:cords[i,1]+min_dist]=0
return re_cords
def plot_harri(img,cords):
plt.figure()
plt.gray()
plt.imshow(img)
plt.plot([i[1] for i in cords],[i[0] for i in cords],'.')
plt.axis('off')
plt.show()
## 3 测试
if __name__ == '__main__':
img = np.array(Image.open('luna.png').convert('L'))
harri = compute_harris_response(img)
re_cords = get_harris_points(harri)
plot_harri(img,re_cords)
来源:https://blog.csdn.net/qq_35732321/article/details/123717928


猜你喜欢
- 之前的博客里使用tf读取数据都是每次fetch一条记录,实际上大部分时候需要fetch到一个batch的小批量数据,在tf中这一操作的明显变
- 固定路由的面包屑导航我们在配置router的时候,可以将面包屑数据配置在meta中,例如路由配置:{ path: '/p
- 问题有二进制文件中保存了 20 亿个 2 Bytes 的数,需将其读出,每 20000 个数作图,拟合后输出结果。解决# -*- codin
- 1. 编码问题:遇到了几个字符串转换问题,总结如下:# str to bytes str.encode(s)# bytes to str b
- 导语嘿!前不久刚刚给大家过一款反弹球的小游戏嘛!不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款打砖块的小游戏,界
- 本文实例讲述了Python切片操作。分享给大家供大家参考,具体如下:我们基本上都知道Python的序列对象都是可以用索引号来引用的元素的,索
- 创建一个dataframe结构import pandas as pddf = pd.DataFrame( data
- 一、导入所需的库import randomimport cv2from matplotlib import pyplot as pltimp
- Django中如何在Model保存前做一定的固定操作,比如写一句日志?关键词: 信号利用Django的Model的Signal Dispat
- Git是一个开源的分布式版本控制系统,用于高效的管理各种大小项目和文件。有着管理多样化、分享速度快、数据
- 今天我们会讲到一个[装饰器]注记:链接“装饰器”指Python3教程中的装饰器教程。可以在这里快速了解什么是装饰器。@functools.l
- 1.说明:复制表(只复制结构,源表名:a 新表名:b)SQL: select * into b&nb
- 实验结论如果需要在循环结束后获得结果,推荐列表解析;如果不需要结果,直接使用for循环, 列表解析可以备选;除了追求代码优雅和特定规定情境,
- 今日上课,有位同学问到:w和w+有何区别呢。说实话,我们经常只是用一种权限,没用在意之间的区别,实际上,w+具有可读可写权限,而w只有可写权
- 关于opencvOpenCV 是 Intel 开源计算机视觉库 (Computer Version) 。它由一系列 C 函数和少量 C++
- PHP 过滤器PHP 过滤器用于验证和过滤来自非安全来源的数据,比如用户的输入。什么是 PHP 过滤器PHP 过滤器用于验证和过滤来自非安全
- 一、MySQL中如何表示当前时间?其实,表达方式还是蛮多的,汇总如下:CURRENT_TIMESTAMPCURRENT_TIMESTAMP(
- 代码很简洁,功能很实用,这里就不多废话了,直接给大家奉上代码:/** * Created by Administrator on 15-1-
- 我见到有的网站好像可以把数据库的记录读到表格里去,是这样的吗?如何做到的?可能是这样的,因为我们确实能把数据库里的记录用表格来储存,看看下面
- 1,使用到的第三方库requestsBeautifulSoup 美味汤worldcloud 词云jieba 中文分词matplotlib 绘