Вот два решения, которые вы можете использовать, 1-й, используя bwconncomp, который находит связанные элементы в двоичном изображении, а второй - imfindcircles, которые считают, что это или нет круги! Поэтому в тех случаях, когда объекты для обнаружения не являются кругами, первое решение было бы предпочтительным.
Я предпочитаю первый, поскольку он различает отдельные круги и кластеры кругов, что и требовалось, тогда как метод, использующий imfindcircles, весьма полезен для идентификации отдельных кругов, поэтому не обязательно кластеры. Вот код:
1- bwconncomp
clear
close all
clc
A = imread('Circles.jpg');
BW = im2bw(A); %// Convert to binary with threshold of 0.5.
CC = bwconncomp(BW); %// Find connected components.
Это то, что CC выглядит, то есть структуру с парой полей:
CC =
Connectivity: 8
ImageSize: [256 256]
NumObjects: 15
PixelIdxList: {1x15 cell}
Как вы видите, есть 15 объектов обнаружено.
Теперь петля Повсеместно он возражает и сюжет/нарисовать их:
BW2 = zeros(size(BW)); %// Create dummy image for display purposes.
imshow(BW2)
hold on
for k = 1:CC.NumObjects %// Loop through each object and plot it in white. This is where you can create individual figures for each object.
PixId = CC.PixelIdxList{k}; %// Just simpler to understand
if size(PixId,1) ==1 %// If only one row, don't consider.
continue
else
BW2(PixId) = 255;
%figure(k) %// Uncomment this if you want individual figures.
imshow(BW2)
pause(.5) %// Only for display purposes.
end
end
Если вы запустите код, который вы увидите, что это на самом деле создает только одну цифру; это только для демонстрации, но если вы хотите, чтобы каждый объект фигуры просто добавлял figure
в цикле, где я заметил, что создаю его.
2- imfindcircles
Здесь принцип очень прост, так как алгоритм обнаруживает круги и сохраняет их радиус и координаты центра. Затем довольно легко построить/обрезать их, чтобы получить их индивидуально. Как я уже сказал, он не обнаруживает кластеров кругов, но я думал, что это может быть хорошо знать в любом случае.
Здесь я создаю фигуру для каждого обнаруженного круга.
A = imread('Circles.jpg');
[centers, radii, ~] = imfindcircles(A,[5 25],'Sensitivity',.95,'ObjectPolarity','bright');
A_crop = cell(1,numel(radii));
for k =1:numel(radii)
%// Since imcrop requires a cropping rectangle, we need to fin the x and y coordinates of the lower-left corner, as well as the width and height of the rectangle.
x = centers(k,1);
y = centers(k,2);
r = radii(k);
A_crop{k} = imcrop(A,[x-r y-r 2*r 2*r]); %// [x y width height]
imshow(A_crop) %// New figure
pause(0.5)
end
Если вы хотите увидеть все круги очерченные, вы можете использовать это:
imshow(A);
hold on
viscircles(centers, radii,'EdgeColor','b');
hold off
дает следующее:
Хорошая работа, мой друг! +1 – rayryeng
Спасибо Рэй! Скажем, вопрос был не самого высокого качества, но было слишком сложно противостоять ему ответить :) –