广义霍夫变换和模板匹配的不同

news2024/11/14 18:25:40

简述

说到霍夫变换,做图像的知道经典霍夫变换最常用于检测规则曲线,如直线、圆、椭圆。而广义霍夫变换是为了检出那些无法写出解析式的不规则形状,虽然在深度学习大行其道的时代,霍夫变换也还是有很多应用场景,另外广义霍夫变换本质上也是一种模板匹配算法。

很多时候模板匹配可以理解为,再大图中找小图,实际上广义霍夫变换也差不多是这个意思,只不过两个实现方式不是一样的。模板匹配是类似拿着小图在大图上滑动,寻找最契合就是匹配度最高的区域,比如OpenCV提供了几种计算距离的算法。而广义霍夫变换是根据膜版预先找到一组向量,然后遍历大图的所有边缘点,找所有跟这一组向量最接近的中心点。

模板匹配的原理可以看下面这个兄弟的博客,很简明。

opencv 模板匹配_浅谈opencv模板匹配算法原理_weixin_39707201的博客-CSDN博客

广义霍夫变换

第 1 步:预处理模板和待匹配两个图像(查找边缘及其方向,x,y方向的导数),实际就是模板提取边缘并二值化。

第 2 步:模板形状规范(计算 r 表),实际就是针对模板图像设立一个参考点, 并统计各个边缘点相对参考点构成的向量, 存储到R-table中,边缘点梯度方向的参考点。

步骤3:查找(累积)图像上模板的所有可能位置并找到最常用的中心。对照模板图像的R-table, 我们对待匹配图像上的每一个边缘点,去减每个R-table中的向量坐标并投1票。

广义霍夫变换可用于对象识别。一个优点是该算法可用于任意形状,因为我们只需要参数化形状的轮廓。

示例参考

请看下面的参考图片,下面的图片是模板图,实际上下面左图的红点就是参考点,计算了边缘的点相对于中心点的距离和角度,并存储到R-table中。这个表中的每个条目表示一个边缘像素位置关于中心点的(r,α)的值。有了这个表,我们就可以在待匹配图像上遍历所有边缘点进行计算了。

广义霍夫变换可用于对象识别。一个优点是该算法可用于任意形状,因为我们只需要参数化形状的轮廓。缺点是计算累加器时需要大量存储和大量计算。

参考代码

以下代码来自下面的参考文章

边缘检测

def find_edge_orientation(image):

    dy = sobel(image, axis=0)
    dx = sobel(image, axis=1)
    edge_orientation = np.arctan2(dy, dx) + np.pi  # +np.pi ->  grad orientation is in the rage [0,2*pi]

    return edge_orientation

计算R表

def build_r_table(template, center_point, row_count):

    edges = canny(template)
    orientations = find_edge_orientation(edges)
    r_table = [[] for i in range(row_count)]

    for (i, j), value in np.ndenumerate(edges):
        if value:

            r = np.sqrt((center_point[0] - i) ** 2 + (center_point[1] - j) ** 2) # compute r
            alpha = np.arctan2(i - center_point[0], j - center_point[1]) + np.pi # compute alpha

            index = int(row_count * orientations[i, j] / (2 * np.pi)) # compute row index in the table

            r_table[index].append((r, alpha)) # append the value to R-table

    return r_table

查找可能的位置

def compute_accumulator_array(target_I, r_table):

  edges = canny(target_I)
  orientations = find_edge_orientation(edges)
  accumulator = np.zeros(target_I.shape)
  r_table_row_count = len(r_table)
  vals = []
  for (i, j), value in np.ndenumerate(edges):
      if value: # edge check

          index = int(r_table_row_count * orientations[i, j] / (2 * np.pi))

          r_row = r_table[index]
          for (r,alpha) in r_row:

              # finding correct position to vote
              accum_i = int(i + r * np.sin(alpha))  # y cordinate
              accum_j = int(j + r * np.cos(alpha))  # x cordinate


              # outofbound check and vote
              if accum_i < accumulator.shape[0] and accum_j < accumulator.shape[1] and accum_i > 0 and accum_j > 0:
                  accumulator[accum_i, accum_j] += 1

  return accumulator

