灰度图像--图像分割 霍夫变换(Hough Transform)--直线

学习DIP第50天

转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

开篇废话

废话开始,要过年了,到处人心惶惶,沉下心写篇博客,下一篇就等农历新年以后了。马上新年了,希望自己在新年能提高技术,找到一份图像处理的好工作,也希望大家都能学习到更多的知识,做自己喜欢做的事情。

以前基本每天都写博客,坚持了三个月感觉确实有提高,也能把知识总结分享出来,看着每天博客的访问量不断增长,心里很有成就感,共同学习,共同进步,喜欢分享的人,才能获得别人的分享,好多优秀的同学并不喜欢分享知识,或者用很高深的话显示出自己的知识,现在想想,能用俗话说清相对论的人才是高手,让那些故弄玄虚,作假,抄袭欺骗国家欺骗人民的院士,专家都去shi吧。

废话稍微多了一点点,说说霍夫变换,Hough Transform,由Hough提出,问题原型是如何找到图像中的直线,后来延伸到可以检测出任何可以表示成方程的图形,霍夫变换的检测可以检测不完整的图形,也就是中间有间断的,并且霍夫变换对旋转具有不变性,对噪声不敏感,但是霍夫变换的缺点是需要的存储量较大,标准的霍夫变换运算量大,相对较慢。

本篇只介绍标准霍夫变换对直线的检测,放在图像分割这部分是因为冈萨雷斯书中将霍夫变换用于连接边缘。

数学原理

我们本篇只介绍检测直线,对于图像中直线,一般用方程y=kx+b,式子中k表示直线的斜率,b表示直线相对于y轴的截距,如图中所示:

如果按照正常思维,搜索图中的直线,使用穷举的方法,假设图像一共有N个像素任意两点可以构成一条直线,所以过一点应该有(N-1)/2条,所以全图像存在N(N-1)/2条直线,如果要确定一点是否是直线上的点,一共需要至少N2(N?1)/2次计算,这个代价的算法在实际中基本没有价值,于是,Hough提出了一种巧妙的方法,将直线表示成?b=xk?y这种变换的意义在于自变量不是x而是k,y也不再是因变量,b变成了因变量,所以图像上任意两点,可以从(x,y)坐标系映射到(k,b)坐标系,系数选取点(x1=1.8,y1=7.6)和点(x2=3.4,y2=10.8),绘制出两条曲线:

可以根据上图得出k=2,b=4,那么在y=kx+b的点的在k,b坐标系上的交点都在(2,-4)处,

根据上面我们可以利用这个特点,将一幅图像从(x,y)坐标系,转换到(k,b)坐标系,假设原图中有k个亮点,可以在(k,b)坐标系画出k条直线,那么越多的直线交于一点,说明该点的坐标为斜率和截距的直线点在原图中出现频率越大,那么我们就能根据这个特点找出这些点。

问题来了,当原图直线和x轴垂直时,斜率k趋近于无穷大,所以在(k,b)坐标系内无法表示,所以我们换一种方法,使用直线y=kx+b的法线,截距为-b,那么这条直线为y=?1kx?b,如果使用参数方程,原直线为cos(θ)y?sin(θ)?x=cos(θ)b,令?=cos(θ)b原坐标的直线为cos(θ)y?sin(θ)?x=?,那么法线的参数方程为sin(θ)y+cos(θ)?x=??,方程坐标系为(θ,?)。

将上面的思想应用到(θ,?)坐标系,我们将得到,如下的信息,原图:

转换到参数坐标系:

交点出就是两条对角线的参数。

我们来观察一条直线的参数坐标系:

水平直线:

对应参数坐标系:

垂直直线:

对应参数坐标系:

45°直线:

对应参数坐标系:

-45°直线:

对应参数坐标系:

五条直线交于一点:

对应参数坐标系:

上图中越明亮的点说明重叠参数方程越多,我们来观察两条直线对应参数坐标系的立体情况:

原图:

平面的参数方程坐标系:

参数方程坐标系的立体显示:

代码

void SHT(int x,int y,int zero,double * polar){
    double angle_step=POLARSTEP;
    double angle=-M_PI_2;
    for(int i=0;i<POLARWIDTH;i++){
        int p_y=(int)(((sin(angle)*y+cos(angle)*x)+0.5)*POLARHEIGHT_ZOOM)+zero;
        polar[p_y*POLARWIDTH+i]++;
        angle+=angle_step;
    }
}
/////////////////////////////////////////////////////////////////////////////
void HoughLine(double *src,double *dst,int width,int height,int lineLength){
    int polar_height=2*POLARHEIGHT_ZOOM*(int)(sqrt(width*width+height*height)+1);
    int polar_width=POLARWIDTH;
    double *polar=(double *)malloc(sizeof(double)*polar_height*polar_width);
    Zero(polar,polar_width,polar_height);
    for(int j=0;j<height;j++){
        for(int i=0;i<width;i++){
            if(src[j*width+i]==255.0)
                SHT(i, j,polar_height/2,polar);
        }
    }
    for(int j=0; j<polar_height;j++)
        for(int i=0;i<polar_width;i++){
            if(polar[j*polar_width+i]>lineLength){
                double theta=i*POLARSTEP;
                if(theta==M_PI_2)
                    DrawLine(dst, width, height, theta, abs(j-polar_height/2)/POLARHEIGHT_ZOOM);
                else if (theta==0)
                    DrawLine(dst, width, height, theta, abs(j-polar_height/2)/POLARHEIGHT_ZOOM);
                else{
                    DrawLine(dst, width, height, theta, -(int)((j-polar_height/2)/cos(i*POLARSTEP))/POLARHEIGHT_ZOOM);
                }
            }
        }
    free(polar);
}

