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

时间:2015-04-26 10:26:22

标签: matlab image-segmentation hough-transform

我正在进行图像分割,测试许多不同的分割算法,以便进行比较研究。目前我正在使用Hough变换在图像中找到圆圈。我正在使用的图像有很多对象,所以当Í计算对象时,结果就是微调。我认为问题在于重叠的圈子。你知道我怎么能删除重叠的圆圈以使结果更贴近现实?

我正在使用的代码是:

    clear all, clc;

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

image used

% Gaussian Filter
W = fspecial('gaussian',[10,10]);
J = imfilter(I,W);
figure(2);imshow(J);set(2,'Name','Filtrada média');
X = rgb2gray(J);
figure(3);imshow(X);set(3,'Name','Grey');

% Finding Circular objects -- Houng Transform
[centers, radii, metric] = imfindcircles(X,[10 20], 'Sensitivity',0.92,'Edge',0.03); % [parasites][5 30]

centersStrong = centers(1:60,:); % number of objects
radiiStrong = radii(1:60);
metricStrong = metric(1:60);
viscircles(centersStrong, radiiStrong,'EdgeColor','r');
length(centers)% result=404!

1 个答案:

答案 0 :(得分:3)

您可以简单地循环圈子并检查其他人是否“接近”它们。如果是这样,你会忽略它们。

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');

图片以红色显示所有圆圈,以蓝色显示过滤后的圆圈。

Disting circles

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

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

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