【问题标题】:Binary image circle fitting二值图像圈拟合
【发布时间】:2017-12-31 18:03:00
【问题描述】:

我是 MATLAB 新手,我正在尝试将圆形拟合技术应用于下图。

图片

预期输出

我没有运气使用以下代码:

[centers, radii] = imfindcircles(W,[30 65],'ObjectPolarity','bright');
figure,imshow(W);% title('Sobel gradient');
viscircles(centers,radii,'Color','b');

请注意,圆的大小可能因图片而异

任何建议。

【问题讨论】:

    标签: matlab image-processing geometry


    【解决方案1】:

    如此接近!你只需要稍微调整一下灵敏度。它的范围从 0 到 1,越高找到的圆圈越多。默认为 0.85。还得稍微调整一下半径:

    imshow(W) % assuming W is logical
    [centers,radii] = imfindcircles(W,[40 60],'ObjectPolarity','bright','Sensitivity',0.925)
    viscircles(centers, radii,'EdgeColor','b');
    

    我认为如果不先得到一些误报,就不可能找到较低的圆圈 - 最终它不是很圆。

    【讨论】:

    • @LeanderMoesigner 如何获得识别的圈数?
    • numel(radii)
    • 将灵敏度更改为 0.98 后,它给了我一个非常好的结果。所以我认为你的答案应该被标记为接受,这样在搜索时会帮助其他人。谢谢
    【解决方案2】:

    尽管我不是一名优秀的数字图像分析师,但我还是尝试对这张图像进行一些尝试。我发现以下方法更加灵活:

    img = imread('1GBtO.png');
    img = im2bw(img);
    
    rp = regionprops('table',img,'Centroid','Eccentricity','EquivDiameter','MajorAxisLength','MinorAxisLength');
    rp.Radii = mean([rp.MajorAxisLength rp.MinorAxisLength],2) / 2;
    
    rp([rp.Eccentricity] > 0.75,:) = [];
    rp(rp.EquivDiameter < 10 | rp.EquivDiameter > 30,:) = [];
    
    imshow(img);
    hold on;
    viscircles(rp.Centroid,rp.Radii);
    hold off;
    

    输出远不是理想的,但我觉得它比你的第一次试验有所改进:

    但我认为您可以通过找到正确的算法来调整半径并调整标准以排除不需要的区域来获得所需的结果。

    【讨论】:

    • 如何得到识别的圈数?
    • 只用:numel(rp)
    • 另一个答案在将灵敏度更改为 0.98 后给出了更好的结果。对于不接受您的回答,我深表歉意。我真的很感谢你的帮助。非常感谢
    • 这不是问题,正如我所说,这超出了我的知识范围。
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 2019-10-18
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多