效果

Hough变换输入图像因为边缘图像,或是二值图像效果如下图:

原图:

边缘检测:

霍夫直线检测:

原图:

边缘检测:

霍夫直线检测:

结论

霍夫变换可以有效的检测出图像中的直线,但需要设定一定的参数,比如定位参数坐标中极大值的方法,以避免错误的检出结果,广义的霍夫变换可以检测任何g(x? ,c? )=0表示的形状,只是计算难度根据方程的复杂度决定,c? 表示方程参数,参数越多需要的存储空间越大,需要的计算量也越大。

待续。。。

时间: 2024-10-27 00:23:52

灰度图像--图像分割 霍夫变换(Hough Transform)--直线的相关文章

Hough Transform直线检测

本文原创,如转载请注明出处. Hough Transform 是一种能提取图像中某种特定形状特征的方法,可以将其描述成一种把图像空间中的像素转换成Hough空间中直线或曲线的一种映射函数.通过利用Hough空间的一些性质,我们可以找到并识别一些有共同特性的点(如在同一条直线上).这样我们就得到足够的信息去画出这些图形(如直线).其输入图像通常为二值边缘图像. 1.原理: 图像空间是所有像素所属于的图像的空间.Hough空间是一种变量混合空间,实际上它与图像相关但是却不存在物理实质性. 我们可以把

Hough transform(霍夫变换)

主要内容: 1.Hough变换的算法思想 2.直线检测 3.圆.椭圆检测 4.程序实现 一.Hough变换简介 Hough变换是图像处理中从图像中识别几何形状的基本方法之一.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变为参数空间的一个点.这样就把原始图像中给定曲线的检测问题转化为寻找参数空间中的峰值问题.也即把检测整体特性转化为检测局部特性.比如直线.椭圆.圆.弧线等. 霍夫变换于1962年由Paul Hough 首次提出[53],后于1972年由

霍夫变换Hough

http://blog.csdn.net/sudohello/article/details/51335237 霍夫变换Hough 霍夫变换(Hough)是一个非常重要的检测间断点边界形状的方法.它通过将图像坐标空间变换到参数空间,来实现直线与曲线的拟合. 1.直线检测 1.1 直线坐标参数空间 在图像x?y坐标空间中,经过点(xi,yi)的直线表示为: yi=axi+b(1) 其中,参数a为斜率,b为截矩. 通过点(xi,yi)的直线有无数条,且对应于不同的a和b值. 如果将xi和yi视为常数

Hough变换直线检测

Hough变换直线检测 [email protected] http://blog.csdn.net/kezunhai 霍夫变换是图像变换中的经典算法之一,主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).霍夫变换寻找直线与圆的方法相比与其它方法可以更好的减少噪声干扰.Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的曲线通过转换到参数空间的一个点. 从图中可以看到,x-y坐标和K-b坐标有点--线的对偶性.x-y坐标中的P1.P2对应于k-b坐标中的L1.L2:

OpenCV2马拉松第22圈——Hough变换直线检测原理与实现

计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/27220445 收入囊中 Hough变换 概率Hough变换 自己实现Hough变换直线检测 葵花宝典 先看一下我实现的效果图 下面,我们进入Hough变换的原理讲解. 看上图,我们知道,经过一点(x0,y0)的直线可以表示成y0 = mox + b0 反过来看方程,b = –x0m + y0 ,于是我们从原来的坐标系转移到了Hough空间,m是横

霍夫变换(hough transform)

x-y轴坐标:y=kx+b k-b轴坐标:b=-xk+y θ-r轴坐标:

灰度图像--图像分割 综合介绍

学习DIP第40天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro

灰度图像--图像分割 阈值处理综述

学习DIP第51天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 新年第一篇博客,图像分割进行到阈值处理,前面学的边缘检测,然后将边缘连接起来,达到分割区域的目的,用到的基础原理是图像灰度的变化,而阈值处理用到的是阈值的不变,也就是把具有相同或相似的灰度的一类像素定义为一个区域,根据这个特点来定义并区分一

灰度图像--图像分割 边缘模型

学习DIP第41天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不满意.有些网站转载了我的博文,很开心的是自己写的东西被更多人看到了,但不开心的是这段话被去掉了,也没标明转载来源,虽然这并没有版权保护,但感觉还是不太好,出于尊重文章作者的劳动,转载请标明出处!!!! 文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro