2015-04-26 57 views
1

我正在進行圖像分割,測試了很多不同的分割算法,以便進行比較研究。此刻,我正在使用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! 
+0

你可以添加(或鏈接到)圖像'cell.png'嗎? –

+0

@ MartinJ.H。我添加了entier代碼和使用的圖像。非常感謝您的幫助:D – John

+0

非常感謝,它工作得很好:D – John

回答

2

你可以簡單地圈在圈並檢查其他都是「接近」給他們。如果是這樣,你會忽略它們。

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

該代碼可以優化,使循環運行更快,但我不認爲你會有一個單一的圖片數以百萬計的圈子。我試圖用一種更易於閱讀的方式來書寫它。