würde ich bwlabel
zum ersten Etikett aller Komponenten verwenden. Dann würde ich regionprops
verwenden, um die Begrenzungsbox jeder Komponente zu finden. Sie können dann rectangle
mit einem Curvature
Wert von [1 1]
verwenden, um eine Ellipse an jeder Bounding Box zu zeichnen.
%// Load the image and convert to 0's and 1's
img = imread('http://i.stack.imgur.com/9wRYK.png');
img = double(img(:,:,1) > 0);
%// Label the image
L = bwlabel(img);
%// Compute region properties
P = regionprops(L);
imshow(img)
for k = 1:numel(P)
%// Get the bounding box
bb = P(k).BoundingBox;
%// Plot an ellipse around each object
hold on
rectangle('Position', bb, ...
'Curvature', [1 1], ...
'EdgeColor', 'r', ...
'LineWidth', 2);
end
Wenn Sie tatsächlich Kreise wollen, müssen Sie entscheiden, wie genau Sie einen Kreis aus einem Rechteck definieren. Dafür habe ich nur das Maximum der Breite und Höhe für den Durchmesser verwendet.
t = linspace(0, 2*pi, 100);
cost = cos(t);
sint = sin(t);
for k = 1:numel(P)
bb = P(k).BoundingBox;
%// Compute the radius and center of the circle
center = [bb(1)+0.5*bb(3), bb(2)+0.5*bb(4)];
radius = max(bb(3:4))/2;
%// Plot each circle
plot(center(1) + radius * cost, ...
center(2) + radius * sint, ...
'Color', 'r');
end
Nun, wenn Sie tatsächlich das Bild Daten selbst, anstatt einfach die Anzeige es ändern möchten, können Sie eine meshgrid
aller der Pixelzentren verwenden können, um zu testen, ob ein gegebenes Pixel innerhalb ist ein Kreis oder nicht.
%// Create a new image the size of the old one
newImage = zeros(size(img));
%// Determine the x/y coordinates for each pixel
[xx,yy] = meshgrid(1:size(newImage, 2), 1:size(newImage, 1));
xy = [xx(:), yy(:)];
for k = 1:numel(P)
bb = P(k).BoundingBox;
%// Compute the circle that fits each bounding box
center = [bb(1)+0.5*bb(3), bb(2)+0.5*bb(4)];
radius = max(bb(3:4))/2;
%// Now check if each pixel is within this circle
incircle = sum(bsxfun(@minus, xy, center).^2, 2) <= radius^2;
%// Change the values of newImage
newImage(incircle) = k;
end
%// Create a binary mask of all points that were within any circle
mask = newImage > 0;
Eine solche vollständige Antwort, du bist der Beste. Danke für die Hilfe. Das hat mein Problem gelöst –