目录:一、引入极坐标

二、霍夫线变换实现原理

三、图像中的霍夫线变换

四、概率霍夫变换

五、Python 例子

六、参考

Hough线变换是一种用于检测直线的变换。它最大的优点是,即使是虚线(dashed line),或者某些部分缺失、被遮挡的直线,也能检测到完整的线条。

一、引入极坐标

我们经常在直角坐标系中用两个参数表示直线:

,其中 k 为斜率(slope),b为截距(intercept)。但是当直线趋近于垂直x轴时,k值会变得非常大(

)或非常小(

)以至于无法表示该直线。

所以对于霍夫线变换,常在极坐标中表示一条直线:

直线在极坐标系下的表达式为:

由该图可以看出直线表达式是如何形成的

(x, y)为直角坐标系中的一个点A,这个表达式就表示经过点(x, y)的所有直线,每条直线所对应的

​ 都不相同。

这里

表示原点到直线的距离,以像素为单位;

是这条垂直线和水平轴形成的角度。

所以图像空间的每一个像素点都对应一个这样的正弦表达式。

二、霍夫线变换实现原理

2.1、对于某个点

,我们可以将穿过该点的所有直线的集合定义为:

这意味着其中的每对

都表示经过

的一条直线。

2.2、给定一个点

,我们会得到过该点的一系列直线,将这些直线对应的参数

值画在

平面中,我们可以得到一条正弦曲线(只考虑

的点。):

上面是经过点(8, 6)的所有直线的极坐标表达式中的

参数所构成的曲线。

3.3、我们可以对其他的点进行相同的操作,按照上面的例子,画出另外两点

的曲线图:

如果两个不同点所对应的曲线在平面

中相交,就意味着两个点属于同一条直线,因为它们有相同的

参数。

如上图所示,这三条曲线相交于点(0.925,9.6),这是参数

的值,表示

都在这两个参数值所决定的直线上。

我们把

平面看做霍夫空间,

就是该空间中的点。而极坐标中的一个点就对应霍夫空间中的一条曲线。

三、图像中的霍夫线变换

知道了霍夫线变换的实现原理,怎么应用于检测图像中的直线呢?上面提到的点在图像中是对应哪些点呢?

进行霍夫线变换之前需要先对图像进行canny边缘检测得到二值图,将这个二值图进行霍夫线变换。

我们知道这个二值图除了图像中的边缘像素,其他像素的灰度值都为零,即表现黑色。而我们就是要根据这些非零灰度值的像素点(边缘像素),来获取在

平面中的曲线。

就是根据每个边缘像素(x,y),我们将

的值从0更改为

,根据公式

,获得对应的

值。从而获取所有边缘像素在

平面的曲线。

得到每个边缘像素的曲线后,通过计算

平面中各交点所在的曲线数量来检测直线。某点相交的曲线越多,意味着该交点所表示的直线具有越多的点,即在图像中直线越长。

我们还可以定义阈值,在某点相交的曲线数量大于该阈值,才认为该点在图像中对应一条直线。

所以要理解霍夫变换最关键的一点就是:

极坐标的点(

-

平面) <=> 直角坐标系中的曲线(

-

平面)

即在图像中一个边缘像素点,经过霍夫变换,变成霍夫空间(

-

平面)中的一条正弦曲线。

四、概率霍夫变换

上面介绍的标准霍夫变换,其本质上就是把图像中的边缘像素映射到它的霍夫空间,比如一共有M个边缘像素,则所有的边缘像素都需要进行映射,其运算量和所需内存都会很大。

