首页 > 其他分享 >霍夫变换学习

霍夫变换学习

时间:2023-11-17 22:23:50浏览次数:39  
标签:直线 变换 霍夫 学习 参数 图像 theta

本文 OI/ACM 无关

Hough Transform

简介

Hough Transform 是图像分析,计算机视觉和数字图像处理的一种特征提取方法,它通过一种在参数空间内进行的投票机制实现分离图像内特定形状特征,经典的霍夫变换用于检测规则的曲线:直线,圆,椭圆灯,其需要以某种参数形式提供需要的特征,当无法获得特征描述时,可以使用广义霍夫变换。霍夫变换的真正优点是能容忍特征边界描述中的间隙,并且相对不受图像噪声的影响

需求性

使用边缘检测器提取边缘特征,可能因为图像数据,检测器,系统误差等方面原因,导致所需要识别的曲线上有断点或者干扰像素,将边缘特征分组到对应合适的直线,圆,椭圆等集合中式比较困难的

原理

前面我们知道图像经过边缘检测得到结果图像,在结果图像中,既包括了我们想要的边界线的像素,又包括了我们不想要的像素点;如果某一个边界线中的像素点具有一个相同的“性质”或者“特征”,那么我们就可以根据这个性质或者特征来判断图像中的像素点是否属于该边界线,我们就可以保留下我们想要的像素点,进而得到边界线。

霍夫变换判断直线边界

下列例子使用霍夫变换判断直线边界

在 \(x,y\) 坐标系 \(Z\) 下,我们有直线 \(y = mx + b\),在该坐标系下,直线由不同的 \((x,y)|y = mx + b\) 相连得到,我们将该直线改为在参数坐标系 \(H\) 下,将 \((m,b)\) 作为坐标,该直线在参数坐标系下变成了一个点,所有在原坐标系 \(Z\) 下的过直线 \(y = mx + b\) 的点 \((x,y)\) 在 \(H\) 下都变成了经过 \((m,b)\) 点的直线

我们发现经过这样的变换,我们可以把 \(Z\) 下的点 \((x,y)\) 改写为 \(H\) 下的直线 \(b = -xm + y\):

那么多个点变换后的多条直线,相交的交点,就是共线

img

如果我们对边缘检测图像中的每一个像素,都转换至参数坐标系下,那么在参数坐标系下,有“较多数量”直线过的点对应就是一条边界

这就是霍夫变换的思想:在参数空间内进行对点值的投票,最后通过设置阈值等方式确定出边界

但是我们发现如果使用简单的直线参数坐标空间变换,空间是无限大的,我们无法对无限大的空间内进行投票,进而我们转换向另一种直线表达方式的参数空间:Hesse normal form(即法线式)来表示直线的参数

一条直线可以表示为 \(r = x\cos\theta + y\sin\theta\)

利用参数空间 \((r,\theta)\) 解决了原本参数空间 \((m,b)\) 的空间发散问题,这个表示让霍夫变换和

二维的拉东变换非常相似。

给定一个点 \((x,y)\),利用辅助角公式可以轻松证明通过该点的所有直线集合在 \((r,\theta)\) 平面上为一三角函数。

\(r = x\cos\theta + y\sin\theta \to r = \sqrt{x^2 + y^2}(\frac{x}{\sqrt{x^2 + y^2}}\cos\theta + \frac{y}{\sqrt{x^2 + y^2}}\sin\theta) \to r = \sqrt{x^2 + y^2}\cos{(\theta - \phi)}\)

img

我们根据 \((r,\theta)\) 参数空间上的逆变化可以得到原直线:

\(y = -cot\theta x + \frac{r}{\sin\theta}\)

我们对参数空间进行投票后,可以通过阈值来选择特征较为明显的边界

img

img

图6

图一为原图,图二图三分别为阈值设定为 \(30/20\) 后得到的特征

霍夫变换提取圆形特征

在笛卡尔坐标系中有

\((x - a) ^ 2 + (y - b) ^ 2 = r ^ 2\)

即有

\(a = x - r\cos\theta\)

\(b = y - r\sin\theta\)

每一组 \((a,b,r)\) 是一个通过 \((x,y)\) 的圆

值得注意的是此时的 \((a,b,r)\) 在给定数据下显然是有界的,不需要额外操作

图像应该是一个倒圆锥形

Opencv在霍夫圆检测的投票并不是直接遍历每个图像上的所有点进行投票,此时参数空间上有若干三维曲线,计算开销太大,其使用的是霍夫梯度法

在计算时,先使用 Sobel算子 对边缘检测出的所有非零像素点计算了梯度,再沿着梯度方向遍历参数空间\((a,b,r)\),其提取通过梯度预估了圆心的位置。

广义霍夫变换

