霍夫变换检测斑马线示例——openv-python

简介: 霍夫变换检测斑马线示例——openv-python

前言


在这里我们不硬啃原理(原理可参考Opencv[人民邮电出版社出版])。




一.霍夫变换原理


    霍夫变换是图像处理中检测是否存在直线的重要算法,其基本原理为:通过将图像中的像素在一个空间坐标系中变换到另一个空间坐标系中,使得在原空间中具有相同特性的曲线或者直线映射到另一个空间中形成峰值,从而把检测任意形状的问题转化为统计峰值的问题。



二. 霍夫变换检测直线的步骤


2.1 将参数空间的坐标轴离散化


2.2 将图像中每个非零像素通过映射关系求取在参数空间通过的方格


2.3 统计参数空间内每个方格出现的次数,选取次数大于某一阈值的方格作为表示直线的方格


2.4 将参数空间中表示直线的方格的参数作为图像中直线的参数




三.标准霍夫变换和渐近概率式霍夫变换


3.1 标准霍夫变换


HoughLines( InputArray image,
            OutputArray lines, 
          double rho, double theta, int threshold, 
          double srn = 0, 
            double stn = 0, 
          double min_theta = 0, double max_theta = CV_PI );


其中各参数解释如下:


image:  输入图像,必须是CV-8U的单通道图像。


lines:  检测到的直线坐标描述的系数,每条直线都由两个参数表示,分别表示直线距离坐标原点的距离和坐标原点到直线的垂线与X轴的夹角。


rho:  以像素为单位的距离分辨率。


theta:  以弧度为单位的角度分辨率。


threshold:  累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。


srn:  默认值为0,用于在多尺度霍夫变换中作为参数rho的除数,rho=rho/srn。


stn:  默认值为0,用于在多尺度霍夫变换中作为参数theta的除数,theta=theta/stn。


如果srn和stn同时为0,就表示HoughLines函数执行标准霍夫变换,否则就是执行多尺度霍夫变换。\




3.2. 渐近概率式霍夫变换

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


其中各参数解释如下:


image:  输入图像,必须是CV-8U的单通道图像。


lines:  霍夫检测到的直线或者线段的两个端点的坐标,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标(x1,y1,x2,y2)。


rho:   以像素为单位的距离分辨率。


theta: 以弧度为单位的角度分辨率。


threshold:  累加计数值的阈值参数,当参数空间某个交点的累加计数的值超过该阈值,则认为该交点对应了图像空间的一条直线。


minLineLength:  直线的最小长度,当检测直线时长度小于该数值时将被剔除。


maxLineGap:  同一直线上相邻的两个点之间的最大距离



动手开撸:


    开撸之前的准备工作:我们拿倒图像后,先检查是三通道还是单通道,三通道则转单通道,接下来就需要传统的滤波降噪等操作的处理,这样是为了剔除不必要的干扰.


示例图像:

image.png


进行边缘检测处理

img = cv2.imread('2.jpg')
# 将图像转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用直方图均衡化
dst_img = cv2.equalizeHist(gray_img)
# 高斯滤波降噪
gaussian_img = cv2.GaussianBlur(dst_img, (11, 11), 0)
# 利用Canny进行边缘检测
edges_img = cv2.Canny(gaussian_img, 50, 150, apertureSize=3)
cv2.imshow("edges_img", edges_img)
cv2.waitKey(0)
cv2.destroyAllWindows()


image.png


截止到边缘检测后可以发现咱们的图像噪点处理的还不错,但是图像中还是存在些许断点,那么在进行霍夫变换的时候就需要将minLineLength设置的较小(木桶原理)



我们选择HoughLinesP作为处理边缘检测后的图像,具体参数如下(大家可自行更改尝试):


