подсчет количества объектов на изображении с помощью MatLab

Мне нужно подсчитать количество мелков на изображении с помощью MatLab. Я попытался преобразовать свое изображение в изображение в градациях серого, а затем выделить границы. Также я попытался преобразовать свое изображение в двоичное изображение и выполнить с ним различные морфологические операции, но не получил желаемого результата. Может быть, я сделал что-то не так. Помогите пожалуйста мне!

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

введите здесь описание изображения


person Vladimir    schedule 17.06.2015    source источник
comment
Вы пробовали алгоритм сегментации, например, водораздел?   -  person ABC    schedule 17.06.2015
comment
Есть 13 мелков.   -  person Ratbert    schedule 17.06.2015


Ответы (3)


Вы можете использовать тот факт, что мел цветной, а разделители серые. Используйте rgb2hsv для преобразования изображения в цветовое пространство HSV и возьмите компонент насыщенности. Ограничьте это, а затем попробуйте использовать морфологию, чтобы разделить кусочки мела.

person Dima    schedule 17.06.2015
comment
На самом деле я пробовал это... Мне не удалось разделить части, используя HSV и компонент насыщения. Вот почему я еще не написал ответ :( - person rayryeng; 17.06.2015
comment
Возможно, поможет сдувание меловой пыли. :) - person Dima; 17.06.2015
comment
Полностью. На самом деле из-за этого границы изображения искажаются после пороговой обработки! - person rayryeng; 17.06.2015

Это также не полное решение, но, надеюсь, оно может стать отправной точкой для вас или кого-то еще.

Как и Дима, я заметил, что мел ярко окрашен, а разделители почти серые. Я подумал, что вы могли бы попытаться изолировать серые пиксели (где серый пиксель говорит красный = синий = зеленый) и пойти дальше. Я пробовал применять фильтры и выполнять морфологические операции, но ничего удовлетворительного не нашел. тем не менее, я надеюсь, что это поможет

mim = imread('http://i.stack.imgur.com/RWBDS.jpg');

%we average all 3 color channels (note this isn't exactly equivalent to
%rgb2gray)
grayscale = uint8(mean(mim,3));

%now we say if all channels (r,g,b) are within some threshold of one another
%(there's probabaly a better way to do this)
my_gray_thresh=25;
graymask =  (abs(mim(:,:,1) - grayscale) < my_gray_thresh)...
          & (abs(mim(:,:,2) - grayscale) < my_gray_thresh)...
          & (abs(mim(:,:,3) - grayscale) < my_gray_thresh);

figure(1)
imshow(graymask);

серая маска

person andrew    schedule 17.06.2015
comment
Вам тоже большое спасибо) возможно мне поможет. - person Vladimir; 18.06.2015

Итак, я потратил немного времени, работая над этим, но, к сожалению, сегодня у меня нет времени, и я прошу прощения за неполный ответ, но, возможно, это поможет вам начать (если вам нужна дополнительная помощь, я отредактирую этот пост выходные, чтобы дать вам более полный ответ :))

Вот код-

for i=1:3
    I = RWBDS(:,:,i);  
    se = strel('rectangle', [265,50]);
    Io = imopen(I, se);
    Ie = imerode(I, se);
    Iobr = imreconstruct(Ie, I);
    Iobrd = imdilate(Iobr, se);
    Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr));
    Iobrcbr = imcomplement(Iobrcbr);
    Iobrcbrm = imregionalmax(Iobrcbr);
    se2 = strel('rectangle', [150,50]);
    Io2 = imerode(Iobrcbrm, se2);
    Ie2 = imdilate(Io2, se2);
    fgm{i} = Ie2;
end

fgm_final = fgm{1}+fgm{2}+fgm{3}; 
figure, imagesc(fgm_final); 

Результат из изображенийc

Он по-прежнему захватывает края сбоку изображения, но отсюда вы собираетесь использовать связанные bwconnectedcomponents, и вы получите длины большой и малой осей, и, посмотрев на соотношения объектов, избавится от тех.

В любом случае удачи!

РЕДАКТИРОВАТЬ: я еще немного поиграл с кодом и обновил приведенный выше код новыми результатами. В тех случаях, когда мне удавалось избавиться от бокового «шума», он избавлялся и от боковых мелов. Я решил, что просто оставлю оба.

Что я сделал: в большинстве случаев преобразование в цветовое пространство HSV — это путь, но, как показал @rayryeng, это не путь. Оттенок работает очень хорошо, когда есть один тип цвета, например, если все мелки были красными. (По логике вещей вы могли бы подумать, что использование цветового канала было бы лучше, но это не так.) В этом случае, однако, единственное, что объединяет все мелки, — это относительная форма. Мое решение в основном использовало эту концепцию, установив элемент структурирования se на что-то вроде базовой формы и соотношения мела и выполнив морфологические операции - как вы изначально догадались, это был путь.

Для получения более подробной информации я предлагаю вам прочитать документацию Matlab по этим конкретным функциям.

И я дам вам понять, как получить последний мел на основе того, что я вам дал :)

person ABC    schedule 17.06.2015
comment
Большое спасибо за ваш ответ! Для меня это будет хорошим стартом, и я постараюсь с этим поработать. Но, честно говоря, я не очень компетентен в этом вопросе, поэтому буду очень признателен, если вы дадите мне более полный ответ (конечно, если у вас будет на это время). - person Vladimir; 17.06.2015
comment
И еще раз большое спасибо за помощь! Вы проделали большую работу и очень помогли мне. Но у меня есть еще один вопрос: что означает эта функция RWBDS? Потому что у меня ошибка в этой части. (извините за мое непонимание) - person Vladimir; 22.06.2015
comment
о, это просто переполнение стека имени дало загруженному вами изображению. Также я только что заметил, что в коде была небольшая ошибка, обновленная, чтобы исправить это. Кроме того, рад, что смог помочь - только спасибо, мне нужен принятый ответ :) Дайте мне знать, если у вас есть дополнительные вопросы. - person ABC; 22.06.2015