hough变换算法

article/2025/9/29 6:15:48

VoteNet网络中会用Deep Hough Voting,所以先来学习一下Hough Voting。

在这里插入图片描述
正文开始

hough变换算法

1、算法思想
霍夫变换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。

边缘检测比如canny算子可以识别出图像的边缘,但是实际中由于噪声和光照不均匀等因素,很多情况下获得的边缘点是不连续的,必须通过边缘连接将他们转换为有意义的边缘。Hough变化是一个重要的检测间断点边界形状的方法,它通过将图像坐标空间变化到参数空间来实现直线和曲线的拟合。

Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough直线检测的基本原理在于利用点与线的对偶性,在我们的直线检测任务中,即图像空间中的直线与参数空间中的点是一一对应的,参数空间中的直线与图像空间中的点也是一一对应的。这意味着我们可以得出两个非常有用的结论:

  • 图像空间中的每条直线在参数空间中都对应着单独一个点来表示;
  • 图像空间中的直线上任何一部分线段在参数空间对应的是同一个点。

因此Hough直线检测算法就是把在图像空间中的直线检测问题转换到参数空间中对点的检测问题,通过在参数空间里寻找峰值来完成直线检测任务,也即把检测整体特性转化为检测局部特性。

2、算法原理

1)图像空间和参数空间

霍夫变换的数学理解是“换位思考”,比如一条直线y=ax+b有两个参数,在给定坐标系下,这条直线就可以用a和b进行完整的表述。如果我们把x和y看作参数,把a和b看作变量的话,那么图像空间下的坐标点(x1,y1)对应着参数空间里的一条直线q=-x1k+y1, 图像空间直线上的点(x1,y1)就是参数空间的斜率和截距,其中k,q为参数空间的自变量。

2)参数空间转换过程

下面用不同空间下的点和线的变换过程示例说明。

一条直线可由两个点A=(X1,Y1)和B=(X2,Y2)确定(笛卡尔坐标)。
在这里插入图片描述
另一方面,y=kx+q也可以写成关于(k,q)的函数表达式(霍夫空间):
在这里插入图片描述

对应的变换可以通过图形直观表示:
在这里插入图片描述
变换后的空间成为霍夫空间。即:笛卡尔坐标系中一条直线,对应霍夫空间的一个点。
反过来同样成立(霍夫空间的一条直线,对应笛卡尔坐标系的一个点):
在这里插入图片描述
再来看看A、B两个点,对应霍夫空间的情形:
在这里插入图片描述

再看一下三个点共线的情况:
在这里插入图片描述

可以看出如果笛卡尔坐标系的点共线,这些点在霍夫空间对应的直线交于一点:这也是必然,共线只有一种取值可能。

如果不止一条直线呢?再看看多个点的情况(有两条直线):
在这里插入图片描述
其实(3,2)与(4,1)也可以组成直线,只不过它有两个点确定,而图中A、B两点是由三条直线汇成,这也是霍夫变换的后处理的基本方式:选择由尽可能多直线汇成的点。
在这里插入图片描述
到这里问题似乎解决了,已经完成了霍夫变换的求解,但是如果像下图这种情况呢?

在这里插入图片描述
k=∞是不方便表示的,而且q怎么取值呢,这样不是办法。因此考虑将笛卡尔坐标系换为:极坐标表示。
在这里插入图片描述
在极坐标系下,其实是一样的:极坐标的点→霍夫空间的直线,只不过霍夫空间不再是[k,q]的参数,而是[ρ, θ]的参数,给出对比图:
在这里插入图片描述
从上面可以看到,参数空间的每个点(ρ,θ)都对应了图像空间的一条直线,或者说图像空间的一个点在参数空间中就对应为一条曲线。这样就把在图像空间中检测直线的问题转化为在极坐标参数空间中找通过点(r,θ)的最多正弦曲线数的问题。霍夫空间中,曲线的交点次数越多,所代表的参数越确定,画出的图形越饱满。

霍夫直线检测就是把图像空间中的直线变换到参数空间中的点,通过统计特性来解决检测问题。具体来说,如果一幅图像中的像素构成一条直线,那么这些像素坐标值(x, y)在参数空间对应的曲线一定相交于一个点,所以我们只需要将图像中的所有像素点(坐标值)变换成参数空间的曲线,并在参数空间检测曲线交点就可以确定直线了。

下面给出霍夫变换的算法步骤:
在这里插入图片描述
总结:使用霍夫变换检测直线具体步骤:

  • 1.彩色图像->灰度图
  • 2.去噪(高斯核)
  • 3.边缘提取(梯度算子、拉普拉斯算子、canny、sobel)
  • 4.二值化(判断此处是否为边缘点,就看灰度值==255)
  • 5.映射到霍夫空间(准备两个容器,一个用来展示hough-space概况,一个数组hough-space用来储存voting的值,因为投票过程往往有某个极大值超过阈值,多达几千,不能直接用灰度图来记录投票信息)
  • 6.取局部极大值,设定阈值,过滤干扰直线
  • 7.绘制直线、标定角点

