2015-01-09 61 views
0

我有一個圖像,我嘗試計算對象的數量 - 主要填充的圓圈 - 所以爲了消除圓圈之間的重疊,我最終得到了標記圖像,迄今爲止效果很好,沒有我申請
bwconncomp(theLabeledImage,4);的方式來獲得實心圓圈的數字,但我所得到的是這樣的計數標記圖像中的對象數量

Connectivity: 4 
    ImageSize: [505 394 3] 
    NumObjects: 87 
    PixelIdxList: {1x87 cell} 

正好是錯誤的給定輸出是87,而我的圖像中有48。

圖片:

enter image description here

所以任何建議:)?

+0

您可以發佈一個圖片鏈接,有人會爲你上傳。很可能您需要根據對象的大小應用一些閾值才能獲得正確的計數。一個圖像將幫助我們幫助你:) – 2015-01-09 19:49:30

+0

這是一個鏈接到圖像https://drive.google.com/file/d/0B-U9dn2Kg61gVWU5SkdXWnVxS1U/view?usp=sharing – user3038489 2015-01-09 19:57:50

+0

你有**原**圖像,而不是分割?此外,您的圖像周圍有不必要的白色邊框。我的猜測是這張圖片是在一個圖中,並且您選擇了另存爲將該圖保存到文件中。另外,對於物體,圖像有一堆量化誤差,並可能在圖像中顯示爲孤立點。如果你做了連接組件分析,這些點將被視爲單個區域。如果你還有原始圖像,我會更傾向於幫助你。 – rayryeng 2015-01-09 20:34:48

回答

1

有幾件事讓你在這裏絆倒。

首先,我想你是在標記的圖像上運行bwconncomp,而不是二進制圖像。這將會重複計算很多地區,因爲您最終會計算該地區及其邊界。在我的代碼中,請參見下面的代碼(labelImageBWCC = bwconncomp(rgb,4);),最後以89個區域計數。

第二件事是分水嶺變換有時不會在交界處乾淨地斷裂,而是最終會在邊界上產生一堆小區域。這是分水嶺變換的「高原問題」,但幸運的是,我們可以通過簡單地過濾這些具有面積閾值的小區域來避免這個問題的後果。

這些事情糾正後,你可以得到正確數量的硬幣。代碼在這裏:

img = imread('coins.tif'); 

% Threshold and binarize image and fill holes 
binImg = ~im2bw(img, graythresh(img)); 
binImg = imfill(binImg, 'holes'); 

% Distance transform and watershed segmentation 
D = bwdist(~binImg); 
D = -D; 
D(~binImg) = -Inf; 
L = watershed(D); 
% Generate label image 
rgb = label2rgb(L,'jet',[.5 .5 .5]); 
% Show results of watershed 
figure, imshow(rgb,'InitialMagnification','fit') 
title('Watershed transform of coins.tif') 

% Count number of label regions. Note - this is incorrect! This will 
% count borders and background, which we don't want 
labelImageBWCC = bwconncomp(rgb,4); 

% Generate new binary image that only looks at individual regions generated 
% by watershed segmentation so we are counting watershed regions, not label 
% colors 
binWatershed = L > 1; % 1 is background region; any region with index > 1 is coin 
minCoinSize = 50; % minimum size in pixels 
regs = regionprops(binWatershed, 'Area', 'Centroid', 'PixelIdxList'); 
% Remove all regions with size below threshold 
regs(vertcat(regs.Area) < minCoinSize) = []; 


% Display image with coin count labeled 
figure, imshow(img) 
hold on 
for k = 1:numel(regs) 

    text(regs(k).Centroid(1), regs(k).Centroid(2), num2str(k), ... 
     'Color', 'r', 'HorizontalAlignment', 'center') 

end 
hold off