Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何在Hough变换分割后删除重叠圆_Matlab_Image Segmentation_Hough Transform - Fatal编程技术网

Matlab 如何在Hough变换分割后删除重叠圆

Matlab 如何在Hough变换分割后删除重叠圆,matlab,image-segmentation,hough-transform,Matlab,Image Segmentation,Hough Transform,我从事图像分割工作,测试了很多不同的分割算法,以便进行比较研究。目前,我正在使用Hough变换在图像中查找圆。我使用的图像有很多对象,所以当Í计算对象时,结果是hudge。我认为问题在于重叠的圆圈。你知道我怎样才能去掉重叠的圆圈,使结果更接近现实吗 我使用的代码是: clear all, clc; % Image Reading I=imread('0001_c3.png'); figure(1), imshow(I);set(1,'Name','Original') 您可以简单地

我从事图像分割工作,测试了很多不同的分割算法,以便进行比较研究。目前,我正在使用Hough变换在图像中查找圆。我使用的图像有很多对象,所以当Í计算对象时,结果是hudge。我认为问题在于重叠的圆圈。你知道我怎样才能去掉重叠的圆圈,使结果更接近现实吗

我使用的代码是:

    clear all, clc;

% Image Reading
I=imread('0001_c3.png');
figure(1), imshow(I);set(1,'Name','Original')


您可以简单地在圆圈上循环,检查其他圆圈是否“接近”。如果是这样,你就忽略它们

idx_mask = ones(size(radii));

min_dist = 1; % relative value. Tweak this if slight overlap is OK.
for i = 2:length(radii)
    cur_cent = centers(i, :);
    for j = 1:i-1
        other_cent = centers(j,:);
        x_dist = other_cent(1) - cur_cent(1);
        y_dist = other_cent(2) - cur_cent(2);
        if sqrt(x_dist^2+y_dist^2) < min_dist*(radii(i) + radii(j)) && idx_mask(j) == 1
            idx_mask(i) = 0;
            break
        end
    end
end
%%

idx_mask = logical(idx_mask);
centers_use = centers(idx_mask, :);
radii_use = radii(idx_mask, :);
metric_use = metric(idx_mask, :);

viscircles(centers_use, radii_use,'EdgeColor','b');
idx_掩码=个(大小(半径));
最小距离=1;%相对值。如果轻微重叠是可以的,则对此进行调整。
对于i=2:长度(半径)
电流=中心(i,:);
对于j=1:i-1
其他=中心(j,:);
x_dist=其他分(1)-当前分(1);
y分区=其他分区(2)-当前分区(2);
如果sqrt(x_dist^2+y_dist^2)
图中所有圆圈均为红色,过滤后的圆圈为蓝色

if
子句检查两件事: -圆的中心比半径之和更近吗? -另一个圈是否仍在被考虑的圈列表中? 如果两个问题的答案都是肯定的,那么忽略“当前圆圈”

按照循环的设置方式,它将保持较高的圆圈(具有较低的行索引)。按原样,圆圈已按降序排列
metric
。换句话说,按原样,此代码将以更高的
度量保持圆圈


代码可以优化以使循环运行得更快,但我不认为在一张图片中会有数百万个圆圈。我试着用一种更易于人类阅读的方式来写它。

你能添加(或链接到)图片
cell.png
?@MartinJ.H吗。我已经添加了entier代码和使用的图像。事先非常感谢您的帮助:D非常感谢,效果很好:D
idx_mask = ones(size(radii));

min_dist = 1; % relative value. Tweak this if slight overlap is OK.
for i = 2:length(radii)
    cur_cent = centers(i, :);
    for j = 1:i-1
        other_cent = centers(j,:);
        x_dist = other_cent(1) - cur_cent(1);
        y_dist = other_cent(2) - cur_cent(2);
        if sqrt(x_dist^2+y_dist^2) < min_dist*(radii(i) + radii(j)) && idx_mask(j) == 1
            idx_mask(i) = 0;
            break
        end
    end
end
%%

idx_mask = logical(idx_mask);
centers_use = centers(idx_mask, :);
radii_use = radii(idx_mask, :);
metric_use = metric(idx_mask, :);

viscircles(centers_use, radii_use,'EdgeColor','b');