⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hole.txt

📁 数字图像中检测圆的半径
💻 TXT
字号:
1、先求出边缘 ,然后拟合迭代。所有的边缘上的点形成一个集合。以边缘上的每一个点作圆心,r为半径(可根据图像选取一个范围: 如从10—30),a为角度(从0到360度),画圆。各个圆相交最多的点为圆心。这种算法有很强的抗干扰性。


2、可以分割出这些圆后,分别进行着色(给每个圆不同的颜色值),然后利用其颜色值去计算其圆心坐标! 

3、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; 


} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -