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

二、OpenCV中的霍夫线变换
2.1、霍夫先变换的种类
  霍夫线变换是一种用来寻找直线的方法。在使用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像.
  OpenCV支持三种不同的霍夫线变换,它们分别是:标准霍夫变换(Standard Hough Transform,SHT)和多尺度霍夫变换(Multi-Scale Hough Transform,MSHT)累计概率霍夫变换(Progressive Probabilistic Hough Transform ,PPHT)。其中,多尺度霍夫变换(MSHT)为经典霍夫变换(SHT)在多尺度下的一个变种。累计概率霍夫变换(PPHT)算法是标准霍夫变换(SHT)算法的一个改进,它在一定的范围内进行霍夫变换,计算单独线段的方向以及范围,从而减少计算量,缩短计算时间。之所以称PPHT为“概率”的,是因为并不将累加器平面内的所有可能的点累加,而只是累加其中的一部分,该想法是如果峰值如果足够高,只用一小部分时间去寻找它就够了。这样猜想的话,可以实质性地减少计算时间。
2.2、OpenCV中如何使用霍夫变换
  在OpenCV中,我们可以用HoughLines函数来调用标准霍夫变换SHT和多尺度霍夫变换MSHT。而HoughLinesP函数用于调用累计概率霍夫变换PPHT。累计概率霍夫变换执行效率很高,所有相比于HoughLines函数,我们更倾向于使用HoughLinesP函数。

三、OpenCV中霍夫变换的使用
3.1、HoughLines( )函数解析
  该函数可以找出采用标准霍夫变换的二值图像线条。在OpenCV中,我们可以用其来调用标准霍夫变换SHT和多尺度霍夫变换MSHT的OpenCV内建算法。

