Hough变换原理-直线检测

article/2025/9/29 7:23:45

目录

 

一、简介

二、原理

三、Python代码实现


 

一、简介

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

二、原理

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

        在图像坐标空间中,经过点(gif.latex?x_%7Bi%7D,gif.latex?y_%7Bi%7D)的直线表示为:

gif.latex?y_%7Bi%7D%3Dax_%7Bi%7D+b                        (1)

        其中,参数a为斜率,b为截矩。通过点(gif.latex?x_%7Bi%7D,gif.latex?y_%7Bi%7D)点(gif.latex?x_%7Bi%7D,gif.latex?y_%7Bi%7D)的直线有无数条,且对应于不同的a和b。

        如果将gif.latex?x_%7Bi%7Dgif.latex?y_%7Bi%7D视为常数,而将原本的参数a和b看作变量,则式子(1)可以表示为:

gif.latex?b%3D-x_%7Bi%7Da+y_%7Bi%7D                         (2)

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

 gif.latex?b%3D-x_%7Bj%7Da+y_%7Bj%7D                        (3)

        这条直线与点(gif.latex?x_%7Bi%7D,gif.latex?y_%7Bi%7D)在参数空间的直线相交于一点(a0,b0)(a0,b0),如图所示:

b577ea645d6d46a096fd88d0943e3c3e.png 

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

        

三、Python代码实现

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

import cv2def 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)returnfor 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')

测试图片与结果:

6d759921b649402c86b3e335bd13d222.jpeg

56d86e47ad164d3898d5f32fe4661bab.png 

 

 


http://chatgpt.dhexx.cn/article/ovhrRqgy.shtml

相关文章

YUV444、YUV422、YUV420、YUV420P、YUV420SP、YV12、YU12、NV12、NV21

前言 各种YUV格式多如牛毛啊,刚开始学起来确实很费劲,网上搜索的文章讲的并不是很明白。 各种不同的YUV格式其实只是采样方式和存储方式不同,就这两点,不同的采样方式是为了实现节省内存,不同的存储方式暂时不了解有…

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。 答案2023-02-24: 使用 github.com/moonfdd/ffmpeg-go 库。 解码后就是yuv420p,然后用SwsScale函数转换成yuv…

ffmpeg处理YUV422和YUV420P相互转换

YUV422空间大小计算 YUV422封包width*heightwidth/2*height*2YUYV Y分量width*heightYUYV U分量width/2*heightYUYV V分量width/2*height YUV420空间大小计算 YUV420封包width*heightwidth/2*height/2*2Y分量width*heightU分量width/2*height/2V分量width/2*height/2 extern &…

Android Camera2 YUV420_888 格式详解

Camera2 YUV420_888 官网文档介绍 Android PAI 对 YUV420_888的介绍 ,大致意思如下: 它是YCbCr的泛化格式,能够表示任何4:2:0的平面和半平面格式,每个分量用8 bits 表示。带有这种格式的图像使用3个独立的Buffer表示,每…

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90°-180°-270°-镜像旋转

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90 一、理论分析(以yuv420p_i420格式为例)二、顺时针旋转90 代码实现三、顺时针旋转180 代码实现四、旋转90-180-270-镜像旋转,完整代码实现五、运行结果 本文接着前文: …

YUV420->RGB888格式转换的CPP实现

git地址: GitHub - Evayangelion/EYUVConverter: A YUV converter implemented by cpp 上一次学习了YUV各种采样和存储方式的区别(YUV知识存档) 接下来一起学习一下RGB格式的知识和YUV到RGB的转换方式 RGB色彩模式的分类 RGB的分类相较YUV来说…

YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介

一、基础知识: 概述 YUV是顏色編碼方式,常用於視頻及圖像處理中。 其中的YUV是三個分量。“Y”表示明亮度(Luminance或Luma),也就是灰度值。“U”和“V” 表示的是彩色信息,分別爲色度和濃度(C…

OpenGL渲染YUV420P

一 、YUV420P数据格式二 、GLFW渲染YUV420P2.1 定义顶点数据2.2 创建YUV三张纹理2.3上行YUV420数据2.4 渲染纹理2.5 着色器 三、代码地址以及存在的问题四 、解决存在的问题 一 、YUV420P数据格式 图片来源于谷歌 结合上图可以看出YUV420P的特点如下: ①无论在横向还…

详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)

转载自:划水型派大星 YUV (YCbCr)是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y(相当于灰度)的“亮度”分量(…

ffmpeg学习笔记(2)-YUV420算法原理

ffmpeg学习笔记(2)——YUV420算法原理 一、YUV像素格式 YUV的组成格式如下图所示 Y:明亮度,即灰度值 U、V:颜色 YUV格式将亮度信息和色彩信息分离,没有色彩信息依然能够显示图像(没有色彩信息),很好的解…

音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

概述 之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关。总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 Y 分量,然后存储 U 分量&…

图像编码YUV420格式

目录 一、YUV简介 二、RGB 到 YUV 的转换 三、YUV采样 YUV 4:4:4 YUV 4:2:2 YUV 4:2:0 四、YUV 存储格式 基于 YUV 4:2:2 采样的格式 YUYV 格式 UYVY 格式 YUV 422P 格式 基于 YUV 4:2:0 采样的格式 YU12 和 YV12 格式 NV12 和 NV21 格式 一、YUV简介 YUV&#x…

YUV420数据格式详解

YUV简介 YUV格式有两大类:planar和packed。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

python 生产者消费者模式

生产者消费者模式概述 在并发编程中使用生产者和消费者模式能够解决大不多的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么使用生产者消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是…

生产者-消费者模式

概述 生产者-消费者模式在系统交互方面,有几个特点: 1、系统解耦 2、解决并发问题 3、不需要关心对方系统何时处理数据,处理结果如何 下面用几个简单例子逐步说明。 简单例子 假设有两个系统,A系统和B系统,B系统需要依赖A系统产生的数据,也就是说,A系统产生数据后,必须把数…

生产者消费者模式及简单的运用场景

先考虑一个问题:服务端接受多个客户端提交的视频文件进行转码的操作,应该怎么设计? 由于转码比较花费时间,所以我们排除同步的想法。而转码需要用到的外部软件(exe文件),不能同时被多个线程用到…

Java多线程系列—生产者消费者模式的多种实现(04)

生产者消费者模式 我们先来看看什么是生产者消费者模式,生产者消费者模式是程序设计中非常常见的一种设计模式,被广泛运用在解耦、消息队列等场景。 在现实世界中,我们把生产商品的一方称为生产者,把消费商品的一方称为消费者,有时生产者的生产速度特别快,但消费者的消…

生产者消费者模式的Java实现

一.概述 1. 什么是“生产者消费者模式”? 生产线程负责生产,消费线程负责消费 生产线程和消费线程要达到均衡。 生产满了就不能继续生产了,必须让消费线程进行消费 消费完了就不能再消费了,必须让生产线程进行生产 这是一种特殊的…

实现生产者消费者模式的三种方式

什么是生产者消费者模式 简单来说,生产者消费者模式就是缓冲区。 那么这么做有两个好处,一个是解耦,第二个是平衡生产能力和消费能力的差,因为生产者和消费者的速度是不一样的,有了这个缓冲区就可以平衡这样一个落差&…

生产者消费者模式最佳实践

测试环境:ubuntu18.04opencv4.2Qt 一个生产者-消费者模式下的视频处理框架。基础结构:视频读取类线程不断读取视频帧,处理类线程对图像进行处理,之后通过信号与槽机制在主线程中显示。特点:视频读取、处理为独立线程&a…