100分 Hough检测圆的代码 要求能在已知图像中 算出圆心 和半径的Hough 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;} (1)对原始图像利用Sobel算子(或者其他边缘提取方法)提取边缘图像; (2)边缘连接得到较高质量的边缘图像; (3)中值滤波(或其他滤波方式)去除孤立噪声点; (4)利用方向匹配模板检测长度大于阀值的连续边缘曲线段,并统计曲线长度; (5)按照曲线段的长度从大到小选择曲线段,等间隔采样三点,计算圆心、半径,利用hough判断是否满足圆的标准,如是圆,存储圆的参数,并且去除对应的边缘图像中的点及其对应的曲线段; (6)如果不是圆,去掉此边缘曲线; (7)重复步骤(3)(4)(5)直到所有曲线段检测完毕。 需要跟踪么?跟踪的目的其实和hough变换是一致的,都是为了获得圆上的点的如果能用跟踪得到圆上的点的话,那么直接用这些点作一次拟和就得到你要的参数了 我需求的代码可以先不考虑性能,但是需要严密,最好能有圆检测的标准Hough变换 (Standard Hough Transform for Circle Detection,简称SHT)的算法,或者 1楼2楼说的那个基于梯度信息的霍夫变换算法(Gering Hough)(这种算法实际就是吧SHT的复杂度降低得到的)。 http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=4985&ref=rssfeed&id=mostDownloadedFilesmatlab程序,或许有用 需要C/C++的代码!!Matlab很多算法是看不到怎么算的,直接集成好的! 谈谈我对RTTI的理解吧 请问,如何自动填写文本框并按回车? 想学VC,不知道有什么好的入门级书没,学过点C/C++ 如何停靠工具栏? 在主线程中中止辅线程,如果辅线程的函数未执行完是不是继续执行,再退出啊? 请问,我的机器一进入98画面后就黑屏是什么原因?改怎样解决?望赐教,谢谢! 一个小功能的实现。谁能提供代码和设计思路(进来有分) 怎样打包? 有关Exchange Server! 还是win2000关机的问题 ADO中奇怪的问题! 请问对于FAT结构的分区,删除文件的过程是什么样的?
根据园的方程(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;
}
跟踪的目的其实和hough变换是一致的,都是为了获得圆上的点的
如果能用跟踪得到圆上的点的话,那么直接用这些点作一次拟和就得到你要的参数了