精华内容
下载资源
问答
  • 霍夫变换直线检测原理 https://blog.csdn.net/autocyz/article/details/42649187?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=...

    霍夫变换直线检测原理

    https://blog.csdn.net/autocyz/article/details/42649187?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

    展开全文
  • 1.Opencv学习笔记-----霍夫变换直线检测原理理解 2.霍夫变换检测直线原理及实例 3.霍夫变换直线检测(Line Detection)原理及示例 霍夫变换(Hough Transform)是图像处理领域内从图像中检测几何形状的...

    参考博客:

    1.Opencv学习笔记-----霍夫变换直线检测及原理理解

    2.霍夫变换检测直线原理及实例

    3.霍夫变换直线检测(Line Detection)原理及示例

     

     

     

     

    霍夫变换(Hough Transform)是图像处理领域内从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来经过扩展可以进行任意形状物体的识别。

    原理概括:在一个参数空间中,通过计算累计结果的局部最大值,得到一个符合该特定形状的的集合作为霍夫变换结果

     

    问题1: 在了解霍夫变换的具体原理之前,先想一下直线有哪些表现形式

    • 用直角坐标系表示:y = k*x + b
    • 用极坐标表示:r = x*cosθ + y*sinθ

    用直角坐标系表示是比较熟悉的一种方式,极坐标表示可能没有那么清晰,在这里做一下说明:

    第一种方法:

                                                                                    

    直线表达式为:

     化简后得到:

     第二种方法:

                          

    ρ和第一种方法中的r是一样的,都是原点到直线的距离。

    其实这两种方法本质上是一样的,与直角坐标系不同,它们的切入点在于要有个原点到直线的距离的参数,同时,再加上θ角度就可以确定这条直线。也就是说,给定两个参数: r(原点到直线的距离)和 θ(原点到直线的垂线与x轴的夹角),就代表着一条直线。换句话说就是,直角坐标系中的一条直线对应参数方程中的一个点

     

    问题2: 了解清楚直线的两种表现方式之后,对理解霍夫变换有什么帮助吗?

    首先,给定一个点,我们要想找到与此点在同一条直线上的其他点,是否是要将别的点的坐标代入,看是否符合过此点的坐标公式。这个时候就会出现一个问题,当我们在使用直角坐标公式的时候,也就是:y = k*x + b 时,假设当我们所要检测的点过定点刚好与x轴垂直时,此时的k是趋于无穷大的,无法表示出来,也就是说这种情况没有办法计算这个要检测的点是否与定点在同一条直线上。

    所以,霍夫变换要用极坐标公式来进行计算,以消除特殊情况的误差。

    再明确一下我们的搜索范围,想要找到哪些点在过定点的直线上,先明确这些点的范围,有可能是在过定点的任意直线上,这也是为什么不使用直角坐标系的原因。此时,绘出过某定点的任意直线的极坐标图像(假设给定点X_0= 8 和Y_0= 6):

                                                                       

    如图所示,将得到一条正弦曲线。在问题1已经说过了,直角坐标系中的一条直线对应参数方程中的一个点,只要是在这个直角坐标系上的点,它们的 r 和 θ 的值都是固定的,映射到极坐标系上自然对应一个固定的点。

    而对于直角坐标系中的某一点来说,其 r 和 θ 的值不是固定的,因为过此点的直线可能有很多条,每条的 r 和 θ 值也可能不同,因此,直角坐标系中的一个点对应参数方程中的一条曲线

    下图可以直观的看出两者的对应关系:

     

    问题3: 根据直角坐标系(图像空间)与极坐标系(参数空间)中点与直线的对应关系在检测直线中可以发挥什么作用呢?
    当我们检测图像空间中的所有点时,在对应的参数空间中会出现很多条对应的曲线。其中会有许多条曲线相交于一点的情况,结合上个问题得出的结论,直角坐标系中的一个点对应参数方程中的一个曲线(过此点的任意直线),当这些参数空间中的曲线有相交的点时,说明过这些点在某 r 和某 θ 值时的直线是重合的,不难推断出这些点在图像空间中是存在于一条直线内的。

                                                                     

    到此为止,就将图像空间中的直线变换成参数空间中的点,可通过统计特性来解决检测问题。

    然而,又出现一个问题,理论上,一个点对应无数条直线,但在实际中这样很难进行计算。

     

    问题4: 如何利用理论解决实际的问题呢?

    可以将 r 和 θ 值离散化为有限个等间距的离散值,离散化后的参数空间就不再是连续的,将会被离散成一个个等大小的网格。

    将图像空间中每个像素点坐标值变换到参数空间后,所得值会落在某个网格内,使得该网格的累加计数器加一。当所有的像素点都经过霍夫变换后,可对单元网格进行检查。在此之前还可对直线上点的数量进行限制,即设置一个阈值,当某单元网格的计数值大于设定的直线阈值时,则认为是一条直线。

     

     

     

     

     

     

    展开全文
  • 霍夫变换直线检测原理及 OpenCV API 应用 1. 霍夫变换 霍夫变换(Hough Transform)于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理领域内从图像中检测几何形状的基本...

    霍夫变换直线检测原理及 OpenCV API 应用

    1. 霍夫变换

    霍夫变换(Hough Transform)于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,是图像处理领域内从图像中检测几何形状的基本方法之一。经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。
    霍夫变换运用两个坐标空间之间(图像空间和霍夫空间)的变换,将在一个图像空间中具有相同形状的曲线或直线映射成霍夫空间的一个点,从而把检测任意形状的问题转化为统计霍夫空间中点重合的问题。

    在这里插入图片描述

    更多关于霍夫变换的介绍可以参考:霍夫变换

    2. 霍夫直线检测

    2.1 算法流程

    霍夫变换检测直线具体步骤如下:

    • 1.彩色图像转化为灰度图;

    • 2.去噪(高斯核);

    • 3.边缘提取(梯度算子、拉普拉斯算子、canny、sobel);

    • 4.二值化(判断此处是否为边缘点,就看灰度值==255);

    • 5.映射到霍夫空间(准备两个容器,一个用来展示 hough-space 概况,一个数组 hough-space 用来储存 voting 的值,因为投票过程往往有某个极大值超过阈值,多达几千,不能直接用灰度图来记录投票信息);

    • 6.取局部极大值,设定阈值,过滤干扰直线;

    • 7.绘制直线、标定角点

    2.2 OpenCV API

    2.2.1 HoughLines()

    HoughLines() 函数可以进行标准和多尺度霍夫直线变换。

    C++: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 )

    ItemsDisc.
    image输入图像,必须是8位单通道图像,有可能被修改
    lines检测到的线条参数集合
    rho以像素为单位的距离步长
    theta以弧度为单位的角度步长
    threshold累加计数值的阈值参数,小于阈值的直线将被忽略
    srn默认值为0,用于在多尺度霍夫变换中作为参数rho的除数, r h o = r h o / s r n rho=rho/srn rho=rho/srn
    stn默认值为0,用于在多尺度霍夫变换中作为参数theta的除数, t h e t a = t h e t a / s t n theta=theta/stn theta=theta/stn
    min_theta所检测的线条的最小角度,取值范围 介于 0 和 max_theta 之间
    max_theta所检测的线条的最大角度,取值范围 介于 min_theta 和 CV_PI 之间

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

    HoughLines函数输出检测到直线的矢量表示集合,每一条直线由具有两个元素的矢量(ρ, θ)表示,其中ρ表示直线距离原点(0, 0)的长度,θ表示直线的角度(以弧度为单位)。

    HoughLines函数无法输出图像空间中线段的长度,这也是霍夫变换本身的弱点。

    2.2.2 HoughLinesP

    HoughLinesP() 函数提供渐进概率式霍夫变换。

    • C++:void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
    ItemsDisc.
    image输入图像,必须是8位单通道图像,有可能被修改
    lines检测到的线条参数集合
    rho以像素为单位的距离步长
    theta以弧度为单位的角度步长
    threshold累加计数值的阈值参数,小于阈值的直线将被忽略
    minLineLength默认值为0,表示最小线段长度阈值(像素)
    maxLineGap线段上最近两点之间的阈值。默认值为 0,表示直线断裂的最大间隔距离阈值。即如果有两条线段是在一条直线上,但它们之间有间隙,那么如果这个间隔距离小于该值,则被认为是一条线段,否则认为是两条线段。

    HoughLinesP能够检测出线端,即能够检测出图像中直线的两个端点,确切地定位图像中的直线。
    HoughLinesP函数输出检测到直线的矢量表示集合,每一条直线由具有四个元素的矢量(x1, y1, x2, y2)表示,其中(x1, y1)表示线段的起点,(x2, y2)表示线段的终点。

    2.3 OpenCV API 应用

    下面是调用 HoughLines() 函数的例子,HoughLinesP() 函数的调用类似。

    #include <opencv2/opencv.hpp>
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    
    void drawLine(Mat &img, 
    	vector<Vec2f> lines,   
    	double rows,   
    	double cols,  
    	Scalar scalar,  
    	int n 
    )
    {
    	Point pt1, pt2;
    	for (size_t i = 0; i < lines.size(); i++)
    	{
    		float rho = lines[i][0];  
    		float theta = lines[i][1];  
    		double a = cos(theta);  
    		double b = sin(theta);  
    		double x0 = a * rho, y0 = b * rho;
    		double length = max(rows, cols);  
    										  
    		pt1.x = cvRound(x0 + length * (-b));
    		pt1.y = cvRound(y0 + length * (a));
    
    		pt2.x = cvRound(x0 - length * (-b));
    		pt2.y = cvRound(y0 - length * (a));
    
    		line(img, pt1, pt2, scalar, n);
    	}
    }
    
    int main()
    {
    	Mat src = imread("D:\\Code\\test\\image\\pp.jpg", 1); //color
    	Mat img;
    	cvtColor(src, img, CV_BGR2GRAY);
    
    	if (img.empty())
    	{
    		cout << "load image error" << endl;
    		return -1;
    	}
    	Mat edge;
    
    	// get edge and binary image
    	Canny(img, edge, 80, 180, 3, false);
    	threshold(edge, edge, 170, 255, THRESH_BINARY);
    
    	//hought line
    	vector<Vec2f> lines1, lines2;
    	HoughLines(edge, lines1, 1, CV_PI / 180, 100);	//threshold = 100
    	HoughLines(edge, lines2, 1, CV_PI / 180, 120);	//threshold = 120
    
    
    	//copy image
    	Mat img1, img2, img3;
    	src.copyTo(img1);
    	src.copyTo(img2);
    
    	drawLine(img1, lines1, edge.rows, edge.cols, Scalar(0,255,0), 2);
    	drawLine(img2, lines2, edge.rows, edge.cols, Scalar(0,255,0), 2);
    
    
    	//show image
    	imshow("edge", edge);
    	imshow("img", img);
    	imshow("img1", img1);
    	imshow("img2", img2);
    
    	imshow("src", src);
    	waitKey(0);
    	return 0;
    }
    

    在这里插入图片描述

    参考

    展开全文
  • 霍夫变换直线检测基本原理.pdf
  • 霍夫变换直线检测基本原理

    千次阅读 2017-10-24 17:40:59
    霍夫变换直线检测基本原理

    霍夫变换直线检测基本原理hough;houghpeaks;houghlines(2)

    一步一步来:

    1、在白纸上画出一个直角坐标系,任意给出一个点;

    2、那么,对于点(x0,y0),经过这个点的直线必定满足y0=k*x0+b, 其中k是直线的斜率,b是直线的截距;

    3、上式可以化成b=y0-k*x0,  可以看作是以-x0为斜率,以y0为截距,在k-b空间上的一个直线方程(k,b为变量);

    4、可见,k-b空间上的一条直线,代表了x-y空间经过特定点的所有直线,而x-y上的特定直线责备k-b空间上的特定点表示;

     

    利用这个原理,我们可以通过一下方法检测可能出线的直线:

    1、得到一副边缘图像;

    2、对图像中的每一个边缘点,在k-b空间中画出一条直线;

    3、在各直线的交点,我们采取“投票”(vote)的方法,即累加:n条直线的交点,改点的值为n;

    4、遍历k-b空间,寻找出先局部最大值(极值)的点,这些点的坐标(k,b)就是图像中可能出线的直线的斜率和截距;

     

      为了容易理解,这里采用了直线的斜截表达法。

      事实上这种方法并不使用,因为某些直线的斜率很大的甚至不存在。

      实际操作中,检测直线的霍夫变换使用含极坐标参数的直线表示型式,简称极坐标式(不是极坐标方程,因为还是在笛卡尔坐标下表示)

    其中的两个参数的意义如下图:

     

     

    这样,每条直线对应于theta-p空间下的一条正弦曲线,同样采用投票求极值的方法寻找曲线

    霍夫变换直线检测的matlab实现:

    这里涉及到三个函数:hough,houghpeaks,houghlines:

    1、[H,T,R] = hough(BW,'Theta',20:0.1:75)    ; (输入二值图像BW,角度范围与步进(最大,[-90, 90)),返回 H-霍夫空间,T-theta,R-p);

    2、PEAKS = houghpeaks(H,NUMPEAKS)      ;(输入霍夫空间和极值数量,返回极值的坐标)

    3、LINES=houghlines(BW,T,R,Peaks)        ; (返回lines是一个包含图像中线段首末点、p、theta的结构体)

     

    代码:

    I=imread('1.jpg'); 
    Ihsv=rgb2hsv(I); 
    Iv=Ihsv(:,:,3);%提取v空间 
    Ivl=Iv(500:end,:);%截取下半部 
    Iedge=edge(Ivl,'sobel');%边沿检测 
    Iedge = imdilate(Iedge,ones(3));%图像膨胀
    %新建窗口,绘图用 
    figure (2)
    imshow(Iedge);
    hold on
    %左方直线检测与绘制 
    %得到霍夫空间 
    [H1,T1,R1] = hough(Iedge,'Theta',20:0.1:75); 
    %求极值点
    Peaks=houghpeaks(H1,5); 
    %得到线段信息 
    lines=houghlines(Iedge,T1,R1,Peaks);
    %绘制线段 
    for k=1:length(lines) 
     xy=[lines(k).point1;
    
     lines(k).point2]; 
     plot(xy(:,1),xy(:,2),'LineWidth',4); 
    end 
    %右方直线检测与绘制 
    [H2,T2,R2] = hough(Iedge,'Theta',-75:0.1:-20);
    
    Peaks1=houghpeaks(H2,5); 
    lines1=houghlines(Iedge,T2,R2,Peaks1);
    
    for k=1:length(lines1) 
     xy1=[lines1(k).point1;lines1(k).point2];
    
     plot(xy1(:,1),xy1(:,2),'LineWidth',4);
    
    end
    hold off
    输入图像:


     

      输出图像:



     
    展开全文
  • 霍夫变换检测霍夫变换之直线检测霍夫变换直线检测前提条件-边缘检测已经完成平面空间到极坐标空间的转换(空间域向霍夫域的转换)检测原理两点确定一条直线,通过一点可以确定无数条直线,极坐标直线公式每个点通过...
  • 霍夫变换直线检测(Line Detection)原理及示例

    万次阅读 多人点赞 2019-02-24 20:47:24
    霍夫变换直线检测(Line Detection)原理及示例 微信公众号:幼儿园的学霸 个人的学习笔记,关于OpenCV,关于机器学习, … 问题或建议,请公众号留言; 给定一幅图像(一般为二值图像)中的点集合,如何检测直线? ...
  • 霍夫变换直线检测原理理解

    千次阅读 多人点赞 2018-03-29 19:17:31
    今天有小伙伴提到直线检测,我便讲了霍夫变换,归纳分享下: 首先,介绍笛卡尔空间,就是我们常见的那个几何空间啦,通过 y=kx+b,可以表示直线。 然后,想一下,如果把上面方程变形一下,b=-xk+y,(k和b作为...
  • 霍夫变换直线检测理解

    千次阅读 2017-01-31 19:37:29
    霍夫变换直线检测理解
  • 霍夫变换直线检测

    2019-06-21 11:16:38
    所谓霍夫变换,即对于图像平面上的一个点(x , y ),我们采用参数方程p=xcos(θ)+ysin(θ)把这个点映射到参数p-theta平面,那么图像平面上的一个点就对应p-theta平面的一条曲线,其中的p表示图像平面中的这个点所在...
  • OpenCv里面有个概率霍夫变换,但是不知道原理是什么,请各位大侠指教!。。霍夫变换就是利用参数空间中的(ρ,θ)来表示一条直线,其中ρ是原点到直线的垂直距离,θ是原点到直线的一条垂线段与θ的夹角。通过几何的...
  • 霍夫变换直线检测的matlab实现

    万次阅读 2017-04-14 23:19:21
    霍夫变换直线检测原理与matlab相关函数及其实现。
  • 霍夫变换直线检测 前提条件-边缘检测已经完成 平面空间到极坐标空间的转换(空间域向霍夫域的转换) x=ρcosθx=ρcos\thetax=ρcosθ y=ρsinθy=ρsin\thetay=ρsinθ ρ2=x2+y2ρ^2=x^2+y^2ρ2=x2+y2 tanθ=y/x(x...
  • Opencv学习笔记-----霍夫变换直线检测原理理解

    万次阅读 多人点赞 2016-10-27 12:33:38
    霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定... Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫
  • 霍夫直线检测的基本原理在于利用点与线的对偶性。 在直角坐标系下,一条直线的方程可以用点斜式表示 但是这种表达方式无法表示斜率无穷大的情况(直线垂直于x轴)。 因此,转化到极坐标系下 可以变换为 ...
  • 霍夫变换(Hough Transform)是图像处理中检测是否存在直线的重要算法,该算法是由Paul Hough在1962年首次提出,最开始只能检测图像中的直线,但是霍夫变换经过不断的扩展和完善已经可以检测多种规则形状,例如圆形...
  • 4.霍夫变换直线检测

    2019-03-06 21:54:50
    经典霍夫变换用来检测图像中的直线,后来霍夫变换扩展到任意形状物体的识别,多为圆和椭圆。它的抗噪声、抗形变能力较强。另一种直线提取的方法是对图像边缘点进行链码追踪,在得到的链码串中提取...
  • [转发]霍夫变换直线检测的基本原理

    千次阅读 2015-06-01 21:11:45
    霍夫变换直线检测的基本原理:(不配图了,自己在白纸上画画,理解更深刻)   一步一步来: 1、在白纸上画出一个直角坐标系,任意给出一个点; 2、那么,对于点(x0,y0),经过这个点的直线必定满足y0=k...
  • 我们在前面的《图像的颜色选择》、《图像的感兴趣区域》中提到了对车道线的检测。 通过对原始行车图像...霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆、曲线等。它通过一...
  • OpenCV学习笔记-霍夫变换直线检测

    千次阅读 2018-05-24 18:01:05
    霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过...霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍...
  • 1.霍夫变换的数学原理 关于霍夫变换原理可以参考下面这位大佬的博客:霍夫变换原理 这篇博客的作者对霍夫变换原理解释的非常详细; 2.代码实现 1> HoughLinesP() 相关API: 代码: #include <iostream>...
  • 实验要求,生成5条直线并添加噪声,使用霍夫变换拟合直线 霍夫变换原理请参考此博客:...%生成五条标准直线用于直线检测% % x1=sort(100.*rand(1,100)); % y1=-4*x1+2; % data1=[x1;y...
  • 2、那么,对于点(x0,y0),经过这个点的直线必定满足y0=k*x0+b, 其中k是直线的斜率,b是直线的截距; 3、上式可以化成b=y0-k*x0, 可以看作是以-x0为斜率,以y0为截距,在k-b空间上的一个直线方程(k,b为变量); ...
  • 一、霍夫变换简述 ...最基本的霍夫变换是从黑白图像中检测直线(线段)。霍夫变换是在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集合作为霍夫变换结果。   霍夫变换是于1962年由PaulH
  • 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,...霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由Richard Duda和Peter Hart推广使用[54],经典霍夫变换用来检测图像中的直线,后来霍夫变换...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,631
精华内容 652
关键字:

霍夫变换直线检测原理