OpenCV+python:霍夫变换与直线检测
1,霍夫变换
霍夫变换是图像处理中从图像中识别几何形状的基本方法之一。主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。最基本的霍夫变换是从黑白图像中检测直线(线段)。
霍夫变换最简单的是检测直线。,直线的方程表示可以由斜率和截距表示(这种表示方法,称为斜截式),如下所示:
但是这样会参数问题,垂直线的斜率不存在(或无限大),这使得斜率参数m的值接近于无限。为此,为了更好的计算,提出了Hesse normal form(Hesse法线式):
其中r是原点到直线上最近点的距离(其他人可能把这记录为ρ,下面也可以把r看成参数ρ),θ是x轴与连接原点和最近点直线之间的夹角。因此,可以将图像的每一条直线与一对参数(r,θ)相关联。这个参数(r,θ)平面有时被称为霍夫空间,用于二维直线的集合。
在图像分析上下文,边缘段的点(一个或多个)的坐标(xi,yi)在图像中是已知的,并且因此作为参数线等式中的常量,而r与θ是未知变量是我们要寻找的。如果我们绘制由(r,θ)每个定义的可能值(xi,yi),笛卡尔图像空间中的点映射到极性霍夫参数空间中的曲线(即正弦曲线)。这个点到曲线的变换是直线的霍夫变换。当在霍夫参数空间中查看时,在笛卡尔图像空间中共线的点变得很明显,因为它们产生在相同(r,θ)点相交的曲线。
该变换的结果存储在矩阵中。单元格值表示通过任意点的曲线数量。更高的单元格值变得更亮。明显的亮点是直线的霍夫参数。从这些点的位置,可以确定输入图像中两条线的图像中心的角度和距离.
源代码示例:
import cv2 as cv
import numpy as npdef line_detection(image): #直线检测gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3) #apertureSize是sobel算子窗口大小lines = cv.HoughLines(edges, 1, np.pi/180, 200) #指定步长为1的半径和步长为π/180的角来搜索所有可能的直线"""oughLines(image, rho, theta, threshold, lines=None, srn=None, stn=None, min_theta=None, max_theta=None)
第一个参数image:是canny边缘检测后的图像第二个参数rho和第三个参数theta:对应直线搜索的步长。在本例中,函数将通过步长为1的半径和步长为π/180的角来搜索所有可能的直线。最后一个参数threshold:是经过某一点曲线的数量的阈值,超过这个阈值,就表示这个交点所代表的参数对(rho, theta)在原图像中为一条直线"""for line in lines:# print(type(lines))rho, theta = line[0]#获取极值ρ长度和θ角度a = np.cos(theta)b = np.sin(theta)x0 = a * rho #获取x轴值y0 = b * rhox1 = int(x0+1000*(-b)) #获取这条直线最大值点x1y1 = int(y0+1000*(a))x2 = int(x0-1000*(-b))y2 = int(y0-1000*(a))#获取这条直线最小值点y2 其中*1000是内部规则cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2) #划线cv.imshow("image-lines", image)def line_detect_possible_demo(image): #检测出可能的线段 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)lines = cv.HoughLinesP(edges, 1, np.pi/180, 100, minLineLength=50, maxLineGap=10)"""
HoughLinesP概率霍夫变换(是加强版)使用简单,效果更好,检测图像中分段的直线(而不是贯穿整个图像的直线)
第一个参数是需要处理的原图像,该图像必须为cannay边缘检测后的图像;第二和第三参数:步长为1的半径和步长为π/180的角来搜索所有可能的直线第四个参数是阈值,概念同霍夫变换第五个参数:minLineLength-线的最短长度,比这个线短的都会被忽略。第六个参数:maxLineGap-两条线之间的最大间隔,如果小于此值,这两条线就会被看成一条线"""for line in lines:# print(type(line))x1, y1, x2, y2 = line[0]cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)cv.imshow("line_detect_possible_demo", image)src = cv.imread("F:/images/morph01.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
line_detection(src)
line_detect_possible_demo(src)
cv.waitKey(0)cv.destroyAllWindows()
OpenCV+python:霍夫变换与直线检测相关推荐
- 【图像处理】——Python霍夫变换之直线检测(主要是两个函数HoughlinesHoughlinesP)
目录 一.原理(摘自<数字图像处理冈萨雷斯>) 2.Python函数 参数详解 3.效果 4.实例 一.原理(摘自<数字图像处理冈萨雷斯>) 即在xy平面上一条直线上的点在ab ...
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫变换的原理大家可以参考博文 霍夫变换_tie ...
- OpenCV标准霍夫直线检测详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...
- 用Python实现LSD直线检测
LSD (Line Segment Detector) 是一种用于检测图像中直线段的算法. 要在 Python 中实现 LSD 直线检测,首先需要安装 OpenCV 库.OpenCV 是一个开源的计算 ...
- opencv值霍夫直线检测原理
转载于CheerM的博客园博客 霍夫变换--直线检测 考古debug,其实很久之前就解决的bug--一直忘记过来改文章-.欸 =============================原文====== ...
- 霍夫直线检测python_opencv+python 霍夫直线检测
参考:https://blog.csdn.net/fengjiexyb/article/details/78075888 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通 ...
- 【OpenCv】霍夫直线检测
文章目录 前言 1 原理 2 算法流程 3 优缺点 前言 Hough变换是实现边缘检测的一种有效方法,其基本思想是将测量空间的一点变换到参量空间的一条曲线或曲面,而具有同一参量特征的点变换后在参量 ...
- 霍夫变换(直线检测、圆检测)
可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点:这也是必然,共线只有一种取值可能. 如果不止一条直线呢?再看看多个点的情况(有两条直线): 在opencv中步骤解读: 具体步骤: ...
- OpenCV—python 显着性检测二
这里只是展示一下OpenCV自带的显着性检测函数.效果都不是很好,各位可以测试一下. 需要OpenCV 3.4或更高版本 cv2.saliency.ObjectnessBING_create() cv ...
最新文章
- 争吵所达到的效果要_悟空:不要害怕争吵,有时候争吵一些不喜欢的事情也能创造和谐...
- 探究被Win7保留的100MB活动分区
- 鲍尔默说:你的东西再大 微软也装得下
- lua 多条件_【LUA】只需花费你半天时间
- Guava区间-Range
- php psr2规范,php标准规范详解
- 大数据时代的公共安全治理
- PHP伪造来源HTTP,伪造来源采集http.php
- ipv6的127位掩码如何表示_子网掩码为255.255.255.0代表的意思是什么?
- 线性代数 【22】 抽象的向量空间
- HDP SandBox 安装与初步配置
- xcode4.1自带SVN配置
- 计算机三级网络技术-----DHCP报文分析
- moments音标_moment 是什么意思_moment 的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 统计软件简介与数据操作
- 如何让计算机显示隐藏的文件夹,隐藏的文件夹如何显示 win7与xp系统显示隐藏文件夹的设置方法...
- BUUCTF之Ping Ping Ping
- Python数据可视化matplotlib(一)—— 图表的基本元素
- R语言小实践---云词分析
- vue2中取消严格检查模式/关闭语法检查