bw = imerode(bw,se); эрозия с выбранным структурным элементом, тонкие линии исчезают.
se = strel('disk',1); формируем структурный элемент, крест 3 на 3.
Далее необходимо избавиться от тонких линий.
bw = imfill(bw,'holes'); заливаем замкнутые области на изображении.
bw = edge(grayimg,'canny', 0.15, 2); выделяем границы методом Канни. Функция edge предлагает возможность использования алгоритмов Собеля, Робертса, Прюитта и некоторых других, но я, как и , остановил свой выбор на Канни, потому что он, как мне кажется, работает лучше всего. Параметры подбирались имперически, чтобы выделялись границы всех объектов на изображении.
grayimg = imadjust(grayimg); контрастируем.
grayimg = rgb2gray(img); переводим изображение в оттенки серого.
img = imread('kkk.jpg'); открываем наше изображение. Я использовал изображение из статьи .
Заметьте, в нем всего 30 строчек. Из них половина реализует красивый вывод результата. Давайте разберем код.
text(boundary(1,2)-15,boundary(1,1)+15, num2str(radius,3),'Color','y',...
Yfit = radius*sin(theta) + yc;
Xfit = radius*cos(theta) + xc;
yc = stats(k).Centroid(2);
xc = stats(k).Centroid(1);
radius = stats(k).EquivDiameter/2;
stats = regionprops(L,'Centroid','EquivDiameter');
bw = edge(grayimg,'canny', 0.15, 2);
Я старался писать с нуля, исходя из формулировки задачи и не пользуясь алгоритмическими наработками . Естественно, в силу простоты задачи решения очень похожи. В хелпе MATLAB'а по Image Processing Toolbox обнаружился набор демок, посвященных детектированию объектов и в частности поиску круглых форм, что мне очень помогло. Далее приводится код полученного алгоритма на m-языке:
В этом топике я приведу альтернативный подход к задаче, решенной товарищем . Как заметили в комментариях, задачу обнаружения округлостей на изображении можно было решить при помощи MATLAB Image Processing Toolbox, что я и сделал. MATLAB радует меня очень сильной документацией с большим количеством наглядных примеров; а также удобством m-языка, за счет которого сильно сокращается время реализации вычислительных решений. Конечно, есть и минусы в частности алгоритмы работают медленно, но для данной задачи это не существенно. Отмечу только, что из m-языка довольно просто можно получить C-код, который будет работать гораздо быстрее.
Обработка изображений / [Из песочницы] Детектирование округлостей на изображении средствами MATLAB | Gliffer
Комментариев нет:
Отправить комментарий