plot_lines = cv2.HoughLinesP(edges_img, 1, np.pi/180, 1, minLineLength=1, maxLineGap=22)
for line in plot_lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("plot_lines ", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


网络异常,图片无法展示
|



完整demo:(HoughLinesPointSet具备同样效果)



import cv2
import numpy as np
img = cv2.imread('2.jpg')
# 将图像转换为灰度图像
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 应用直方图均衡化
dst_img = cv2.equalizeHist(gray_img)
# 高斯滤波降噪
gaussian_img = cv2.GaussianBlur(dst_img, (11, 11), 0)
# 利用Canny进行边缘检测
edges_img = cv2.Canny(gaussian_img, 50, 150, apertureSize=3)
plot_lines = cv2.HoughLinesP(edges_img, 1, np.pi/180, 1, minLineLength=1, maxLineGap=22)
for line in plot_lines:
    x1, y1, x2, y2 = line[0]
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("plot_lines ", img)
cv2.waitKey(0)
cv2.destroyAllWindows()


相关文章
|
6天前
|
Ubuntu C++ Docker
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
Docker的基本指令和HTML/PYTHON/C++的简单创建示例
|
9天前
|
机器学习/深度学习 调度 Python
SOFTS: 时间序列预测的最新模型以及Python使用示例
这是2024年4月《SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion》中提出的新模型,采用集中策略来学习不同序列之间的交互,从而在多变量预测任务中获得最先进的性能。
32 4
|
2天前
|
人工智能 数据挖掘 大数据
538个代码示例!麻省理工教授的Python程序设计+人工智能案例实践
Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。 此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面有广泛应用。 尤其是在数据分析和人工智能方面,Python已成为最受开发者欢迎的编程语言之一,不仅大量计算机专业人员选择使用Python进行快速开发,许多非计算机专业人员也纷纷选择Python语言来解决专业问题。 由于Python应用广泛,关于Python的参考书目前已经有很多,但将Python编程与数据分析、人工智
|
5天前
|
编译器 索引 Python
Python常见异常类型说明及触发代码示例
开发过程中需要根据具体情况选择处理异常,并使用try-except语句来捕获并处理异常,从而保证程序的健壮性和稳定性。在Python中,异常是程序执行期间发生的错误或意外情况。当解释器遇到异常时,会停止程序的正常执行,并在控制台输出异常的相关信息。Python中有许多不同的异常类型,每个异常类型表示不同的错误或意外情况。OSError:操作系统产生的异常(例如打开一个不存在的文件)。AttributeError:尝试访问一个对象没有的属性。UnicodeError:Unicode相关的异常。
13 5
|
5天前
|
设计模式 开发者 Python
深入理解Python适配器模式及其应用示例
在软件开发中,适配器模式是一种常用的设计模式,它可以帮助我们解决不兼容的接口或类之间的问题。通过适配器模式,我们可以简化不兼容接口之间的调用,并提高代码的复用性和可维护性。这两个支付接口具有不同的接口定义和调用方式,为了屏蔽这种差异性并实现统一的支付接口,可以使用适配器模式来完成。通过适配器模式,我们成功地将支付宝和微信支付的接口适配到了统一的支付接口上,实现了支付系统的可扩展性和灵活性。适配器模式的核心思想是创建一个中间层,将不同的接口进行适配,使得接口之间可以无缝衔接并协同工作。
12 2
|
11天前
|
机器学习/深度学习 存储 编解码
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(2)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
10天前
|
机器学习/深度学习 存储 计算机视觉
基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测
基于YOLOv8深度学习的PCB板缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测
|
10天前
|
机器学习/深度学习 算法 安全
基于YOLOv8深度学习的危险区域人员闯入检测与报警系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、区域闯入
基于YOLOv8深度学习的危险区域人员闯入检测与报警系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、区域闯入
|
11天前
|
机器学习/深度学习 计算机视觉 Python
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数(3)
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数
|
11天前
|
机器学习/深度学习 存储 算法
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数(2)
深度学习实战】行人检测追踪与双向流量计数系统【python源码+Pyqt5界面+数据集+训练代码】YOLOv8、ByteTrack、目标追踪、双向计数、行人检测追踪、过线计数