OpenCV 13(模版匹配和霍夫变换)

news2024/11/24 1:53:12

一、模版匹配

所谓的模板匹配,就是在给定的图片中查找和模板最相似的区域,该算法的输入包括模板和图片,整个任务的思路就是按照滑窗的思路不断的移动模板图片,计算其与图像中对应区域的匹配度,最终将匹配度最高的区域选择为最终的结果。

将模板块每次移动一个像素 (从左往右,从上往下),在每一个位置,都计算与模板图像的相似程度。

对于每一个位置将计算的相似结果保存在结果矩阵(R)中。如果输入图像的大小(WxH)且模板图像的大小(wxh),则输出矩阵R的大小为(W-w + 1,H-h + 1)将R显示为图像,如下图所示

 获得上述图像后,查找最大值所在的位置,那么该位置对应的区域就被认为是最匹配的。对应的区域就是以该点为顶点,长宽和模板图像一样大小的矩阵。

1.1 API

res = cv.matchTemplate(img,template,method)
  • img: 要进行模板匹配的图像
  • Template :模板
  • method:实现模板匹配的算法,主要有:
    1. 平方差匹配(CV_TM_SQDIFF):利用模板与图像之间的平方差进行匹配,最好的匹配是0,匹配越差,匹配的值越大。
    2. 相关匹配(CV_TM_CCORR):利用模板与图像间的乘法进行匹配,数值越大表示匹配程度较高,越小表示匹配效果差。
    3. 利用相关系数匹配(CV_TM_CCOEFF):利用模板与图像间的相关系数匹配,1表示完美的匹配,-1表示最差的匹配。

通过matchTemplate实现模板匹配,使用minMaxLoc定位最匹配的区域,并用矩形标注最匹配的区域。

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
# 1 图像和模板读取
img = cv.imread('./image/wulin2.jpeg')
template = cv.imread('./image/wulin.jpeg')
h,w,l = template.shape
# 2 模板匹配
# 2.1 模板匹配
res = cv.matchTemplate(img, template, cv.TM_CCORR)
# 2.2 返回图像中最匹配的位置,确定左上角的坐标,并将匹配位置绘制在图像上
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
# 使用平方差时最小值为最佳匹配位置
# top_left = min_loc
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img, top_left, bottom_right, (0,255,0), 2)
# 3 图像显示
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'), plt.xticks([]), plt.yticks([])
plt.show()

模板匹配不适用于尺度变换,视角变换后的图像,这时我们就要使用关键点匹配算法,比较经典的关键点检测算法包括SIFT和SURF等,主要的思路是首先通过关键点检测算法获取模板和测试图片中的关键点;然后使用关键点匹配算法处理即可,这些关键点可以很好的处理尺度变化、视角变换、旋转变化、光照变化等,具有很好的不变性。

二、霍夫变换

霍夫变换常用来提取图像中的直线和圆等几何形状

2.1 原理

在笛卡尔坐标系中,一条直线由两个点A=(x​1​​,y​1​​)和B=(x​2​​,y​2​​)确定,如下图所示:

将直线y=kx+q可写成关于(k,q)的函数表达式:

对应的变换通过图形直观的表示下:

变换后的空间我们叫做霍夫空间。即:笛卡尔坐标系中的一条直线,对应于霍夫空间中的一个点。反过来,同样成立,霍夫空间中的一条线,对应于笛卡尔坐标系中一个点,如下所示:

2.1.1 点共线的情况,对应于霍夫空间的情形

在笛卡尔坐标系的点共线,那么这些点在霍夫空间中对应的直线交于一点

2.1.2 点不共线情况

似乎已经完成了霍夫变换的求解。但如果像下图这种情况时(斜率不存在):

上图中的直线是 x=2,那 (k,q)怎么确定呢?

为了解决这个问题,我们考虑将笛卡尔坐标系转换为极坐标

在极坐标下是一样的,极坐标中的点对应于霍夫空间的线,这时的霍夫空间是不在是参数(k,q)的空间,而是(ρ,θ)的空间,ρ是原点到直线的垂直距离,θ表示直线的垂线与横轴顺时针方向的夹角,垂直线的角度为0度,水平线的角度是180度。

