Подсчет количества объектов на изображении с помощью 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);
Это все еще поднимает края на стороне изображения, но отсюда вы собираетесь использовать подключенный 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);