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

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

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

3 ответа

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

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

Вот код

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); 

Результат от imagesc

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

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

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

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

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

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

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

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

mim = imread('https://stackru.com/images/bbb6abc72048eae857f271d0ef6cc1e33ee84269.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);

graymask

Другие вопросы по тегам