我有一个充满椭圆形物体的图像。我需要为每个对象设计一个最适合对象本身的椭圆。我在这里找到了一个可以帮助我在图像上绘制椭圆的代码。
我已经更改了最后一部分的保存x
和y
3D 矩阵(一维代表x
,另一个代表y
,第三维代表对象数量)。因为这段代码在一个for
循环中,我不想在它上面生成图形图椭圆,保存它并上传imread
以将它传递给代码的其余部分。
有没有办法在图像中的正确位置将这个 3D 矩阵转换为充满拟合椭圆的 bw 图像?
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);否则你会得到一个超出范围的错误。您仍然需要重新考虑是否应该完全删除这些椭圆,或者像这里所做的那样部分绘制。