要求能在已知图像中 算出圆心 和半径的Hough 

解决方案 »

  1.   

    hough检测圆
    根据园的方程(x-a)×(x-a)+(y-b)×(y-b)=R×R,将参数空间增加到a,b,R三维空间.
    常用的hough变换计算量太大,然而随机hough变换虽然计算量相对小点,但是准确率没有前者高.现在使用
    一种改进的方法:提取边缘图像,然后边缘跟踪,在边缘曲线上进行hough变换检测圆.double x=0.0,y=0.0,x0=0.0,y0=0.0,cc=0.0,ss=0.0,temp1,temp2;
     int aa=0,bb=0,rr=0,saveaa=0,savebb=0,saverr=0,savexx0=0,saveyy0=0,saveQ=0;
     int pos = ptNumber/3;
        int i = 0,off = 0,k = 0,iBaseFlag = 100,jj = 0;
     int tt = 0,m=0,n=0; 
    int firstBase = 5;
     int secendBase = (2*firstBase+1);
     int aaBase = (R.right+R.left)/2 - firstBase,bbBase = (R.bottom+R.top)/2 -firstBase;
     LONG minrr = 0;
     minrr = (R.right - R.left)>(R.bottom - R.top)?(R.bottom - R.top):(R.right - R.left);
        int memsize = (int)(minrr+2*firstBase) * secendBase *secendBase;
     BYTE * lpabr = new BYTE[memsize];
     memset(lpabr,0,sizeof(BYTE)*memsize);
     int maxcount = -1;
    /* 局部hough变换检测圆曲线段的一部分*/
     for(k=0;k<ptNumber;k+=pos)
     {
      for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)
       {
           if(aa<0)
         continue;
        if(aa>ImageWidth)
         break;
        for(bb=(int)(R.top+R.bottom)/2 -firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)
        {
         if(bb<0)
          continue;
         if(bb>ImageHeight)
          break;
         temp1 = (pt[k].x-aa)*(pt[k].x-aa) + (pt[k].y-bb)*(pt[k].y-bb);
             rr = (int)sqrt(temp1);
         if(rr>=10&&rr<=(int)(minrr/2) + firstBase)
         lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)]++; 
        }
        
       }
     
     } for(rr=10;rr<=(int)(minrr/2) + firstBase;rr++)
      for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)
      {
       if(aa<0)
        continue;
       if(aa>ImageWidth)
        break;
       for(bb=(int)(R.top+R.bottom)/2 - firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)
       {
        if(bb<0)
         continue;
        if(bb>ImageHeight)
         break;
        if(maxcount<lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)])
        {
         maxcount = lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)];
         saverr = rr;
         saveaa = aa;
         savebb = bb;
        }
       }
      }
    if(maxcount>=4)
    {
    //记录保存中心,半经
         saverr = rr;
         saveaa = aa;
         savebb = bb;
    }
      

  2.   

    (1)对原始图像利用Sobel算子(或者其他边缘提取方法)提取边缘图像; (2)边缘连接得到较高质量的边缘图像; (3)中值滤波(或其他滤波方式)去除孤立噪声点; (4)利用方向匹配模板检测长度大于阀值的连续边缘曲线段,并统计曲线长度; (5)按照曲线段的长度从大到小选择曲线段,等间隔采样三点,计算圆心、半径,利用hough判断是否满足圆的标准,如是圆,存储圆的参数,并且去除对应的边缘图像中的点及其对应的曲线段; (6)如果不是圆,去掉此边缘曲线; (7)重复步骤(3)(4)(5)直到所有曲线段检测完毕。
      

  3.   

    需要跟踪么?
    跟踪的目的其实和hough变换是一致的,都是为了获得圆上的点的
    如果能用跟踪得到圆上的点的话,那么直接用这些点作一次拟和就得到你要的参数了
      

  4.   

    我需求的代码可以先不考虑性能,但是需要严密,最好能有圆检测的标准Hough变换 (Standard Hough Transform for Circle Detection,简称SHT)的算法,或者 1楼2楼说的那个基于梯度信息的霍夫变换算法(Gering Hough)(这种算法实际就是吧SHT的复杂度降低得到的)。
      

  5.   

    http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=4985&ref=rssfeed&id=mostDownloadedFilesmatlab程序,或许有用
      

  6.   

    需要C/C++的代码!!Matlab很多算法是看不到怎么算的,直接集成好的!