2011-10-11 73 views
2

我有一个图像充满了椭圆形状的对象。我需要为每个物体设计一个最适合物体本身的椭圆。我找到了一段代码,可以帮助我在图像here上绘制椭圆。使用坐标轴生成图像而不绘制它,在Matlab中

我已经改变了最后一部分在3D矩阵(对于x一个维度,其他为y,和对象的数量的第三)保存xy。由于此代码位于for循环中,因此我不想在其上生成图形省略号,将其保存并上传至imread以将其传递给代码的其余部分。

有没有办法将bw图像中的这个3D矩阵转换成完整的图像中正确位置的拟合椭圆?

回答

1

由于在使用imshow显示图像后显示hold on语句,因此在现有图的顶部绘制了省略号。所以,取而代之的是:

imshow(bw) 
hold on 

只需使用figure语句创建一个新的人物:

figure 

[编辑]

好吧,首先,只存储(x, y)给你只有椭圆中心。要绘制椭圆,还需要存储其主轴/副轴尺寸(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);否则会出现超出范围的错误。您仍然需要重新考虑是否应该完全删除这些省略号,或者像这里所做的那样部分地绘制这些省略号。

+0

非常感谢!但我实际上想消除图和imshow(顺便说一句,在我的代码中我使用figure(); imagesc(bw),而不是imshow,这不是我的问题)。我所拥有的是bw是一个1024x1392的矩阵,我的情况是每个元素都是一个像素。我从web上获取的代码实际上是生成两个数组:x和y,长度为50个元素(每个元素值是椭圆坐标)。我怎样才能将这些信息以轴坐标传递给bw矩阵?我的最终目标是执行我提到的代码,跳过绘图部分,然后将椭圆添加到bw图像 – user990253

+0

@ user990253:好的,现在我明白了。我用一个例子更新了代码。 – Groo

+0

非常感谢!这是一个很大的改进,但仍然在路上!我实际上需要椭圆周长是一条线,因为我的代码中的下一步是填充周边!顺便说一下,我用dim(1)来表示x和y,以便重叠原始图形对象和生成的椭圆。由于超出范围的错误,我在原始图像中丢失了很多对象! – user990253