霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。
霍夫变换于1962年由PaulHough首次提出,最初的Hough变换是设计用来检测直线和曲线,起初的方法要求知道物体边界线的解析方程,但不需要有关区域位置的先验知识。这种方法的一个突出优点是分割结果的Robustness,即对数据的不完全或噪声不是非常敏感。然而,要获得描述边界的解析表达常常是不可能的。 后于1972年由Richard Duda & Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。霍夫变换运用两个坐标空间之间的变换将在一个空间中具有相同形状的曲线或直线映射到另一个坐标空间的一个点上形成峰值,从而把检测任意形状的问题转化为统计峰值问题。

OpenCV支持三种不同的霍夫线变换,它们分别是:标准霍夫变换(Standard Hough Transform,SHT)和多尺度霍夫变换(Multi-Scale Hough Transform,MSHT)累计概率霍夫变换(Progressive Probabilistic Hough Transform ,PPHT)。

其中,多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以称PPHT为“概率”的,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性地减少计算时间。

在OpenCV中,我们可以用HoughLines函数来调用标准霍夫变换SHT和多尺度霍夫变换MSHT。
而HoughLinesP函数用于调用累计概率霍夫变换PPHT。累计概率霍夫变换执行效率很高,所有相比于HoughLines函数,我们更倾向于使用HoughLinesP函数。
总结一下,OpenCV中的霍夫线变换有如下三种:
<1>标准霍夫变换(StandardHough Transform,SHT),由HoughLines函数调用。
<2>多尺度霍夫变换(Multi-ScaleHough Transform,MSHT),由HoughLines函数调用。
<3>累计概率霍夫变换(ProgressiveProbabilistic Hough Transform,PPHT),由HoughLinesP函数调用。

霍夫圆变换的基本原理和上面讲的霍夫线变化大体上是很类似的,只是点对应的二维极径极角空间被三维的圆心点x, y还有半径r空间取代。说“大体上类似”的原因是,如果完全用相同的方法的话,累加平面会被三维的累加容器所代替:在这三维中,一维是x,一维是y,另外一维是圆的半径r。这就意味着需要大量的内存而且执行效率会很低,速度会很慢。

示例:

//-----------------------------------【头文件包含部分】---------------------------------------
//      描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------
#include "pch.h"
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>//-----------------------------------【命名空间声明部分】--------------------------------------
//      描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------
using namespace std;
using namespace cv;//-----------------------------------【全局变量声明部分】--------------------------------------
//      描述:全局变量声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage, g_dstImage, g_midImage;//原始图、中间图和效果图
vector<Vec4i> g_lines;//定义一个矢量结构g_lines用于存放得到的线段矢量集合
//变量接收的TrackBar位置参数
int g_nthreshold = 100;//-----------------------------------【全局函数声明部分】--------------------------------------
//      描述:全局函数声明
//-----------------------------------------------------------------------------------------------static void on_HoughLines(int, void*);//回调函数
static void ShowHelpText();//-----------------------------------【main( )函数】--------------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{ShowHelpText();//载入原始图和Mat变量定义   Mat g_srcImage = imread("gonglu.jpg");  //工程目录下应该有一张名为gonglu.jpg的素材图//显示原始图  imshow("【原始图】", g_srcImage);//创建滚动条namedWindow("【效果图】", 1);createTrackbar("值", "【效果图】", &g_nthreshold, 200, on_HoughLines);//进行边缘检测和转化为灰度图Canny(g_srcImage, g_midImage, 50, 200, 3);//进行一次canny边缘检测cvtColor(g_midImage, g_dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图//调用一次回调函数,调用一次HoughLinesP函数on_HoughLines(g_nthreshold, 0);HoughLinesP(g_midImage, g_lines, 1, CV_PI / 180, 80, 50, 10);//显示效果图  imshow("【效果图】", g_dstImage);waitKey(0);return 0;}//-----------------------------------【on_HoughLines( )函数】--------------------------------
//      描述:【顶帽运算/黑帽运算】窗口的回调函数
//----------------------------------------------------------------------------------------------
static void on_HoughLines(int, void*)
{//定义局部变量储存全局变量Mat dstImage = g_dstImage.clone();Mat midImage = g_midImage.clone();//调用HoughLinesP函数vector<Vec4i> mylines;HoughLinesP(midImage, mylines, 1, CV_PI / 180, g_nthreshold + 1, 50, 10);//循环遍历绘制每一条线段for (size_t i = 0; i < mylines.size(); i++){Vec4i l = mylines[i];line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(23, 180, 55), 1, CV_AA);}//显示图像imshow("【效果图】", dstImage);
}//-----------------------------------【ShowHelpText( )函数】----------------------------------
//      描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText()
{//输出一些帮助信息printf("\n\n\n\t请调整滚动条观察图像效果~\n\n");
}

