version 1.1.0.0 (2.67 KB) by
Jean-Yves Tinevez

Return the optimal pixel coordinates of a circle, given its center and radius.

GETMIDPOINTCIRCLE return the x,y pixel coordinates of a circle

[x y] = getmidpointcircle(x0, y0, radius) returns the pixel coordinates

of the circle centered at pixel position [x0 y0] and of the given integer

radius. The mid-point circle algorithm is used for computation

(http://en.wikipedia.org/wiki/Midpoint_circle_algorithm).

This function is aimed at image processing applications, where the

integer pixel coordinates matter, and for which one pixel cannot be

missed or duplicated. In that view, using rounded trigonometric

coordinates generated using cosine calls are inadequate. The mid-point

circle algorithm is the answer.

Accent is made on performance. We compute in advance the number of point

that will be generated by the algorithm, to pre-allocate the coordinates

arrays. I have tried to do this using a MATLAB class implementing the

iterator pattern, to avoid computing the number of points in advance and

still be able to iterate over circle points. However, it turned out that

repeated function calls is extremely expansive, and the class version of

this function is approximately 1000 times slower. With this function, you

can get the pixel coordinates of a circle of radius 1000 in 0.16 ms, and

this time will scale linearly with increasing radius (e.g. it takes

0.16 s for a radius of 1 million).

Also, this functions ensure that sorted coordinates are returned. The

mid-point algorithm normally generates a point for the 8 circles octants

in one iteration. If they are put in an array in that order, the [x y]

points will jump from one octant to another. Here, we ensure that they

are returned in order, starting from the top point, and going clockwise.

EXAMPLE

n_circles = 20;

color_length = 100;

image_size = 128;

max_radius = 20;

I = zeros(image_size, image_size, 3, 'uint8');

colors = hsv(color_length);

for i = 1 : n_circles

x0 = round( image_size * rand);

y0 = round( image_size * rand);

radius = round( max_radius * rand );

[x y] = getmidpointcircle(x0, y0, radius);

index = 1 ;

for j = 1 : numel(x)

xp = x(j);

yp = y(j);

if ( xp < 1 || yp < 1 || xp > image_size || yp > image_size )

continue

end

I(xp, yp, :) = round( 255 * colors(index, :) );

index = index + 1;

if index > color_length

index = 1;

end

end

end

imshow(I, []);

Jean-Yves Tinevez (2020). Circle pixel coordinates using mid-point algorithm (https://www.mathworks.com/matlabcentral/fileexchange/33844-circle-pixel-coordinates-using-mid-point-algorithm), MATLAB Central File Exchange. Retrieved .

Created with
R2011a

Compatible with any release

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!Create scripts with code, output, and formatted text in a single executable document.

Yavor KamerinesXavier Berthelon@Konstantinos Stamatopoulos

No need to get the [x, y] in your case I think. A simple circle plot using the function 'hold on' will display both your image A and on top the circle with specified radius and center.

Something like this:

th = 0:pi/10:2*pi;

xunit = radius* cos(th) + x_circle;

yunit = radius * sin(th) + y_circle;

imagesc(A)

hold on

h = plot(xunit, yunit);

hold off

Xavier BerthelonKonstantinos StamatopoulosHow can you change only the pixel values with specified coordinates generated with this function in an existed image?

I mean: I have an tiff image (A) 100x780...I specify the x0, y0, radius of the circle (x0 & y0 are pixel coordinates based on image A)....and then I obtain the [x y] from the function. Then, I want to change only the values of those pixels in the image A that I know the coordinates and finally display the whole image A with the changed pixels...So at the end I want to be able to display the original image with the cirle

mohammad hajjarZohar Bar-YehudaJunnice work

JuanIt works well, thanks for uploading