2015-01-09 3 views
0

У меня есть изображение, которое я пытаюсь подсчитать количество объектов - очень заполненные круги - чтобы убить перекрытие между кругом, я заканчиваю тем самым помеченным изображением, которое хорошо работает до сих пор, нет я применять
bwconncomp(theLabeledImage,4); в пути, чтобы получить количество заполненных кругов, но то, что я получаю выглядит следующим образомПодсчет Количество объектов в помеченном изображении

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

оказавшихся неправильно данный выход 87, в то время как у меня есть 48 в изображении.

Изображение:

enter image description here

Таким образом, любое предложение? :).

+0

Вы можете публиковать ссылку на изображение, и кто-то загрузит его для вас. Очень вероятно, что вам нужно применить некоторый порог, основанный на размере объектов, чтобы получить правильный счет. Изображение поможет нам помочь :) –

+0

Это ссылка на картинку https://drive.google.com/file/d/0B-U9dn2Kg61gVWU5SkdXWnVxS1U/view?usp=sharing – user3038489

+0

У вас есть ** оригинал ** изображение, а не сегментированное? Кроме того, ваше изображение имеет ненужную белую границу, окружающую объекты. Я предполагаю, что это изображение было фигурой, и вы выбрали Save As, чтобы сохранить этот рисунок в файле. Кроме того, что касается объектов, ваше изображение имеет кучу ошибки квантования и может отображаться как изолированные точки на изображении. Если вы подключили компонентный анализ, эти точки будут считаться отдельными регионами. Если у вас есть исходное изображение, я бы больше хотел помочь вам. – rayryeng

ответ

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 
Смежные вопросы