我的图像中充满了椭圆形状的物体。我需要为每个对象设计一个最适合对象本身的椭圆。我找到了一个代码,可以帮助我在图像here上绘制省略号。
我在3D矩阵中更改了最后一部分保存x
和y
(x
的一个维度,y
的另一个维度,以及数字的第三个维度对象)。因为此代码位于for
循环中,所以我不希望在其上生成图形图椭圆,保存并使用imread
上传以将其传递给代码的其余部分。
有没有办法将bw图像中的这个3D矩阵转换为图像中正确位置的拟合椭圆?
答案 0 :(得分:1)
由于使用hold on
显示图像后的imshow
语句,因此在现有数字的顶部绘制了省略号。所以,而不是:
imshow(bw)
hold on
使用figure
语句创建一个新数字:
figure
<强> [编辑] 强>
好的,首先,仅存储(x, y)
仅为您提供椭圆中心。要绘制椭圆,您还需要存储其majos / minor轴大小(a
,b
)及其方向角(theta
)。
我只是重复使用您已有的循环,但只需将每个坐标的bw图像像素设置为1即可替换plot
:
% 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);否则你会出现超出范围的错误。您仍然需要重新考虑是否应该完全删除这些省略号,或者像这里所做的那样部分绘制。