win10+Python3.7.3+OpenCV3.4.1入门学习(十六 霍夫变换)————16.2 HoughLines函数

本文详细介绍了使用Python和OpenCV实现霍夫直线变换的过程,包括霍夫变换的基本原理、参数设置及其实现代码。通过实例展示了如何从图像中检测直线,并讨论了霍夫变换可能存在的误检问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

16.2 HoughLines函数

OpenCV提供了函数cv2.HoughLines()用来实现霍夫直线变换,该函数要求所操作的源图像是一个二值图像,所以在进行霍夫变换之前要先将源图像进行二值化,或者进行Canny边缘检测。
函数cv2.HoughLines()的语法格式为:

lines=cv2.HoughLines(image, rho, theta, threshold)

式中:
● image是输入图像,即源图像,必须是8位的单通道二值图像。如果是其他类型的图像,在进行霍夫变换之前,需要将其修改为指定格式。
● rho为以像素为单位的距离r的精度。一般情况下,使用的精度是1。
● theta为角度θ的精度。一般情况下,使用的精度是π/180,表示要搜索所有可能的角度。
● threshold是阈值。该值越小,判定出的直线就越多。通过上一节的分析可知,识别直线时,要判定有多少个点位于该直线上。在判定直线是否存在时,对直线所穿过的点的数量进行评估,如果直线所穿过的点的数量小于阈值,则认为这些点恰好(偶然)在算法上构成直线,但是在源图像中该直线并不存在;如果大于阈值,则认为直线存在。所以,如果阈值较小,就会得到较多的直线;阈值较大,就会得到较少的直线。
● 返回值lines中的每个元素都是一对浮点数,表示检测到的直线的参数,即(r, θ),是numpy.ndarray类型。
有一点需要强调的是,使用函数cv2.HoughLines()检测到的是图像中的直线而不是线段,因此检测到的直线是没有端点的。所以,我们在进行霍夫直线变换时所绘制的直线都是穿过整幅图像的。
绘制直线的方法是,对于垂直方向的直线(不是指垂线,是指垂直方向上的各种角度的直线),计算它与图像水平边界(即图像中的第一行和最后一行)的交叉点,然后在这两个交叉点之间画线。对于水平方向上的直线,采用类似的方式完成,只不过用到的是图像的第一列和最后一列。在绘制线时,所使用的函数是cv2.line()。该函数方便的地方在于,即使点的坐标超出了图像的范围,它也能正确地画出线来,因此没有必要检查交叉点是否位于图像内部。遍历函数cv2.HoughLines()的返回值lines,就可以绘制出所有的直线。

eg1:使用函数cv2.HoughLines()对一幅图像进行霍夫变换,并观察霍夫变换的效果。
代码如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('computer.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray,50,150,apertureSize = 3)
orgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
oShow=orgb.copy()
lines = cv2.HoughLines(edges,1,np.pi/180,140)
for line in lines:
    rho,theta = line[0]
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a*rho
    y0 = b*rho
    x1 = int(x0 + 1000*(-b))
    y1 = int(y0 + 1000*(a))
    x2 = int(x0 - 1000*(-b))
    y2 = int(y0 - 1000*(a))
    cv2.line(orgb,(x1,y1),(x2,y2),(0,0,255),2)
plt.subplot(121)
plt.imshow(oShow)
plt.axis('off')
plt.subplot(122)
plt.imshow(orgb)
plt.axis('off')
plt.show()

运行上述程序,结果如下图所示。
在这里插入图片描述

在上图的右图中,较粗的直线是因为有多条直线靠近在一起,即检测出了重复的结果。在一些情况下,使用霍夫变换可能将图像中有限个点碰巧对齐的非直线关系检测为直线,而导致误检测,尤其是一些复杂背景的图像,误检测会很明显。此图中该问题虽然并不是特别明显,但是如果将阈值threshold的值设置得稍小些,仍然会出现较多重复的检测结果。
OpenCV官网提供了一幅名为building.jpg的图像用来测试,大家可以下载该图像,对其进行霍夫变换,观察检测的效果。该图在使用霍夫变换进行检测时,存在非常严重的误检测。为了解决上述问题,人们提出了霍夫变换的改进版——概率霍夫变换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值