Matlab findcircle函数实现 霍夫变换——检测圆

Matlab findcircle函数实现 霍夫变换——检测圆


    实现了基于霍夫变换的findcircle函数,function[circlefind]=findcircle(img,minr,maxr,stepr,stepa,percent)传进来6个参数,img是二值化的边缘图像,minr是最小搜索的圆半径,maxr是最大搜索的圆半径,stepr是圆半径增长步长,stepa是角度增长步长,percent是阈值百分比,返回circlefind,存放了大于阈值的圆的圆心坐标以及半径。

代码如下(附解释)

function[circlefind]=findcircle(img,minr,maxr,stepr,stepa,percent)
r=round((maxr-minr)/stepr)+1;%可增长的步长个数
angle=round(2*pi/stepa);
[m,n]=size(img);
houghspace=zeros(m,n,r);%霍夫空间
[m1,n1]=find(img);%返回二值化边缘检测图像Img中非零点的坐标,m1存放横坐标,n1存放纵坐标
num=size(m1,1);%非零点个数
%霍夫空间,统计相同圆 点的个数
%a = x-r*cos(angle), b = y-r*sin(angle)
for i=1:num
    for j=1:r
        for k=1:angle
            a=round(m1(i)-(minr+(j-1)*stepr)*cos(k*stepa));
            b=round(n1(i)-(minr+(j-1)*stepr)*sin(k*stepa));
            if(a>0&&a<=m&&b>0&&b<=n)
                houghspace(a,b,j)=houghspace(a,b,j)+1;
            end
        end
    end
end
%以阈值来检测圆
par=max(max(max(houghspace)));%找出个数最多的圆的数量作为阈值
par2=par*percent;%百分比percent阈值调整
[m2,n2,r2]=size(houghspace);
circlefind=[];%存储大于阈值的圆的圆心坐标及半径
for i=1:m2
    for j=1:n2
        for k=1:r2
            if (houghspace(i,j,k)>=par2)
                a=[i,j,minr+k*stepr];
                circlefind=[circlefind;a];
            end
        end
    end
end
end

结果如图,传入的二值化边缘图像可以使用edge函数来转化初始图像得到,采用的是canny算子


以下是一个基于霍夫变换的霍夫检测Matlab代码示例: ```matlab function [circlefind = findcircle(img, minr, maxr, stepr, stepa, percent) r = round((maxr - minr) / stepr) + 1; % 可增长的步长个数 angle = round(2 * pi / stepa); % 角度增长步长 [m, n = size(img); houghspace = zeros(m, n, r); % 霍夫空间 [m1, n1 = find(img); % 返回二值化边缘检测图像中非零点的坐标 num = size(m1, 1); % 非零点个数 % 霍夫空间,统计相同点的个数 for i = 1:num for j = 1:r for k = 1:angle a = round(m1(i) - (minr + (j - 1) * stepr) * cos(k * stepa)); b = round(n1(i) - (minr + (j - 1) * stepr) * sin(k * stepa)); if (a > 0 && a <= m && b > 0 && b <= n) houghspace(a, b, j) = houghspace(a, b, j) + 1; end end end end % 以阈值来检测 par = max(max(max(houghspace))); % 找出个数最多的的数量作为阈值 par2 = par * percent; % 阈值百分比调整 [m2, n2, r2 = size(houghspace); circlefind = []; % 存储大于阈值的心坐标及半径 for i = 1:m2 for j = 1:n2 for k = 1:r2 if (houghspace(i, j, k) >= par2) a = [i, j, minr + (k - 1) * stepr]; circlefind = [circlefind; a]; end end end end end ``` 上述代码实现了一个名为`findcircle`的函数,接受六个参数:`img`是二值化的边缘图像,`minr`是最小搜索的半径,`maxr`是最大搜索的半径,`stepr`是半径增长步长,`stepa`是角度增长步长,`percent`是阈值百分比。函数返回一个名为`circlefind`的数组,其中存储了大于阈值的心坐标以及半径。 请注意,这只是一个示例代码,具体使用时需要根据实际需求进行适当修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab 霍夫检测程序源码.zip](https://download.csdn.net/download/ksthen/79245903)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Matlab findcircle函数实现 霍夫变换——检测](https://blog.csdn.net/weixin_36913190/article/details/80504293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值