3、代码测试

函数原型:

CV_EXPORTS_W void 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 );

在这里插入图片描述
测试代码如下:

int main() {Mat src_img;Mat dst_img, cdst, cdst2;src_img = imread("D:\\WORK\\5.OpenCV\\LeanOpenCV\\pic_src\\pic18.bmp");imshow("原图", src_img);Canny(src_img, dst_img, 50, 200, 3);imshow("Canny图", dst_img);cdst = src_img.clone();cdst2 = dst_img.clone();vector<Vec2f> lines;HoughLines(dst_img, lines, 1, CV_PI / 180, 100, 0, 0);for (size_t i = 0; i < lines.size(); i++){float rho = lines[i][0], theta = lines[i][1];Point pt1, pt2;double a = cos(theta), b = sin(theta);double x0 = a * rho, y0 = b * rho;pt1.x = cvRound(x0 + 1000 * (-b));pt1.y = cvRound(y0 + 1000 * (a));pt2.x = cvRound(x0 - 1000 * (-b));pt2.y = cvRound(y0 - 1000 * (a));line(cdst, pt1, pt2, Scalar(0, 0, 255), 1, LINE_AA);line(cdst2, pt1, pt2, Scalar(255, 255, 255), 1, LINE_AA);}imshow("detected lines", cdst);imshow("detected lines2", cdst2);waitKey(0);
}

测试效果图如下,canny边缘检测有不连续的边缘,霍夫变换直线检测可以连接不连续的直线边缘。
在这里插入图片描述


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

相关文章

Hough 变换

Hough 变换是图像处理中&#xff0c;检测直线最基本&#xff0c;也是应用最广泛的一种传统方法。虽然现在是深度学习大行其道的时代&#xff0c;但是很多传统的算法&#xff0c;依然有其参考的价值所在&#xff0c;至少从数学表达上来看&#xff0c;是更加的简洁&#xff0c;有…

Hough transform(霍夫变换)

主要内容&#xff1a; 1、Hough变换的算法思想 2、直线检测 3、圆、椭圆检测 4、程序实现 一、Hough变换简介 Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性&#xff0c;将原始图像空间的给定的曲线通过曲线表达形式变…

Hough变换

目录 一、Hough变换简介 二、Hough变换的数学理解 1.x-y变量空间至k-b参数空间的变换 2.x-y变量空间至-空间的变换 三、Hough变换应用于线检测&#xff08;MATLAB实现&#xff09; 1.检测步骤 2.使用MATLAB工具箱中的Hough变换函数进行边缘检测 一、Hough变换简介 霍夫变…

图像处理:Hough变换原理分析

目录 一、前言 二、直线函数的形式化表示 2.1 直线被方程表示 2.2 直线被图表表示 2.3 直线的表格表示 三、hough变换的提出 3.1 极坐标表示点和线 四、 hough变换的原理 4.1 极坐标的​编辑表格 4.2 用​编辑平面表示&#xff1a;过任意点P(x,y)做所有射线&#xff0…

Hough变换原理-直线检测

目录 一、简介 二、原理 三、Python代码实现 一、简介 Hough&#xff08;霍夫&#xff09;变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换是将图像坐标空间变换到参数空间&#xff0c;利用点与线的对偶性&#xff0c;将原始图像空间的给定的曲线&#xff08…

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

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

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

2023-02-24&#xff1a;请用go语言调用ffmpeg&#xff0c;解码mp4文件并保存为YUV420SP格式文件&#xff0c;采用YUV420P转YUV420SP的方式。 答案2023-02-24&#xff1a; 使用 github.com/moonfdd/ffmpeg-go 库。 解码后就是yuv420p&#xff0c;然后用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的介绍 &#xff0c;大致意思如下&#xff1a; 它是YCbCr的泛化格式&#xff0c;能够表示任何4:2:0的平面和半平面格式&#xff0c;每个分量用8 bits 表示。带有这种格式的图像使用3个独立的Buffer表示&#xff0c;每…

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

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

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

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

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

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

OpenGL渲染YUV420P

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

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

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

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

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

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

概述 之前介绍了YUV码流的采样格式&#xff0c;下面分析下YUV码流的存储格式&#xff0c;YUV码流的存储格式与采样格式息息相关。总的来讲&#xff0c;YUV存储格式主要分为两种&#xff1a; planar 平面格式 指先连续存储所有像素点的 Y 分量&#xff0c;然后存储 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格式有两大类&#xff1a;planar和packed。 对于planar的YUV格式&#xff0c;先连续存储所有像素点的Y&#xff0c;紧接着存储所有像素点的U&#xff0c;随后是所有像素点的V。 对于packed的YUV格式&#xff0c;每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

python 生产者消费者模式

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

生产者-消费者模式

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