hough_circle.m
上传用户:mei215
上传日期:2013-07-26
资源大小:13k
文件大小:2k
源码类别:

ICQ弱点检测代码

开发平台:

Matlab

  1. function [hough_space,hough_circle,para] = hough_circle(BW,step_r,step_angle,r_min,r_max,p)
  2. % %%%%%%%%%%%%%%%%%%%%%%%%%%
  3. % input
  4. % BW:二值图像;
  5. % step_r:检测的圆半径步长
  6. % step_angle:角度步长,单位为弧度
  7. % r_min:最小圆半径
  8. % r_max:最大圆半径
  9. % p:阈值,0,1之间的数
  10. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  11. % output
  12. % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数
  13. % hough_circl:二值图像,检测到的圆
  14. % para:检测到的圆的圆心、半径
  15. [m,n] = size(BW);
  16. size_r = round((r_max-r_min)/step_r)+1;
  17. size_angle = round(2*pi/step_angle);
  18. hough_space = zeros(m,n,size_r);
  19. [rows,cols] = find(BW);
  20. ecount = size(rows);
  21. % Hough变换
  22. % 将图像空间(x,y)对应到参数空间(a,b,r)
  23. % a = x-r*cos(angle)
  24. % b = y-r*sin(angle)
  25. for i=1:ecount
  26.     for r=1:size_r
  27.         for k=1:size_angle
  28.             a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle));
  29.             b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle));
  30.             if(a>0&a<=m&b>0&b<=n)
  31.                 hough_space(a,b,r) = hough_space(a,b,r)+1;
  32.             end
  33.         end
  34.     end
  35. end
  36. % 搜索超过阈值的聚集点
  37. max_para = max(max(max(hough_space)));
  38. index = find(hough_space>=max_para*p);
  39. length = size(index);
  40. hough_circle = false(m,n);
  41. for i=1:ecount
  42.     for k=1:length
  43.         par3 = floor(index(k)/(m*n))+1;
  44.         par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;
  45.         par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;
  46.         if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&...
  47.                 (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5)
  48.             hough_circle(rows(i),cols(i)) = true;
  49.         end
  50.     end
  51. end
  52. % 打印检测结果
  53. for k=1:length
  54.     par3 = floor(index(k)/(m*n))+1;
  55.     par2 = floor((index(k)-(par3-1)*(m*n))/m)+1;
  56.     par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m;
  57.     par3 = r_min+(par3-1)*step_r;
  58.     fprintf(1,'Center %d %d radius %dn',par1,par2,par3);
  59.     para(:,k) = [par1,par2,par3];
  60. end