OpenCV3检测直线或圆:霍夫线变换,霍夫圆变换合辑相关推荐

  1. OpenCV之imgproc 模块. 图像处理(3)霍夫线变换 霍夫圆变换 Remapping 重映射 仿射变换

    霍夫线变换 目标 在这个部分您将学习到: 使用OpenCV的以下函数 HoughLines 和 HoughLinesP 来检测图像中的直线. 原理 Note 以下原理的说明来自书籍 学习OpenCV  ...

  2. opencv 霍夫线变换

    霍夫线变换 霍夫线变换是一种用来寻找直线的方法. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 它是如何实现的? 众所周知, 一条直线在图像二维空 ...

  3. OpenCV3学习(6.2)——霍夫(Hough)变换:霍夫线变换HoughLine,霍夫圆变换HoughCircles

    霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段) ...

  4. LSD直线检测和霍夫线变换的学习建议

    最近笔者学习霍夫线变换和LSD直线检测算法,有一些学习建议,希望可以给予大家一些帮助.  学习霍夫变换的感想 每个人理解的霍夫变换或许略有差异,但是最主要的是笛卡尔坐标系跟极坐标系的相互转换. 霍夫变 ...

  5. 花老湿学习OpenCV:霍夫线变换与直线检测

    引言: 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集 ...

  6. 霍夫线变换,霍夫圆变化

    向浅墨学习,南航小硕很惭愧. 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/2697 ...

  7. 缺点 霍夫圆_霍夫线变换,霍夫圆变换

    在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为 ...

  8. OpenCV3之——霍夫变换(霍夫线变换和霍夫圆变换)

    霍夫变换 本文章参考@浅墨_毛星云的博客.转载请注明出处. 参考链接: http://blog.csdn.net/poem_qianmo/article/details/26977557 写作当前博文 ...

  9. OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines.HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircle ...

最新文章

  1. Linux下如何实现用户的集中管理(NIS服务器的高级配置)
  2. Vofuria 的 imageTarget 的图片无法显示或者显示为空白
  3. 举例分析private的作用【c/c++学习】
  4. ES6_入门(1)_let命令
  5. 每天一个Linux命令之date
  6. [css] 请说说CSS3实现文本效果的属性有哪些?
  7. 4g模块注册上网 移远_物联网模组龙头移远通信
  8. 日记【2010-6-2】
  9. kruskal java_kruskal算法 源码(java)
  10. 举个栗子!Tableau 技巧(97):离线安装 Linux 版 Tableau Server
  11. (伪)原创,采集工具应用
  12. HFDS的Shell操作
  13. c语言设计思路和有点不足,C语言总结报告
  14. perl 一行命令 2021-09-02
  15. iOS代码覆盖率(二)-增量覆盖率自动化实践
  16. FPGA到底是什么?
  17. 郑州大学计算机系1996级校友,美术学院:1996级校友毕业二十周年返校聚会
  18. python turtle如何写字_python的turtle库可以利用代码写字吗?
  19. 游匣G15新机开箱测评,果然顶配是真香
  20. 晶振的负载电容和频偏的计算方法总结

热门文章

  1. 如何在 3Dmax 中启用 GPU 渲染?
  2. 解决 一加3t 恢复出厂设置后来电无声音问题,解决存储空间中 “其他”占用 40+ G问题
  3. Java通过递归解决0-1背包问题的代码
  4. SAR影像数据分辨率与像素间隔
  5. 从入门到精通(分布式文件系统架构)-FastDFS,FastDFS-Nginx整合,合并存储,存储缩略图,图片压缩,Java客户端
  6. 惠普HP ENVY Photo 6222 打印机驱动
  7. Prometheus普罗米修斯监控+Alertmanager预警+钉钉预警
  8. 您必须了解的4种OpenStack Neutron网络类型
  9. 愿你在自己的世界里烨烨生辉
  10. 数学家苏青云不为人知的故事