转载自:https://blog.csdn.net/weixin_40955254/article/details/83655703

研一的生活真的是精彩而又充实忙的跟狗一样,每天在学新的东西,忙的不知所措,还是决定要抽出空来,自己学习,好久都没有写博客了,我觉得这是自己的损失,无外乎两种情况:没有新的学习以及学习了却没有及时进行记录,两者都很可怕。

借着上周工业视觉检测这门课,我认真的学习了一下霍夫曼变换与广义霍夫曼变换,想借着这个没课的下午做个简短记录。

1)首先,什么是霍夫曼变换?

我的霍夫曼变换就是将空间坐标系里的图形转换到另外一个坐标系去表示。这么讲可能有的朋友会很迷茫,你在说什么?

换个说法,通常我们会用(x,y)来描述一个点的坐标,集中注意力了朋友,这个公式很关键

那么如果我们已知x,y,我们将和p视为变量,我们就可以发现这个结论,空间坐标系里面的一点,可以用参数坐标系里面的一条线来表示.而空间域的一条直线,通过变换发现成了参数域的一个点?是不是有懵逼了,别慌,我们来个example:

比如这条直线,当x,y都为1的时候,这个方程表示为:

作图的话就像下面这样:

然后我们继续添加点,可以看到图片变化成这样:

我们可以发现最后所有点变成的直线都交于一点,那么是不是就可以这样推断,在空间域这些所有的点对应的是同一条直线,而转换到参数空间之后,这些所有的曲线交于的同一点就是空间域的那条直线。通过这种方法我们就可以进行直线检测了。

ojbk,当然不止直线检测,所有凡是可以用解析式表达出来的图形,都可以通过霍夫曼变换来检测。甚至现在都不需要我们自己写代码了opencv的库就可以了。

2)为什么要有广义霍夫曼变换(GFT)

当检测的几何形状为直线,椭圆,圆时,我们通过霍夫曼变换终究可以将他们在一个有限维的参数空间中表示出来。

但是当所要检测的形状为一些不规则图形,比如字母,或者是一只水杯,我们就很难用一个数学解析式去描述出这个形状。这时候霍夫曼变换就很难解决这个问题。

但是通过广义霍夫曼变换,这类的问题却得到了很好的解决。

3)如何进行GHT?

分为三部分:a)对不规则形状进行描述     b)对图像中的不规则图像进行检测

c)检测中如何实现算法对旋转,缩放变换的通用性

a)对于不规则形状的描述主要是如下图所示,将要检测的任意形状称为模板,在模板上选择一个中心点,对于模板边缘每个点计算切线与x轴夹角,称为角。然后利用这个角建立一个R-table。每个角都是R-table的一个索引。然后对这个边缘点计算他与参考点的长度以及连线与x轴的夹角,作为相应下的一个数据对存进去。通过这个R-table我们就获得了这个模板所有的位置信息。

b)但是如果待检测图像与模板存在角度与大小的差异,那么我们该怎么适应这种差异呢?

老规则上图、

(x,y)是为模板上的原点,而则是变换后图像上与原点匹配的一点。我们来探寻他们之间的关系:

那么如何使用s和来表示呢?

c)最终的匹配过程可以描述如下:

1、将模板和待检测图像转化为灰度图

2、利用sobel或者candy算子对模板和待检测图像进行边缘提取

3、对模板计算相对应的R-table

4、建立一个四维的累加器表(Accumulator table)

5、对于待检测图像上的每个边缘点,计算对应的梯度方向。然后在R-table中检索相应的梯度值。

6、设定一个检测中旋转和缩放的范围。

7、对于该梯度值下所有的参数对,计算出相应的伪参考点坐标。

8、假定我们要检测的对象都是经历过变换的,对于该坐标,对所有可能的旋转角度和缩放尺度,利用上页公式计算实际参考点位置。

9、对于累加器表中对应的累加器表的数值加一。这些都是如果该点属于要检测图像上的一点,可能的参考点位置。

10、对于累加器表中的点找局部最大值,如果大于阈值T,就认为该点作为中心,检测到一个待检测图像。

这是我做出来的结果展示:

4)人,还是要学会思考的,我觉得这个算法还有以下可以改进的地方:

1、广义霍夫曼变换中采用的累加表运用率很低,大部分的点都没有利用到却一直占据着内存空间

2、在广义霍夫曼变换中,论文中提出的方法只采用了一个点,但是在实验中有时情况比较复杂时还是会出现检测不到的状况,那么是不是可以考虑增加参考点的个数。

3、在程序中,通常是采用选取累加表中极大值的做法,这种方式通常只能检测出一个目标。如果把这个换为输出大于阈值的所有目标点,并依据局部极大值抑制或者检测框的重复率来确定最终目标的个数。