只要求得霍夫空间中的交点的位置,即可得到原坐标系下的直线

 

2.2 霍夫变换检测线

假设有一个大小为100∗∗100的图片,使用霍夫变换检测图片中的直线,则步骤如下所示:

直线都可以使用 (ρ,θ) 表示,首先创建一个2D数组,我们叫做累加器,初始化所有值为0,行表示 ρ ,列表示 θ 。

该数组的大小决定了结果的准确性,若希望角度的精度为1度,那就需要180列。对于 ρ,最大值为图片对角线的距离,如果希望精度达到像素级别,行数应该与图像的对角线的距离相等。

  • 取直线上的第一个点 (x,y),将其带入直线在极坐标中的公式中,然后遍历 θ的取值:0,1,2,...,180,分别求出对应的 ρ值,如果这个数值在上述累加器中存在相应的位置,则在该位置上加1.

  • 取直线上的第二个点,重复上述步骤,更新累加器中的值。对图像中的直线上的每个点都直线以上步骤,每次更新累加器中的值。

  • 搜索累加器中的最大值,并找到其对应的 (ρ,θ),就可将图像中的直线表示出来。

cv.HoughLines(img, rho, theta, threshold)
  • img: 检测的图像,要求是二值化的图像,所以在调用霍夫变换之前首先要进行二值化,或者进行Canny边缘检测

  • rho、theta:  ρ 和θ的精确度

  • threshold: 阈值,只有累加器中的值高于该阈值时才被认为是直线。

霍夫线检测的整个流程如下图所示

1、检测图中的点

2、对检测出来的每个点进行遍历,每个点对应于霍夫空间中的一条曲线

3、所有点在霍夫空间中的曲线中, 相交最多的交点求出

4、这样就得到了图像中的线

import numpy as np
import random
import cv2 as cv
import matplotlib.pyplot as plt
# 1.加载图片,转为二值图
img = cv.imread('./image/rili.jpg')

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
edges = cv.Canny(gray, 50, 150)

# 2.霍夫直线变换
lines = cv.HoughLines(edges, 0.8, np.pi / 180, 150)
# 3.将检测的线绘制在图像上(注意是极坐标噢)
for line in lines:
    rho, theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))
    cv.line(img, (x1, y1), (x2, y2), (0, 255, 0))
# 4. 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title('霍夫变换线检测')
plt.xticks([]), plt.yticks([])
plt.show()

2.3 霍夫变换检测圆

圆的表示式是:

其中 a和 b表示圆心坐标, r表示圆半径,因此标准的霍夫圆检测就是在这三个参数组成的三维空间累加器上进行圆形检测,此时效率就会很低,所以OpenCV中使用霍夫梯度法进行圆形的检测。

霍夫梯度法将霍夫圆检测范围两个阶段,第一阶段检测圆心,第二阶段利用圆心推导出圆半径。

  • 圆心检测的原理:圆心是圆周法线的交汇处,设置一个阈值,在某点的相交的直线的条数大于这个阈值就认为该交汇点为圆心。

  • 圆半径确定原理:圆心到圆周上的距离(半径)是相同的,确定一个阈值,只要相同距离的数量大于该阈值,就认为该距离是该圆心的半径

原则上霍夫变换可以检测任何形状,但复杂的形状需要的参数就多,霍夫空间的维数就多,因此在程序实现上所需的内存空间以及运行效率上都不利于把标准霍夫变换应用于实际复杂图形的检测中。霍夫梯度法是霍夫变换的改进,它的目的是减小霍夫空间的维度,提高效率。