前文提到的用以检测直线和圆的霍夫变换都是通过解析模型,通过数学手段变换参数空间,本质是把对应的检测目标转换成交点,并统计相交数量,设计阈值统计的方法

但如果我们要检测一个非解析模型的任意形状怎么办呢

我们通过和刚刚使用的霍夫梯度法类似的方法,使用梯度方向作为特征的一维训练 R-table 来投票

image-20231117211715862

训练 R-Table

  • 选取任意一点 \(c\) 代表一待检测图形
  • 对每个边缘点计算梯度 \(\phi\) 和 指向 \(c\) 的位移向量 \(r = c - p_i\)
  • 将 \(r\) 加入以 \(\phi\) 为索引的 R-Table[\(\phi\)] 中

识别过程

image-20231117213920487

  • 对于边缘化的每一非零像素计算梯度 \(\phi\)

  • 遍历 R-Table[\(\phi\)] 中的所有向量 \(r\)

    ​ 考虑到形状放缩,我们设置一个放缩比例 \(S\)

    ​ 将 [\(x_c,y_c,S\)] 投票加1

    ​ 其中 \((x_c,y_c) = (x_i,y_i) + Sr\)

  • 统计所有的 \([x_c,y_c,S]\),设置阈值检测是否出现形状

标签:直线,变换,霍夫,学习,参数,图像,theta
From: https://www.cnblogs.com/dixiao/p/17839792.html

相关文章

  • 11月17日每日学习
    最近写人机交互的实验完成了实验一的页面 ......
  • 学习linux方法
    服务截止目前,就是学了ftp,nfs,samba,几个服务,就想总结一下,这几个服务的流程这也是我第一次学习linux服务关于服务的话,有以下的几个要求1:就是先了解这个服务的任务是干什么的,就是把这个目的弄懂就行了2:了解服务的端口号和进程,这个是非常重要的,用来判断这个服务是否开启了,或者检......
  • C#winform学习6(部门部分)
    1.部门列表显示listview首先需要在listview中设定相关属性 打开这个  代码:privatevoidDeptForm_Load(objectsender,EventArgse){//初始化列表setListView();}///<summary>///初始化部门列表......
  • task0003前端项目准备的学习笔记(之前忘了发不好意思!)
    2023-10-26task0003前端学习笔记JavaScript作用域学习笔记①:今天看了http://www.laruence.com/2009/05/28/863.html这位作者讲了js的作用域原理,让我豁然开朗,原来函数定义式与函数表达式的不同会导致作用域作用不一样比如:varname='laruence';functionecho(){alert(name......
  • C++ 指针学习笔记
    C++指针学习笔记引入指针是什么指针是一个变量,其值为另一个变量的地址。指针声明的一般形式为:type*ptr_name;type是指针的基类型,ptr_name是指针的名称,*用来指定一个变量是指针对于一个指针,需要明确四个方面的内容:指针的类型、指针所指向的类型、指针的值(指针所指向的......
  • c2w1_深度学习的实用层面
    深度学习的实用层面数据集:Train/Dev/Testsets深度学习是一个典型的高度迭代的过程,需要不断地进行循环测试,来找到最适合当前网络的超参。一方面可以提升迭代的效率,另一方面可以避免过度拟合等问题。在实践中,(合理的)高质量训练集、验证集和测试集,有助于提升迭代的效率。Train/De......
  • MSYS2学习笔记:基础使用
    本随笔用于记录随笔作者在使用MSYS2工具过程中需要掌握到的基础知识,例如如何查找想要的工具与其下载、如何环境配置等基础操作。本文内容摘录自MSYS2官方文档该随笔会不定时更新。随笔作者还正处于学习阶段,难免出现技术上和书写上的问题,如果发现类似问题,欢迎在评论区或私信与我......
  • 安卓大佬力荐,送你一份超详细的Android学习教程指南
    前言之前,我们也经常听到一种声音“计算机专业已经饱和了,赚不到钱了”,但是现在,这种声音好像越来越少了,大家都没有这种担心了吗?主要是初级岗位已经趋于饱和,但高级岗位又相对缺乏,作为Android开发人员,我们应该思考怎么去往高级人才发展,而不是转学其他语言,我们是要懂得去成为金字塔顶端......
  • 学习随笔(设计模式:模板方法模式)
    内容今天学习了模板方法模式,模板是一种面向对象高级语言中常用的编程思想。收获1.模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。2.模板编程能大大提高代码的复用性,可以在寻找所......
  • Hadoop学习(一) 搭建伪分布式集群
    文章结构1.准备工作1.1配置IP1.2关闭防火墙1.3修改主机名并与IP绑定1.4创建新用户1.5配置免密匙 2.安装并配置Hadoop伪分布式集群2.1安装Java2.2安装配置Hadoop伪分布式集群 1.准备工作1.1配置IP首先进入该路......