霍夫曼变换

一、简单介绍

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

二、Hough变换的基本思想

   设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。过某
一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-
x0*k+y0对应的直线)。这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设图像上的直
线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点
的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。 同理,原图像上直线y=x上的其它点
(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。这个性质就为我们解决问题提供了方法,就是把图像平面上的点对应到参数平面上的线,          
最后通过统计特性来解决问题。假如图像平面上有两条直线,那么最终在参数平面上就会看到两个峰值点,依此类推。
    简而言之,Hough变换思想为:在原始图像坐标系下的一个点对应了参数坐标系中的一条直线,同样参数坐标系的一条直线对应了原始坐标系下的一个点,然
后,原始坐标系下呈现直线的所有点,它们的斜率和截距是相同的,所以它们在参数坐标系下对应于同一个点。这样在将原始坐标系下的各个点投影到参数坐标
系下之后,看参数坐标系下有没有聚集点,这样的聚集点就对应了原始坐标系下的直线。
  在实际应用中,y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候,直线的斜率为无穷大)。所以实际应用中,是采用参数方程         
p=x*cos(theta)+y*sin(theta)。这样,图像平面上的一个点就对应到参数p---theta平面上的一条曲线上,其它的还是一样。

三、Hough变换推广

1、已知半径的圆

其实Hough变换可以检测任意的已知表达形式的曲线,关键是看其参数空间的选择,参数空间的选择可以根据它的表达形式而定。比如圆的表达形式为 ,所以
当检测某一半径的圆的时候,可以选择与原图像空间同样的空间作为参数空间。那么圆图像空间中的一个圆对应了参数空间中的一个点,参数空间中的一个点对
应了图像空间中的一个圆,圆图像空间中在同一个圆上的点,它们的参数相同即a,b相同,那么它们在参数空间中的对应的圆就会过同一个点(a,b),所
以,将原图像空间中的所有点变换到参数空间后,根据参数空间中点的聚集程度就可以判断出图像空间中有没有近似于圆的图形。如果有的话,这个参数      

四、OpenVC API

  void HoughLinesP(
                    InputArray image, //输入图片 需为8位的单通道二进制图像
                    OutputArray lines, //输出点的做标集合一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2)表示,其中,(x_1, y_1)和(x_2,             
                                       //y_2) 是是每个检测到的线段的结束点。
                    double rho, //以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径,默认为1
                    double theta, //以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。默认为1弧度
                    int threshold, //累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线
                                   //段才可以被检测通过并返回到结果中
                    double minLineLength=0, //有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
                    double maxLineGap=0 )//有默认值0,允许将同一行点与点之间连接起来的最大的距离。


  void cv::HoughCircles
  (
        InputArray image,     // 输入图像(灰度)。
        OutputArray circles,    // 存储套3个的值的矢量:为每个检测到的圆。xc,yc,r
        int method,        // 检测方法: HOUGH_GRADIENT
        double dp,        // 分辨率的反比,默认为1
        double minDist,      //检测到的中心之间的最小距离。
        double param1 = 100,    // 内部Canny边缘检测器的上限阈值。
        double param2 = 100,    // 中心检测阈值。,
        int minRadius = 0,    //要检测的最小半径。如果未知,则将零置为默认值。
        int maxRadius = 0     //要检测的最大半径。如果未知,则将零置为默认值。
  )

转自:cnblogs.com/scnucs/archive/2012/04/18/2455458.html

posted @ 2020-10-03 18:52  luoqi123456  阅读(793)  评论(0)    收藏  举报