circles = cv.HoughCircles(image, method, dp, minDist, param1=100, param2=100, minRadius=0,maxRadius=0 )
  • image:输入图像,应输入灰度图像

  • method:使用霍夫变换圆检测的算法,它的参数是CV_HOUGH_GRADIENT

  • dp:霍夫空间的分辨率,dp=1时表示霍夫空间与输入图像空间的大小一致,dp=2时霍夫空间是输入图像空间的一半,以此类推

  • minDist为圆心之间的最小距离,如果检测到的两个圆心之间距离小于该值,则认为它们是同一个圆心

  • param1:边缘检测时使用Canny算子的高阈值,低阈值是高阈值的一半。

  • param2:检测圆心和确定半径时所共有的阈值

  • minRadius和maxRadius为所检测到的圆半径的最小值和最大值

返回:

  • circles:输出圆向量,包括三个浮点型的元素——圆心横坐标,圆心纵坐标和圆半径

由于霍夫圆检测对噪声比较敏感,所以首先对图像进行中值滤波。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 1 读取图像,并转换为灰度图
planets = cv.imread("./image/star.jpeg")
gay_img = cv.cvtColor(planets, cv.COLOR_BGRA2GRAY)
# 2 进行中值模糊,去噪点
img = cv.medianBlur(gay_img, 7)  
# 3 霍夫圆检测
circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1, 200, param1=100, param2=30, minRadius=0, maxRadius=100)
# 4 将检测结果绘制在图像上
for i in circles[0, :]:  # 遍历矩阵每一行的数据
    # 绘制圆形
    cv.circle(planets, (i[0], i[1]), i[2], (0, 255, 0), 2)
    # 绘制圆心
    cv.circle(planets, (i[0], i[1]), 2, (0, 0, 255), 3)
# 5 图像显示
plt.figure(figsize=(10,8),dpi=100)
plt.imshow(planets[:,:,::-1]),plt.title('霍夫变换圆检测')
plt.xticks([]), plt.yticks([])
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1068761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三相PWM整流器有限集模型预测电流控制Simulink仿真模型

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

正点原子嵌入式linux驱动开发——U-boot移植

uboot的移植并不是说从零开始将uboot移植到所使用的开发板或者开发平台上。这个对于我们开发者来说基本是不可能的,这个工作一般是半导体厂商做的,半导体厂商负责将uboot移植到他们的芯片上,因此半导体厂商都会自己做一个开发板,这…

平台项目首页——左侧菜单栏实现(三)

这里写目录标题 一、页面布局设计二、左侧菜单栏设计1、注意2、使用组件1、导入组件2、注册组件3、使用组件 3、用户信息代码设计4、左侧菜单代码设计5、用户信息——注销登录和切换项目功能实现 三、嵌套路由实现1、配置home的嵌套路由(子路由)2、home中…

Python-将常用库写入到一个Python程序里面,后续使用直接导入这个文件即可,就相当于导入了所有的库,就不用每次都写一堆的import了

sys.path.append(rD:\Backup\Documents) # 上方代码中的这一句 是我的常用库 所在的文件路径 当然,文件名建议写英文(比如:Common_use_lib.py), 不要写:常用库... 我这里只是演示使用,方便理…

机器学习笔记 - 基于pytorch、grad-cam的计算机视觉的高级可解释人工智能

一、pytorch-gradcam简介 ​Grad-CAM是常见的神经网络可视化的工具,用于探索模型的可解释性,广泛出现在各大顶会论文中,以详细具体地描述模型的效果。Grad-CAM的好处是,可以在不额外训练的情况下,只使用训练好的权重即可获得热力图。 1、CAM是什么? CAM全称Class Activa…

GitHub工具之云资产管理

文章目录 0x01 介绍0x02 软件架构0x03 下载地址0x04 更新记录0x05 实现功能0x06 使用截图1、云存储工具-资产列表2、云存储工具-阿里云3、云存储工具-七牛云4、云存储工具-腾讯云5、云存储工具-亚马逊6、云存储工具-京东云7、云存储工具-金山云8、云存储工具-其他9、云存储工具…

java项目中git的.ignore文件设置

在Git中,ignore是用来指定Git应该忽略的故意不被追踪的文件。它并不影响已经被Git追踪的文件。我们可以通过.ignore文件在Git中指定要忽略的文件。 当我们执行git add命令时,Git会检查.gitignore文件,并自动忽略这些文件和目录。这样可以避免…

