2

我有一个充满椭圆形物体的图像。我需要为每个对象设计一个最适合对象本身的椭圆。我在这里找到了一个可以帮助我在图像上绘制椭圆的代码。

我已经更改了最后一部分的保存xy3D 矩阵(一维代表x,另一个代表y,第三维代表对象数量)。因为这段代码在一个for循环中,我不想在它上面生成图形图椭圆,保存它并上传imread以将它传递给代码的其余部分。

有没有办法在图像中的正确位置将这个 3D 矩阵转换为充满拟合椭圆的 bw 图像?

4

1 回答 1

1

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);否则你会得到一个超出范围的错误。您仍然需要重新考虑是否应该完全删除这些椭圆,或者像这里所做的那样部分绘制。

于 2011-10-11T20:42:44.673 回答