Несколько вещей были сбиты с пути здесь.
Во-первых, я думаю, что вы запускали 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
Вы можете публиковать ссылку на изображение, и кто-то загрузит его для вас. Очень вероятно, что вам нужно применить некоторый порог, основанный на размере объектов, чтобы получить правильный счет. Изображение поможет нам помочь :) –
Это ссылка на картинку https://drive.google.com/file/d/0B-U9dn2Kg61gVWU5SkdXWnVxS1U/view?usp=sharing – user3038489
У вас есть ** оригинал ** изображение, а не сегментированное? Кроме того, ваше изображение имеет ненужную белую границу, окружающую объекты. Я предполагаю, что это изображение было фигурой, и вы выбрали Save As, чтобы сохранить этот рисунок в файле. Кроме того, что касается объектов, ваше изображение имеет кучу ошибки квантования и может отображаться как изолированные точки на изображении. Если вы подключили компонентный анализ, эти точки будут считаться отдельными регионами. Если у вас есть исходное изображение, я бы больше хотел помочь вам. – rayryeng