AT9110H-单通道低压 H桥电机驱动芯片

AT9110H能够驱动一个直流有刷电机或其它诸如螺线管的器件。输出驱动模块由PMOSNMOS功率管构成的H桥组成,以驱动电机绕组。AT9110H能够提供高达12V1A的驱动输出。 AT9110H是SOP8封装,且是无铅产品,符合环保标准。 AT9110H具有一个PWM (IN1/IN2…

【SWAT水文模型】SWAT水文模型建立及应用第七期:SWAT模型检验

SWAT水文模型检验 方式1:参数带回至ArcSWAT方式1.1:文件替换方式1.2:手动修改方式1.3: 方式2:于SWAT CUP中确定检验期结果方式2.1:率定期径流数据验证方式2.2:率定期检验期径流数据验证 总结参考…

九章云极DataCanvas公司完成D1轮融资

近日,九章云极DataCanvas公司完成总融资额3亿元D1轮融资。中国电子集团旗下中电智慧基金、华民投、中国太平旗下太平创新、浙江东方旗下东方嘉富等央国企旗下投资机构,以及卓源资本等专注人工智能赛道的知名财务投资机构参与本轮融资。 九章云极DataCan…

智慧驿站:为城市带来全新智慧公厕未来形态

随着城市发展和科技进步的不断推进,智慧公厕逐渐成为城市规划和公共设施建设的重要组成部分。而集合了创意的外观设计、全金属结构工艺、智慧公厕、自动售货、共享设备、广告大屏、小型消防站、小型医疗站,并能根据需要而灵活组合的智慧驿站成为其中重要…

Spring AOP 中被代理的对象一定是单例吗?

今天我们来思考这样一个问题:在 Spring AOP 中,被代理的对象是单例的吗?当我们每次获取到代理对象的时候,都会重新获取一个新的被代理对象吗?还是被代理的对象始终是同一个? 为什么要思考这个问题&#xf…

2023,社交进入大变革时代

社交赛道的发展似乎没有终局,尤其AIGC这一概念出现之后,社交有可能将迎来全新场景。那么在技术的助推下,社交赛道是否有可能跑出下一个超级APP?如何看待2023年的社交赛道变革?不妨来看看本文的解读。 2023社交还有新故…

springboot-admin整合及使用

0. 官方文档及示例 官方文档 示例代码:Spring-Boot-Admin-Demo 1. 概述 Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应用程序可以通过 http 的方式,或 Spring Cloud 服务发现机制注册到 SBA 中,然…

读书笔记——C++高性能编程(一至三)

《C高性能编程》作者:费多尔.G.皮克斯 版本:2022年11月第1版 第一章.性能基础 描述了吞吐量,功耗,实时应用性能的含义。 阐述了“虽然几乎不可能提前预测最佳优化,但是可以确定某些设计决策将使后续优化变得非常困难…

SSCI及SCI撰写|立足于审稿进行论文修改

一、回复审稿意见视角下的论文改进 (一)常见审稿意见分类(改进向) 意见分类研究主题方面真实案例研究主题研完没有提供新的信息This is clearly a students paper Although it is adequately written it offers no new informat…

Python Parser 因子计算性能简单测试

一直以来,Python 都在量化金融领域扮演着至关重要的角色。得益于 Python 强大的库和工具,用户在处理金融数据、进行数学建模和机器学习时变得更加便捷。但作为一种解释性语言,相对较慢的执行速度也限制了 Python 在一些需要即时响应的场景中的…

【nvm】Node Version Manager(NVM)安装配置以及使用(WIN版)

NVM 包管理工具 安装 访问NVM-Windows的GitHub页面:点击nvm-setup.exe。 根据提示进行下一步,文件位置选择自定义位置 验证安装是否成功 nvm version 。如果成功,它将显示NVM的版本号。 使用 nvm list available查看所有的可以被下载…

【LeetCode: 2034. 股票价格波动 | 有序表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

基于SSM的学院学生论坛系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…