Draw ellipse in image

435 views (last 30 days)
Kamu on 1 Jan 2017
Commented: Jiawei Xu on 8 Jun 2021
I would like to draw an ellipse (black-filled) in a white canvas given the center coordinates of the ellipse.
For rectangle, I did it this way (need to fill the rectangle) but for ellipse it seems to be more difficult.
width = 300;
objectWidth = 60;
canvas = ones(width, width);
figure, imshow (canvas);
square = rectangle('Position', [60-objectWidth/2, 40-objectWidth/2, objectWidth, objectWidth], ...
'EdgeColor', [0.5 0.5 0.2]);
I was thinking of the following formula for the ellipse:
a = 1/2*sqrt((x2-x1)^2+(y2-y1)^2);
b = a*sqrt(1-e^2);
t = linspace(0,2*pi);
X = a*cos(t);
Y = b*sin(t);
w = atan2(y2-y1,x2-x1);
x = (x1+x2)/2 + X*cos(w) - Y*sin(w);
y = (y1+y2)/2 + X*sin(w) + Y*cos(w):
plot(x,y,'y-')
axis equal
Any hints would be great. Btw. Happy New Year!

Image Analyst on 2 Jan 2017
Also see my attached demos.
Image Analyst on 2 Jan 2017
What values were you using for the 'FaceColor' and 'Edgecolor' properties in rectangle(). I didn't see where you set those. What did you use?

KSSV on 2 Jan 2017
clc; clear all ;
% An ellipse can be defined as the locus of all points that satisfy the equations
% x = a cos t
% y = b sin t
% where:
% x,y are the coordinates of any point on the ellipse,
% a, b are the radius on the x and y axes respectively,
t = linspace(0,2*pi) ;
a = 30 ; b = 15 ;
x = a*cos(t) ;
y = b*sin(t) ;
plot(x,y,'r')
axis equal
Jiawei Xu on 8 Jun 2021
Just adding to the answer to KSSV: To tilt the ellipse, you can multiply the points with a rotation matrix generated with the function:
function R = Rot2D(angle)
R = [cos(angle), -sin(angle);
sin(angle), cos(angle)];
end
such that
R = Rot2D(angle);
XY_rotated = R*[x;y];
plot(x,y,'r')
We do not know the `angle` here, but if you have the long radius and short radius available to you in vector form, such as
a = [1;5];
b = [-2,0.4];
you can find this angle by applying
angle = atan2(a(2), a(1));