有幾件事讓你在這裏絆倒。
首先,我想你是在標記的圖像上運行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
您可以發佈一個圖片鏈接,有人會爲你上傳。很可能您需要根據對象的大小應用一些閾值才能獲得正確的計數。一個圖像將幫助我們幫助你:) – 2015-01-09 19:49:30
這是一個鏈接到圖像https://drive.google.com/file/d/0B-U9dn2Kg61gVWU5SkdXWnVxS1U/view?usp=sharing – user3038489 2015-01-09 19:57:50
你有**原**圖像,而不是分割?此外,您的圖像周圍有不必要的白色邊框。我的猜測是這張圖片是在一個圖中,並且您選擇了另存爲將該圖保存到文件中。另外,對於物體,圖像有一堆量化誤差,並可能在圖像中顯示爲孤立點。如果你做了連接組件分析,這些點將被視爲單個區域。如果你還有原始圖像,我會更傾向於幫助你。 – rayryeng 2015-01-09 20:34:48