相关参考网址

广义霍夫变换 - 知乎 (zhihu.com)

https://penny-xu.github.io/blog/generalised-hough-transform/

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

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

相关文章

2023年黑马Java入门到精通教程--面向对象

推荐教程&#xff1a;java零基础入门到精通 面向对象编程的例子 设计类&#xff0c;创建对象并使用 1. 类和对象是什么&#xff1f; 类&#xff1a;是共同特征的描述(设计图)&#xff1b;对象&#xff1a;是真实存在的具体实例。 2. 如何设计类&#xff1f; 3. 如何创建对象…

CISP-PTE-Windows2003教程

为方便后续操作&#xff0c;建议和kali在同一网段。 获取到靶机IP后&#xff0c;扫描端口&#xff0c;1433是sqlserver的 测出用户名admin&#xff0c;但是密码爆破失败 扫描目录发现配置文件 配置文件中找到数据库的用户名和密码 使用Microsoft SQL Server Studio连接&#x…

MySQL从入门到精通(第0篇):全程有动画演示,适合入门学习

B站地址 文章目录一、MySQL的系统框架1. 连接池1.1 连接模块1.2 连接池2. SQL接口、SQL解析器、SQL优化器3. 存储引擎二、MySQL数据写入原理三、MySQL存储结构1. 使用InnoDB创建表2. 详述ibd文件中的存储结构2.1 页的数据连续存储2.2 行的结构2.3 区的结构2.4 组的结构2.5 段的…

剑指 Offer 33. 二叉搜索树的后序遍历序列

题目 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true&#xff0c;否则返回 false。假设输入的数组的任意两个数字都互不相同。 思路 二叉搜索树的特点是&#xff1a;左子树的值 < 根节点 < 右子树的值后序遍历的顺序是…

【逐步剖C】第三章-数组

一、一维数组 1. 一维数组的定义与使用 &#xff08;1&#xff09;数组的简单概念&#xff1a;一组具有相同类型的元素的集合 &#xff08;2&#xff09;数组的创建&#xff1a; 格式&#xff1a;类型名数组名[数组大小] 需要注意的是&#xff1a;对多数情况而言&#xff0c;…

# Vue中的Mixin混入

Vue中的Mixin混入 将组件的公共逻辑或者配置提取出来&#xff0c;哪个组件需要用到时&#xff0c;直接将提取的这部分混入到组件内部即可。这样既可以减少代码冗余度&#xff0c;也可以让后期维护起来更加容易。 1. 什么是Mixin&#xff1f; 混入 (mixin) 混入 (mixin) 将组…

数据库分类

关系型与非关系型 关系数据库 MySQL、MariaDB&#xff08;MySQL的代替品&#xff09;、 Percona Server&#xff08;MySQL的代替品&#xff09;、PostgreSQL、 Microsoft Access、Google Fusion Tables、SQLite、DB2、FileMaker、Oracle、SQL Server、INFORMIX、Sybase、dBASE…

阿里云中间件2024届校园招聘

【团队介绍】 阿里云云原生中间件团队负责分布式软件基础设施&#xff0c;为阿里云上万家企业提供如微服务引擎、服务网格、消息服务、分布式事务等分布式基础服务&#xff0c;加速企业上云的进程和创新速度。同时&#xff0c;云原生中间件团队也服务着阿里集团众多核心业务和…

智能指针(三)—— shared_ptr 循环引用问题

shared_ptr 作为智能指针&#xff0c;可以满足大多数场景&#xff0c;对于一些特殊情况&#xff0c;可能会引发循环引用问题。 目录 1、循环引用案例分析 (1) 案例介绍 (2) 原因分析 2、weak_ptr 解决循环引用 1、循环引用案例分析 (1) 案例介绍 我们通过实际案例来了解…

网络编程 1 相关基础概念 及 请求、响应类 定义

目录 一、HTTP基本概念 1、HTTP是什么 2、HTTP客户端是什么 3、HTTP消息结构 4、服务器响应信息 二、相关概念 1、网址 URL 2、IP地址 3、域名 4、域名与IP关系 5、域名解析 6、DNS 三、设计请求、响应类基本数据结构 1、请求类定义 2、响应类定义 一、HTTP基本概…

