Как я могу удалить перекрывающиеся круги после сегментации Hough Transform

Я работаю над сегментацией изображений, тестирую множество различных алгоритмов сегментации, чтобы провести сравнительное исследование. На данный момент я использую преобразование Хафа, чтобы найти круги на изображении. На изображениях, которые я использую, много объектов, поэтому, когда я подсчитываю объекты, результат сбивается. Я думаю, проблема в перекрывающемся круге. Вы знаете, как я могу удалить перекрывающиеся круги, чтобы получить результат, более близкий к реальности?

Код, который я использую:

    clear all, clc;

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

используется изображение

% 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!

person John    schedule 26.04.2015    source источник
comment
Не могли бы вы добавить (или дать ссылку) изображение cell.png?   -  person Martin J.H.    schedule 26.04.2015
comment
@МартинДж.Х. Я добавил код ввода и используемое изображение. заранее большое спасибо за помощь :D   -  person John    schedule 26.04.2015
comment
Большое спасибо, все заработало :D   -  person John    schedule 26.04.2015


Ответы (1)


Вы можете просто перебрать круги и проверить, «близки» ли другие к ним. Если это так, вы игнорируете их.

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

На картинке все круги показаны красным цветом, а отфильтрованные круги — синим.

Расходящиеся круги

Предложение if проверяет две вещи: - Ближе ли центры окружностей, чем сумма их радиусов? - Другой круг все еще находится в списке рассматриваемых кругов? Если ответ на оба вопроса положительный, то игнорируйте «текущий круг».

Как настроен цикл, он будет хранить круги, которые higher up (имеют более низкий индекс строки). В нынешнем виде круги уже упорядочены по убыванию metric. Другими словами, как есть, этот код будет сохранять круги с более высоким metric.

Код можно было бы оптимизировать, чтобы циклы выполнялись быстрее, но я не думаю, что у вас будут миллионы кругов на одном изображении. Я попытался написать это так, чтобы людям было легче читать.

person Martin J.H.    schedule 26.04.2015