如果只处理图像的m(m

下面是概率霍夫变换的简易步骤:随机抽取图像中的一个边缘像素点,如果已经被标定为是某一条直线上的点,则继续在剩下的边缘点中随机抽取一个边缘点,直到所有边缘点都抽取完为止;

对该点进行霍夫变换,并进行累加计算;

选取在霍夫空间内累加值最大的点,如果该点的值大于阈值,则进行步骤4,否则回到步骤1;

对于累加值大于阈值的点,从该点出发,沿着图像中的直线的方向位移,从而找到直线的两个端点;

计算直线的长度,如果大于某个阈值,则被认为是直线并输出。

五、Python 例子

OpenCV 中有霍夫线变换的API,我们直接调用即可。

原图为:白底黑线

我这里用的概率霍夫线变换函数:

HoughLinesP(image, rho, theta, threshold)image:二值图(边缘检测器的输出);

rho:距离分辨率,以像素为单位;

theta:角度分辨率,单位为弧度;

threshold:交点的最小曲线数量大于阈值,才被视为一条直线。

maxLineGap:这是一个可选参数,表示两个线段之间的gap小于该值,则进行连接

import cv2

import numpy as np

img = cv2.imread("/home/zxd/Pictures/lines.jpg")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# detecting the edges

edges = cv2.Canny(gray, 50, 200)

# apply probabilistic hough transform for line detection

lines = cv2.HoughLinesP(edges, 1, np.pi/180, 30)

# maxLineGap 参数的值为200,则线之间的gap小于200像素就将其进行连接

lines = cv2.HoughLinesP(edges, 1, np.pi/180, threshold=30, maxLineGap=200)

# 得到所有线段的端点

for line in lines:

x1, y1, x2, y2 = line[0]

cv2.line(img, (x1, y1), (x2, y2), (0,0,255))

cv2.imshow('img', img)

if cv2.waitKey(0) == ord('q'):

cv2.destroyAllWindows()

下面是输出的结果:

两者分别为不使用 maxLineGap 参数和使用 maxLineGap 参数的结果图。

所以即使遇到虚线或者被遮挡的直线,我们也可以使用霍夫线变换来进行直线检测。

六、参考

如果觉得有用,点个赞吧(ง •̀_•́)ง。

python 霍夫直线变换_霍夫线变换相关推荐

  1. 直线检测练习:hough线变换

    直线检测练习:hough线变换 1.hough线变换概述 2.hough线变换原理 3. API介绍 3.1 opencv版 3.1.1 HoughLines API介绍(SHT.MSHT) 3.1. ...

  2. 如何求解单边z变换_的单边Z变换。.ppt

    第8章 Z变换与离散时间系统的Z域分析 8.1 Z变换的定义 8.2 双边Z变换与单边Z变换的关系 8.3 Z变换的收敛域 8.4 常用序列的Z变换 8.5 Z变换的性质 8.6 Z反变换 8.7 Z ...

  3. labview霍夫曼树_霍夫曼树的应用

    霍夫曼树的具体证明在离散数学书上有,我总结大意如下: 我们平常查询单词的时候,总会有一些词查询的频率高,一些词查询的频率低,如果建立一棵树来查询,应该使那些经常查询的码(信息经过无损压缩后)的深度尽量 ...

  4. labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...

    huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...

  5. 霍夫曼算法_霍夫曼编码算法

    霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...

  6. labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现

    前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...

  7. 卡夫卡队列_卡夫卡编年史队列基准

    卡夫卡队列 总览 最近,我被要求比较<卡夫卡>和<编年史>的性能. 没有两个产品是完全一样的,要进行公平的比较并不容易. 我们可以尝试运行类似的测试,看看我们得到了什么结果. ...

  8. Python OpenCV -- 霍夫线变换(十二)

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

  9. OpenCV中霍夫直线变换

    OpenCV中霍夫直线变换 首先要知道,一条直线的通用表达式为y=ax+b\color{#F00}y=ax+by=ax+b,a为直线的斜率,b为直线的截距,知道这两个参数可以唯一确定一条直线.通常我们 ...

最新文章

  1. Matlab与线性代数 -- 矩阵的水平连接和垂直连接
  2. Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍
  3. Google发布了Tensorflow Lite,用于移动电话的神经网络库
  4. 查看windows 端口进程
  5. Windbg dump分析 学习总结
  6. python 多继承的问题
  7. 3c技能和背包需要改建吗?_认为您需要仪表板? 您应该改建一个笔记本。
  8. Hive优化(再一遍系统复习)
  9. android Intent和IntentFilter
  10. mxnet img2rec的使用,生成数据文件
  11. 转:性能测试中常见的性能问题及识别方法
  12. C# - 多线程(基础)
  13. Google Web Brower
  14. 第四章 网络层[练习题+课后习题]
  15. MySQL SYS CPU高的案例分析(一)
  16. 《云计算核心技术剖析》
  17. 那个超级浏览器好(跨境浏览器哪个好)
  18. 非香农类信息不等式_信息论
  19. 借助python用Tushare查询股票价格并存入Mysql数据库中
  20. 工程项目进度控制的重点内容是什么?

热门文章

  1. ArcGIS Pro建立三维模型(三维渲染)
  2. 使用pca进行坐标系转换、降维
  3. 2015中国智能硬件蛋年创新大会手记
  4. 互联网公司背后的“深套路”:恶意举报对手,假招聘骗取信息
  5. 一张美团外卖的小票看透支付清结算架构!
  6. 互联网“香饽饽”?数据挖掘或成热门行业
  7. k近邻算法python_k-近邻算法的Python实现
  8. android 7.0 漏洞利用,谷歌 Android 移动操作系统中的零日漏洞被攻击者利用
  9. 翻遍“微信小程序”的所有知乎问答,我们整理了大家最关注几个话题
  10. Java连接数据库通用的增删改操作