Hough变换原理-直线检测

简介: Hough变换原理-直线检测

一、简介

       Hough(霍夫)变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换是将图像坐标空间变换到参数空间,利用点与线的对偶性,将原始图像空间的给定的曲线(今天主要介绍直线)通过曲线表达形式变为参数空间的一个点。这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题。也即把检测整体特性转化为检测局部特性。比如直线、椭圆、圆、弧线等。

二、原理

       Hough变换的基本原理在于利用点与线的对偶性,即在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点。原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。


       在图像坐标空间中,经过点(,)的直线表示为:

                       (1)

       其中,参数a为斜率,b为截矩。通过点( , )点( , )的直线有无数条,且对应于不同的a和b。

如果将 视为常数,而将原本的参数a和b看作变量,则式子(1)可以表示为:

                        (2)

       这样就变换到了参数空间。这个变换就是坐标空间中对于( , )点的Hough变换。该直线是图像坐标空间中的点( , )在参数空间的唯一方程。考虑到图像坐标空间中的另一点( , ),它在参数空间中也有相应的一条直线,表示为:

                       (3)

       这条直线与点( , )在参数空间的直线相交于一点(a0,b0)(a0,b0),如图所示:


      也就是说,假如图像坐标空间中有一些点共线,其中每个点对应到参数空间中就是一条直线,而且参数空间中的这些直线相交于一点。Hough变换要做的就是统计参数空间中有多少这样的交点,并且每个交点是由多少直线相交形成的,而每个交点的斜率和截距就能确定出直线,从而计算出图像中的直线。

三、Python代码实现

       OpenCV中有现成的方法cv2.HoughLinesP,参数说明建注释,其中的参数需要实际情况自己调整了。Python代码如下:

import cv2
 
def HoughLinesP_demo(img_path):
    img = cv2.imread(img_path)
    org = img.copy()
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 阈值计算
    ret, img = cv2.threshold(img, 150, 255, cv2.THRESH_BINARY)
    # cv2.imshow('img1', img)
    # 模糊 去掉细节
    # kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    # img1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
    # 边缘检测
    img = cv2.Canny(img, 7, 255, apertureSize=3)
    # cv2.imshow('img2', img)
    '''
    Hough变换,该函数实现了概率霍夫变换算法的线段检测,在二值图像中找到线段。  
    HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) -> lines
        @param image 参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。
        @param lines 表示储存着检测到的直线的参数对 (x_{start}, y_{start}, x_{end}, y_{end}) 的容器,也就是线段两个端点的坐标。
        @param rho 表示参数极径 r 以像素值为单位的分辨率,这里一般使用 1 像素。
        @param theta 表示参数极角 theta 以弧度为单位的分辨率,这里使用 1度。
        @param threshold 表示检测一条直线所需最少的曲线交点。
    .   @param minLineLength 表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。
    .   @param maxLineGap 表示能被认为在一条直线上的亮点的最大距离。
    '''
    lines = cv2.HoughLinesP(img, 1, np.pi / 180, threshold=10, minLineLength=20, maxLineGap=7)
    if lines is None:
        cv2.waitKey(0)
        return
    for line in lines:
        x1, y1, x2, y2 = line[0]
        cv2.line(org, (x1, np.min((y1, y2))), (x2, np.max((y1, y2))), (255, 0, 0), 2)
    cv2.imshow('org', org)
    cv2.waitKey(0)
 
if __name__ == '__main__':
    HoughLinesP_demo(r'test.png')

相关文章
|
算法 计算机视觉 Python
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
OpenCV中Canny边缘检测和霍夫变换的讲解与实战应用(附Python源码)
961 0
|
机器学习/深度学习 监控 算法
目标检测算法的优缺点及适用场景
目标检测算法的优缺点及适用场景
888 0
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
2170 54
基于开源框架Spring AI Alibaba快速构建Java应用
|
存储 弹性计算 人工智能
阿里云服务器五代、六代、七代、八代实例区别及选择参考
目前阿里云服务器的实例规格经过多次升级之后,最新一代已经升级到第八代实例,当下主售的云服务器实例规格也以七代和八代云服务器为主,对于初次接触阿里云服务器实例规格的用户来说,可能并不是很清楚阿里云服务器五代、六代、七代、八代实例有哪些,他们之间有何区别,下面小编为大家介绍下阿里云五代、六代、七代、八代云服务器实例规格分别有哪些以及每一代云服务器在性能方面具体有哪些提升,以供大家参考和了解。
阿里云服务器五代、六代、七代、八代实例区别及选择参考
|
人工智能 算法 C++
光学算法——Zernike拟合
光学算法——Zernike拟合
3419 0
|
10月前
|
Shell 程序员 开发者
轻松搞定在Python中构建虚拟环境
本教程教你如何使用业界公认的最佳实践,创建一个完全工作的Python开发环境。虚拟环境通过隔离依赖项,避免项目间的冲突,并允许你轻松管理包版本。我们将使用Python 3的内置`venv`模块来创建和激活虚拟环境,确保不同项目能独立运行,不会相互干扰。此外,还将介绍如何检查Python版本、激活和停用虚拟环境,以及使用`requirements.txt`文件共享依赖项。 通过本教程,你将学会: - 创建和管理虚拟环境 - 避免依赖性冲突 - 部署Python应用到服务器 适合新手和希望提升开发环境管理能力的开发者。
662 2
|
Oracle 关系型数据库 数据库
Oracle 19c OCP 认证考试 083 题库(第37题)- 2024年修正版
本文介绍Oracle 19c OCP认证题库中的1Z0-083科目,包含85道试题,需在150分钟内完成,通过分数为57%。重点解析了关于阈值、指标和警报的问题,并指出需通过Oracle指定的WDP机构培训后才能参加考试,考试科目包括082和083,通过后可获得OCP证书。CUUG作为金牌合作机构,提供详细咨询与帮助。
392 2
|
自然语言处理 图形学 网络架构
Meta发布室内场景重建方法SceneScript
Meta的SceneScript技术革新了室内场景重建,采用基于标记的结构化语言模型,从视频流中预测三维场景。受Transformer和LLMs启发,SceneScript将自然语言处理应用于三维建模,通过场景语言编码器-解码器推断结构化命令。使用大规模合成数据集Aria Synthetic Environments进行训练,SceneScript在建筑布局和3D对象检测上表现出色,具备适应新任务的灵活性。尽管面临细节处理和自动化限制,但其潜力和创新性已得到业界认可。
363 2
Meta发布室内场景重建方法SceneScript
基于51单片机的模拟交通灯控制系统
该文档描述了一个基于51单片机的交通灯控制系统的设计要求和实现。系统应用于十字路口,控制主干道(东西方向)和支干道(南北方向)的交通流量。主干道绿灯时间为15秒,支干道为10秒,转换时黄灯闪烁3秒。用户可以通过按键设置通行时间和进行交通管制。系统包括四个状态:主干道绿灯、主干道黄灯、支干道绿灯和支干道黄灯,循环运行。此外,还提供了仿真电路图、原理图和实物照片,以及C代码示例。
1008 1
|
机器学习/深度学习 算法 数据可视化
MATLAB R2018b安装教程
MATLAB R2018b安装教程
1672 0