Question

J'ai une image dans MATLAB:

im = rgb2gray(imread('some_image.jpg');
% normalize the image to be between 0 and 1
im = im/max(max(im));

Et je l'ai fait un certain traitement qui a donné lieu à un certain nombre de points que je voudrais souligner:

points = some_processing(im);

points est une matrice de la même taille que ceux im avec des points intéressants.

Maintenant, je veux dessiner un cercle sur l'image dans tous les endroits où points est 1.

Y at-il fonction Matlab qui fait cela? Le mieux que je peux trouver est:

[x_p, y_p] = find (points);

[x, y] = meshgrid(1:size(im,1), 1:size(im,2))
r = 5;

circles = zeros(size(im));

for k = 1:length(x_p)
    circles = circles + (floor((x - x_p(k)).^2 + (y - y_p(k)).^2) == r);
end

% normalize circles
circles = circles/max(max(circles));

output = im + circles;

imshow(output)

Cela semble plus un peu inélégante. Est-il un moyen de dessiner des cercles similaires à la fonction line?

Était-ce utile?

La solution

Vous pouvez utiliser la avec un :

[x_p,y_p] = find(points);
imshow(im);         %# Display your image
hold on;            %# Add subsequent plots to the image
plot(y_p,x_p,'o');  %# NOTE: x_p and y_p are switched (see note below)!
hold off;           %# Any subsequent plotting will overwrite the image!

Vous pouvez également régler ces autres propriétés du marqueur du terrain: MarkerEdgeColor , MarkerFaceColor , MarkerSize .

Si vous souhaitez ensuite enregistrer la nouvelle image avec les marqueurs affichés dessus, vous pouvez regarder cette réponse que j'ai donné à une question sur le maintien de dimensions de l'image lors de l'enregistrement d'images à partir des chiffres.

Remarque: Lors du traçage des données d'image avec imshow (ou IMAGE , etc.), l'interprétation normale des lignes et des colonnes devient essentiellement retournée. Normalement, la première dimension de données (lignes) est considéré comme les données qui se trouvent sur l'axe x, et est probablement la raison pour laquelle vous utilisez x_p comme le premier ensemble de valeurs renvoyées par la TROUVER fonction. Cependant, imshow affiche la première dimension des données d'image le long de la axe y , de sorte que la première valeur renvoyée par FIND finit par être le valeur de coordonnée y dans ce cas.

Autres conseils

Ce fichier par Wang Zhenhai de Matlab l'échange de fichiers central le tour est joué.

%----------------------------------------------------------------
% H=CIRCLE(CENTER,RADIUS,NOP,STYLE)
% This routine draws a circle with center defined as
% a vector CENTER, radius as a scaler RADIS. NOP is 
% the number of points on the circle. As to STYLE,
% use it the same way as you use the rountine PLOT.
% Since the handle of the object is returned, you
% use routine SET to get the best result.
%
%   Usage Examples,
%
%   circle([1,3],3,1000,':'); 
%   circle([2,4],2,1000,'--');
%
%   Zhenhai Wang <zhenhai@ieee.org>
%   Version 1.00
%   December, 2002
%----------------------------------------------------------------

Drôle! Il y a 6 réponses ici, ne donne la solution évidente: la fonction rectangle

.

De la documentation :

  

Tracez un cercle en définissant la propriété de Courbure [1 1]. Tracer le cercle de manière à ce qu'il remplisse la zone rectangulaire entre les points (2,4) et (4,6). La propriété Position définit le plus petit rectangle qui contient le cercle.

     

pos = [2 4 2 2];
     rectangle('Position',pos,'Curvature',[1 1])
     axis equal

Donc dans votre cas:

imshow(im)
hold on
[y, x] = find(points);
for ii=1:length(x)
  pos = [x(ii),y(ii)];
  pos = [pos-0.5,1,1];
  rectangle('position',pos,'curvature',[1 1])
end

Contrairement à la réponse acceptée, ces cercles échelle avec l'image, vous pouvez zoomer un, ils marqueront toujours le pixel entier.

Hmm je devais les re-passer dans cet appel:

k = convhull(x,y);
figure;
imshow(image);         %# Display your image
hold on;            %# Add subsequent plots to the image
plot(x,y,'o');  %# NOTE: x_p and y_p are switched (see note below)!
hold off;           %# Any subsequent plotting will overwrite the image!

En réponse aux commentaires:

x et y sont créés en utilisant le code suivant:

temp_hull = stats_single_object(k).ConvexHull;
for k2 = 1:length(temp_hull)
   i = i+1;
     [x(i,1)] = temp_hull(k2,1);    
     [y(i,1)] = temp_hull(k2,2);    
 end;

il se pourrait que l'enveloppe convexe est l'inverse et donc le tracé est différent. Ou que je fait une erreur et il doit être

[x(i,1)] = temp_hull(k2,2);    
[y(i,1)] = temp_hull(k2,1);

Toutefois, la documentation n'est pas clair sur ce qui Colum = x ou y: Quote: « Chaque ligne de la matrice contient le x et y les coordonnées d'un sommet du polygone. »

I lu ce que x est la première colonne et y est la seconde colum.

Dans les nouvelles versions de Matlab (je 2013b) le système de vision par ordinateur Boîte à outils contient vision.ShapeInserter objet système qui peut être utilisé pour dessiner des formes sur les images. Voici un exemple de dessiner des cercles jaunes de la documentation:

yellow = uint8([255 255 0]); %// [R G B]; class of yellow must match class of I
shapeInserter = vision.ShapeInserter('Shape','Circles','BorderColor','Custom','CustomBorderColor',yellow);
I = imread('cameraman.tif'); 
circles = int32([30 30 20; 80 80 25]); %// [x1 y1 radius1;x2 y2 radius2]
RGB = repmat(I,[1,1,3]); %// convert I to an RGB image
J = step(shapeInserter, RGB, circles);
imshow(J);

Avec MATLAB et Image Processing Toolbox R2012a ou plus récent, vous pouvez utiliser le viscircles fonction de superposer facilement cercles sur une image. Voici un exemple:

% Plot 5 circles at random locations
X = rand(5,1);
Y = rand(5,1);
% Keep the radius 0.1 for all of them
R = 0.1*ones(5,1);
% Make them blue
viscircles([X,Y],R,'EdgeColor','b');

En outre, vérifiez la fonction imfindcircles qui met en œuvre la circulaire Hough transformer. La documentation en ligne pour les deux fonctions (liens ci-dessus) ont des exemples qui montrent comment trouver des cercles dans une image et comment afficher les cercles détectés sur l'image.

Par exemple:

% Read the image into the workspace and display it.
A = imread('coins.png');
imshow(A)

% Find all the circles with radius r such that 15 ≤ r ≤ 30.
[centers, radii, metric] = imfindcircles(A,[15 30]);

% Retain the five strongest circles according to the metric values.
centersStrong5 = centers(1:5,:);
radiiStrong5 = radii(1:5);
metricStrong5 = metric(1:5);

% Draw the five strongest circle perimeters.
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b');

Voici la méthode que je pense que vous avez besoin:

[x_p, y_p] = find (points); 

% convert the subscripts to indicies, but transposed into a row vector
a = sub2ind(size(im), x_p, y_p)';

% assign all the values in the image that correspond to the points to a value of zero
im([a]) = 0; 

% show the new image
imshow(im) 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top