python 霍夫直线变换_霍夫线变换
目录:一、引入极坐标
二、霍夫线变换实现原理
三、图像中的霍夫线变换
四、概率霍夫变换
五、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 霍夫直线变换_霍夫线变换相关推荐
- 直线检测练习:hough线变换
直线检测练习:hough线变换 1.hough线变换概述 2.hough线变换原理 3. API介绍 3.1 opencv版 3.1.1 HoughLines API介绍(SHT.MSHT) 3.1. ...
- 如何求解单边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 ...
- labview霍夫曼树_霍夫曼树的应用
霍夫曼树的具体证明在离散数学书上有,我总结大意如下: 我们平常查询单词的时候,总会有一些词查询的频率高,一些词查询的频率低,如果建立一棵树来查询,应该使那些经常查询的码(信息经过无损压缩后)的深度尽量 ...
- labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...
huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...
- 霍夫曼算法_霍夫曼编码算法
霍夫曼算法 In this tutorial, we'll be discussing and implementing the Huffman Coding Algorithm in Java. 在 ...
- labview霍夫曼编码_哈夫曼编解码压缩解压文件—C++实现
前言 哈夫曼编码是一种贪心算法和二叉树结合的字符编码方式,具有广泛的应用背景,最直观的是文件压缩.本文主要讲述如何用哈夫曼编解码实现文件的压缩和解压,并给出代码实现. 哈夫曼编码的概念 哈夫曼树又称作 ...
- 卡夫卡队列_卡夫卡编年史队列基准
卡夫卡队列 总览 最近,我被要求比较<卡夫卡>和<编年史>的性能. 没有两个产品是完全一样的,要进行公平的比较并不容易. 我们可以尝试运行类似的测试,看看我们得到了什么结果. ...
- Python OpenCV -- 霍夫线变换(十二)
霍夫线变换 1. 霍夫线变换是一种用来寻找直线的方法. 2. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 实现: 1. 一条直线在图像二维空间 ...
- OpenCV中霍夫直线变换
OpenCV中霍夫直线变换 首先要知道,一条直线的通用表达式为y=ax+b\color{#F00}y=ax+by=ax+b,a为直线的斜率,b为直线的截距,知道这两个参数可以唯一确定一条直线.通常我们 ...
最新文章
- Matlab与线性代数 -- 矩阵的水平连接和垂直连接
- Gradient Boosting, Decision Trees and XGBoost with CUDA ——GPU加速5-6倍
- Google发布了Tensorflow Lite,用于移动电话的神经网络库
- 查看windows 端口进程
- Windbg dump分析 学习总结
- python 多继承的问题
- 3c技能和背包需要改建吗?_认为您需要仪表板? 您应该改建一个笔记本。
- Hive优化(再一遍系统复习)
- android Intent和IntentFilter
- mxnet img2rec的使用,生成数据文件
- 转:性能测试中常见的性能问题及识别方法
- C# - 多线程(基础)
- Google Web Brower
- 第四章 网络层[练习题+课后习题]
- MySQL SYS CPU高的案例分析(一)
- 《云计算核心技术剖析》
- 那个超级浏览器好(跨境浏览器哪个好)
- 非香农类信息不等式_信息论
- 借助python用Tushare查询股票价格并存入Mysql数据库中
- 工程项目进度控制的重点内容是什么?
热门文章
- ArcGIS Pro建立三维模型(三维渲染)
- 使用pca进行坐标系转换、降维
- 2015中国智能硬件蛋年创新大会手记
- 互联网公司背后的“深套路”:恶意举报对手,假招聘骗取信息
- 一张美团外卖的小票看透支付清结算架构!
- 互联网“香饽饽”?数据挖掘或成热门行业
- k近邻算法python_k-近邻算法的Python实现
- android 7.0 漏洞利用,谷歌 Android 移动操作系统中的零日漏洞被攻击者利用
- 翻遍“微信小程序”的所有知乎问答,我们整理了大家最关注几个话题
- Java连接数据库通用的增删改操作