AD引脚交换

19年写过一篇AD交换引脚的文章&#xff0c;原文请查阅AD18调PIN方法及注意事项&#xff0c;该方法是手动更改焊盘的网络&#xff0c;如果是对于少量的或者零散的引脚交换还好&#xff0c;但遇到像FPGA、CPLD或者端子这种大量引脚需要调PIN的情况还是一个一个手动更改就很费时了…

java 微服务 RabbitMQ高级 消息可靠性问题 死信交换机 延迟队列 惰性队列

消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1.消息可靠性问题&#xff08;面试很会问&#xff09; 针对这些问题&#xff0c;RabbitMQ分别给出了解决方案&#xff1a; 生产者确认机制 mq持久化 消费者确认机制 失败重试机制 下面我们就通过案…

基于Android的办公用品管理平台的设计与实现

需求信息&#xff1a; 教师端&#xff1a; &#xff08;1&#xff09;注册登录&#xff1a;教师通过输入自己的工号和密码登录系统&#xff1b; &#xff08;2&#xff09;信息修改&#xff1a;教师可以完善个人信息&#xff08;院系、职务等&#xff09;&#xff1b; &#xf…

DMS感知方案前装赛道「排位」,2025年750万辆市场争夺

对舱内驾驶员、乘客的关怀&#xff0c;正在成为车企新一轮体验升级的关键突破口。在2023年CES展上&#xff0c;类似的产品方案也成为汽车行业的焦点。 比如&#xff0c;一家名为Myant的创新材料技术公司&#xff0c;在今年CES期间推出了一款将传感器和执行器&#xff08;与编织…

深度解刨性能测试工具Locust

An open source load testing tool. 一个开源性能测试工具。 define user behaviour with python code, and swarm your system with millions of simultaneous users. 使用Python代码来定义用户行为。用它可以模拟百万计的并发用户访问你的系统。 如果你常关注我的博客&…

2022尚硅谷SSM框架跟学(十)SSM整合

2022尚硅谷SSM框架跟学 十 SSM整合四、SSM整合4.1ContextLoaderListener(1).创建Maven Module(2).导入依赖(3).配置web.xml(4).创建SpringMVC的配置文件并配置(5).创建Spring的配置文件并配置(6).创建组件(7).创建页面(8).访问测试功能4.2准备工作(1).创建Maven Module(2).导入…

【2023亲测可用】JS 获取电脑本地IP 和 电脑网络IP(外网IP|公网IP)

1、了解&#xff1a;电脑本地的IP地址&#xff08;内网IP&#xff09;和电脑本机在网络上的IP地址&#xff08;外网IP|公网IP&#xff09; 在运行窗口输入“cmd”&#xff0c;在弹出的界面里输入“ipconfig/all”。弹出的数据中&#xff0c;IPv4地址&#xff0c;就是电脑本地的…

使用Hadoop分析气象数据(附代码)

刚学了Hadoop&#xff0c;在网上找完整的分析使用过程进行练手观看。本文数据和方法均来自于大佬的使用Hadoop分析气象数据完整版&#xff08;附带完整代码&#xff09;&#xff08;侵删&#xff09; 文章目录1.获取数据1.1下载数据1.2 数据格式1.3 合并数据2.MapReduce处理数据…

01sklearn-机器学习的几种算法(附代码)

说明: 本篇文章主要写了机器学习的流程及一些常用的算法如: 贝叶斯,朴素贝叶斯,线性回归,决策树,随机森林,逻辑斯蒂回归,模型调优和特征工程等(都是使用python的sklearn库实现) 一、概述 二、 一、特征工程 在看下面的算法之前,我们要先对机器学习流程进行一下熟悉! 主要有…

代码随想录算法训练营第五十九天_第九章_动态规划 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

LeetCode 583. 两个字符串的删除操作 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 视频讲解https://www.bilibili.com/video/BV1we4y157wB/?spm_id_from333.788&vd_sourcef…