Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I draw a circle on an image in MATLAB?

I have an image in MATLAB:

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

And I've done some processing that resulted in a number of points that I want to highlight:

points = some_processing(im);

Where points is a matrix the same size as im with ones in the interesting points.

Now I want to draw a circle on the image in all the places where points is 1.

Is there any function in MATLAB that does this? The best I can come up with is:

[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)

This seems more than somewhat inelegant. Is there a way to draw circles similar to the line function?

like image 307
Nathan Fellman Avatar asked Dec 07 '09 15:12

Nathan Fellman


People also ask

How do I add a circle to an image in MATLAB?

Insert Circle and Filled Shapes on an Image I = imread("peppers. png"); Draw a circle on the image with a border line width of 5. RGB = insertShape(I,"circle",[150 280 35],LineWidth=5);

How do I mark an image in MATLAB?

Draw Markers on an ImageInsert a plus (+) marker. RGB = insertMarker(I,[147 279]); Draw four x-marks. pos = [120 248;195 246;195 312;120 312]; color = {'red','white','green','magenta'}; RGB = insertMarker(RGB,pos,'x','color',color,'size',10);


2 Answers

You could use the normal PLOT command with a circular marker point:

[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!

You can also adjust these other properties of the plot marker: MarkerEdgeColor, MarkerFaceColor, MarkerSize.

If you then want to save the new image with the markers plotted on it, you can look at this answer I gave to a question about maintaining image dimensions when saving images from figures.

NOTE: When plotting image data with IMSHOW (or IMAGE, etc.), the normal interpretation of rows and columns essentially becomes flipped. Normally the first dimension of data (i.e. rows) is thought of as the data that would lie on the x-axis, and is probably why you use x_p as the first set of values returned by the FIND function. However, IMSHOW displays the first dimension of the image data along the y-axis, so the first value returned by FIND ends up being the y-coordinate value in this case.

like image 175
gnovice Avatar answered Oct 06 '22 08:10

gnovice


This file by Zhenhai Wang from Matlab Central's File Exchange does the trick.

%----------------------------------------------------------------
% 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 <[email protected]>
%   Version 1.00
%   December, 2002
%----------------------------------------------------------------
like image 28
Nathan Fellman Avatar answered Oct 06 '22 07:10

Nathan Fellman