2016-04-17 9 views
0

zu verwandeln habe ich dieses Bild:Wie verschiedene Formen zu Kreisen in Matlab

enter image description here

, die verschiedene Formen hat, und ich möchte jede Form in einem Kreis verwandeln. Und jeder Kreis muss einen unterschiedlichen Radius haben, abhängig von der Größe der Form. Wie kann ich das machen? Mit Morphology Operations oder gibt es irgendwelche Funktionen auf Matlab, die das tun? Ich habe die Funktion Regionprops verwendet, um jede einzelne Form zu erkennen, dann kann ich Operationen für jede Region separat ausführen.

enter image description here

Antwort

3

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 

enter image description here

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 

enter image description here

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; 

enter image description here

+0

Eine solche vollständige Antwort, du bist der Beste. Danke für die Hilfe. Das hat mein Problem gelöst –