void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0 )  

  第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像。
  第二个参数,InputArray类型的lines,经过调用HoughLines函数后储存了霍夫线变换检测到线条的输出矢量。每一条线由具有两个元素的矢量表示,其中,是离坐标原点((0,0)(也就是图像的左上角)的距离。 是弧度线条旋转角度(0~垂直线,π/2~水平线)。
  第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。PS:Latex中/rho就表示 。
  第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  第六个参数,double类型的srn,有默认值0。对于多尺度的霍夫变换,这是第三个参数进步尺寸rho的除数距离。粗略的累加器进步尺寸直接是第三个参数rho,而精确的累加器进步尺寸为rho/srn。
  第七个参数,double类型的stn,有默认值0,对于多尺度霍夫变换,srn表示第四个参数进步尺寸的单位角度theta的除数距离。且如果srn和stn同时为0,就表示使用经典的霍夫变换。否则,这两个参数应该都为正数。
3.2、霍夫变换实例(利用HoughLines函数)
  1、代码


#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>  using namespace cv;int main()
{//【1】载入原始图和Mat变量定义     Mat srcImage = imread("1.jpg");    Mat midImage, dstImage;//临时变量和目标图的定义  //【2】进行边缘检测和转化为灰度图  Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测  cvtColor(midImage, dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图  //【3】进行霍夫线变换  vector<Vec2f> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合  HoughLines(midImage, lines, 1, CV_PI / 180, 150, 0, 0);//【4】依次在图中绘制出每条线段  for (size_t i = 0; i < lines.size(); i++){float rho = lines[i][0], theta = lines[i][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a*rho, y0 = b*rho;pt1.x = cvRound(x0 + 1000 * (-b));pt1.y = cvRound(y0 + 1000 * (a));pt2.x = cvRound(x0 - 1000 * (-b));pt2.y = cvRound(y0 - 1000 * (a));line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA);}//【5】显示原始图    imshow("【原始图】", srcImage);//【6】边缘检测后的图   imshow("【边缘检测后的图】", midImage);//【7】显示效果图    imshow("【效果图】", dstImage);waitKey(0);return 0;
}

  2、运行结果
  (1)原图

  (2)边缘检测后的效果图

  (3)霍夫变换的效果图

3.3、HoughLinesP( )函数解析
  此函数在HoughLines的基础上末尾加了一个代表Probabilistic(概率)的P,表明它可以采用累计概率霍夫变换(PPHT)来找出二值图像中的直线。

 void HoughLinesP(InputArray image, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )  

  第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像。
  第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。
  第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。
  第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。
  第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。
3.4、概率霍夫变换实例(利用HoughLinesP函数)
  1、代码

 #include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>  using namespace cv;int main()
{//【1】载入原始图和Mat变量定义     Mat srcImage = imread("1.jpg"); Mat midImage, dstImage;//临时变量和目标图的定义  //【2】进行边缘检测和转化为灰度图  Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测  cvtColor(midImage, dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图  //【3】进行霍夫线变换  vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合  HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);//【4】依次在图中绘制出每条线段  for (size_t i = 0; i < lines.size(); i++){Vec4i l = lines[i];line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, CV_AA);}//【5】显示原始图    imshow("【原始图】", srcImage);//【6】边缘检测后的图   imshow("【边缘检测后的图】", midImage);//【7】显示效果图    imshow("【效果图】", dstImage);waitKey(0);return 0;
}

  2、运行结果
  (1)原图

  (2)边缘检测后的效果图

  (3)PPFH效果图

OpenCV 霍夫变换直线检测(SHT、MSHT和PPHT)相关推荐

  1. 【youcans 的 OpenCV 例程200篇】157. 霍夫变换直线检测

    欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中 欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中 [youcans 的 OpenCV 例程20 ...

  2. 霍夫变换检测直线 c语言,opencv之霍夫变换直线检测

    霍夫变换检测 霍夫变换之直线检测霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) 检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式 ...

  3. 霍夫变换直线检测理解

    一步一步来: 1.在白纸上画出一个直角坐标系,任意给出一个点: 2.那么,对于点(x0,y0),经过这个点的直线必定满足y0=k*x0+b,其中k是直线的斜率,b是直线的截距: 3.上式可以化成b=y ...

  4. 初识霍夫变换——霍夫变换直线检测原理(Line Detection)

    参考博客: 1.Opencv学习笔记-----霍夫变换直线检测及原理理解 2.霍夫变换检测直线原理及实例 3.霍夫变换直线检测(Line Detection)原理及示例 霍夫变换(Hough Tran ...

  5. opencv判断 线夹角_python opencv实现直线检测并测出倾斜角度(附源码+注释)

    由于学习需要,我想要检测出图片中的直线,并且得到这些直线的角度.于是我在网上搜了好多直线检测的代码,但是没有搜到附有计算直线倾斜角度的代码,所以我花了一点时间,自己写了一份直线检测并测出倾斜角度的代码 ...

  6. 霍夫变换直线检测基本原理

    霍夫变换直线检测基本原理hough;houghpeaks;houghlines(2) 一步一步来: 1.在白纸上画出一个直角坐标系,任意给出一个点: 2.那么,对于点(x0,y0),经过这个点的直线必 ...

  7. 在Python中使用OpenCV进行直线检测

    1. 引言 在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线.其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术. 2. 霍夫变换 霍夫变换是 ...

  8. 数字图像处理--霍夫变换直线检测及原理理解

    我们在前面的<图像的颜色选择>.<图像的感兴趣区域>中提到了对车道线的检测. 通过对原始行车图像进行颜色选择和感兴趣区域的提取,得到了如下的车道线: 我们的车道线当然是一左一右 ...

  9. opencv+hough直线检测+fitline直线拟合

    #include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/cor ...

最新文章

  1. 掌握这些技巧助你轻松绘制程序流程图
  2. word2010忽然无法撤销
  3. 全新视角:用变分推断统一理解生成模型(VAE、GAN、AAE、ALI)
  4. android 恶意广告,CheckPoint:Android恶意广告软件SimBad被下载近1.5亿次
  5. C. 防止E-mail注入
  6. tableau 倒序都倒了_Tableau优秀作品拆解复刻01-是时候终结瘘管病了
  7. 使用code::blocks搭建objective-c的IDE开发环境 支持 @interface
  8. 中国最流氓的灰色职业,被人狂骂,却年入千万住豪宅
  9. Lua-pb 升级到Lua5.3
  10. 用c语言elgamal共密钥密码加密算法,非对称密钥体制RSA加密原理
  11. 高级着色语言HLSL入门(3)
  12. Python Tricks(六)—— 删除一个可迭代序列中等于某值的全部元素
  13. html5 加上魔法,简单易懂的React魔法(28):是时候添加一些CSS样式了
  14. 杨凡老师谈怎样背好单词
  15. 1T免费全能空间 注册即可开通
  16. nodejs追加写入日志文件
  17. 明翰经验系列之管理篇V1.1(持续更新)
  18. plc-st编程语言学习_这就是您可以学习所有编程语言的方式,是的-“全部”
  19. 程序员这碗饭,越来越多人想吃了
  20. 李建忠设计模式之”行为变化“模式

热门文章

  1. WebAR:它如何改变增强现实的未来
  2. C语言详解系列——函数的认识(5)函数递归与迭代
  3. 前端如何获取http状态码400的返回值
  4. FISCO BCOS Transaction execution error交易事务合约执行失败原因
  5. 状态机在分布式系统中的应用
  6. 这里是离科学最近的地方——白春礼在国科大首届开学典礼上的致辞
  7. SSO 单点登录实现方案
  8. 稳态转差频率控制matlab,电动机转差频率间接矢量控制matlab仿真(毕业设计)
  9. 转转闲鱼链接八合一源码带后台
  10. 微信是如何飞起来的(延伸阅读:性,微信下的机会?一个超级用户的自白:移动社交那点事类kik手机通信录互动应用前景探讨)