但是我真的是没空去做这些,等哪天有空了,我会去一一实现一下他们。

that‘s all。

我是钱多多,原创转载请征求本人意见,欢迎大家有空多交流。

GHT(广义霍夫曼变换)相关推荐

  1. OpenCV3图像处理——霍夫曼变换直线检测

    前言 1.直线检测在好多实现应用中能用到到,我之前做过扫描件检测时用直线检测来处理判断页面是否水平,还有在辅助驾驶中的车道偏离预警系统也有过应用. 2.我的编程环境是Windows 7 64位,IDE ...

  2. opencv 霍夫曼变换 直线提取

    import cv2 import numpy as np img = cv2.imread("hd.jpeg", 0)img = cv2.GaussianBlur(img,(3, ...

  3. python 霍夫直线变换_OpenCV-Python 霍夫线变换 | 三十二

    目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...

  4. opencv26:霍夫直线变换

    目标 在这一章当中,将学习 了解霍夫变换的概念 使用它来检测图像中的线条 函数:cv2.HoughLines(),cv2.HoughLinesP() 理论 如果可以用数学形式表示形状,则霍夫变换是检测 ...

  5. OpenCV-Python 霍夫线变换 | 三十二

    目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...

  6. OpenCV系列之霍夫线变换 | 三十二

    目标 在这一章当中, 我们将了解霍夫变换的概念. 我们将看到如何使用它来检测图像中的线条. 我们将看到以下函数:cv.HoughLines(),cv.HoughLinesP() 理论 如果可以用数学形 ...

  7. 直线检测——对比M-LSD直线检测(基于深度学习)与霍夫曼直线检测

    前言 1.直线检测在好多实现应用中能用到到,比如文档扫描,辅助驾驶中的车道线检测,传统的算法用的最多应该属于霍夫曼直线检测,但传统算法都有一个痛苦的调参过程和只能对优化过的使用场景有较好的结果,换个场 ...

  8. 霍夫曼树之切割木板最小总代价问题

    对于本题的切割方案,在给出了最终的切割结果后,我们其实可以使用倒推的方法,将最终的小木板不断合成大木板,大木板的长度就是本次合并的开销,和相同条件下的切割的开销是一样的. 这样想的话,想要总开销小的话 ...

  9. 基于霍夫曼(Huffman)图像编码的图像压缩和重建-含Matlab代码

    目录 一.引言 二.霍夫曼Huffman编码 2.1 霍夫曼编码流程 2.2 输入数据的编码 三.霍夫曼解码 四.实验结果 五.参考文献 六.Matlab代码(GUI界面)获取 一.引言 随着通信与信 ...

最新文章

  1. 栈的输出_栈和队列--十进制转化为二进制
  2. 轻量级锁的加锁和解锁逻辑
  3. mysql不支持子查询_MySQL不支持子查询优化一例
  4. 前端学习(1532):项目1---项目功能展示
  5. python--正则表达式 字符串匹配
  6. java spin lock_JAVA 各种锁机制
  7. easyUI的使用.datagrid()生成列表日期时间显示异常,一个方法带入有效修复
  8. 科学计算机计算内插法,线性插值计算器
  9. java poi 2007,『分页符有什么用』java poi导出excel2007插入分页符无效,该如何解决,求代码!...
  10. windows server 2003 R2密钥
  11. 文档透明加密底层安全机制
  12. Python3 中英文列表输出对齐
  13. 《关于炒股有意思的几个“故事” 》
  14. 解决docker启动错误 error creating overlay mount to /var/lib/docker/overlay2
  15. DSP学习(8)—— linker.cmd文件解析
  16. Java毕业设计-考试管理系统
  17. 2019年“华为杯”研究生数学建模竞赛--E题(全球变暖)思路感想
  18. 线程学习基础(1):单线程爬虫和多线程爬虫的效率比照
  19. 人类无法通过时光机器回到过去
  20. 小猫爪:嵌入式小知识06-KEIL scf分散加载文件解析-链接代码至RAM

热门文章

  1. 移动App与服务器安全通信
  2. 晨枫U盘启动盘制作工具V4.0-安装原版XP的方法
  3. Meta-SR: A Magnification-Arbitrary Network for Super-Resolution
  4. 小波系数(转自showtime_97)
  5. java.sql.SQLException: Error writing file '/tmp/MY2zYz09' (Errcode: 28 - No space left on device)
  6. 虚拟服务器vps怎么扩展,vps虚拟服务器怎么用
  7. linux 命令 修改密码,一条命令修改Linux密码
  8. 关于Visual Studio订阅(原MSDN订阅)中无法激活Office 365权益的解决方法(仅适用于MVP)
  9. 【装修选材】自然系原木,才是空间真正的百搭之王!
  10. 根据地址获取坐标经纬度