Эллипсы нарисованы поверх существующего рисунка из-за оператора hold on
после того, как изображение показано с использованием imshow
. Итак, вместо этого:
imshow(bw)
hold on
Просто создайте новую фигуру, используя оператор figure
:
figure
[Изменить]
Хорошо, во-первых, хранение только (x, y)
дает вам только центры эллипса. Чтобы нарисовать эллипс, вам также необходимо сохранить размер его основной / вспомогательной оси (a
, b
) и угол его ориентации (theta
).
Я бы просто повторно использовал цикл, который у вас уже есть, но заменил plot
простым установлением пикселя изображения bw в 1 для каждой координаты:
% get image dimensions
dim = size(bw);
% preallocate a blank bw image
target = false(dim);
% for each ellipse
for k = 1:length(s)
% this part remains the same:
xbar = s(k).Centroid(1);
ybar = s(k).Centroid(2);
a = s(k).MajorAxisLength/2;
b = s(k).MinorAxisLength/2;
theta = pi*s(k).Orientation/180;
R = [ cos(theta) sin(theta)
-sin(theta) cos(theta)];
xy = [a*cosphi; b*sinphi];
xy = R*xy;
x = xy(1,:) + xbar;
y = xy(2,:) + ybar;
% ----------
% but replace plot(x,y) with this:
% limit to image dimensions (1:256)
x(x<1) = 1; x(x>dim(1))=dim(1);
y(y<1) = 1; y(y>dim(2))=dim(2);
% set those pixels to 1
target(sub2ind(dim, round(x),round(y))) = 1;
end
imshow(target);
Прямо сейчас есть эллипсы, которые находятся за пределами границ изображения. Вот почему их координаты x, y должны быть ограничены (1: 256); в противном случае вы получите ошибку вне допустимого диапазона. Вам все еще нужно переосмыслить, должны ли эти эллипсы быть полностью удалены или нарисованы частично, как здесь.