【问题标题】:use axes coordinate to generate an image without plotting it, in Matlab在 Matlab 中使用轴坐标生成图像而不绘制图像
【发布时间】:2011-12-05 15:19:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: image matlab pixel axes coordinate


    【解决方案1】:

    由于使用imshow 显示图像后的hold on 语句,椭圆被绘制在现有图的顶部。所以,而不是这个:

    imshow(bw)
    hold on
    

    只需使用figure 语句创建一个新图形:

    figure
    

    [编辑]

    好的,首先,仅存储 (x, y) 只会为您提供椭圆中心。要绘制椭圆,您还需要存储它的长轴/短轴尺寸(ab)和它的方向角(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);否则你会得到一个超出范围的错误。您仍然需要重新考虑是否应该完全删除这些椭圆,或者像这里所做的那样部分绘制。

    【讨论】:

    • 非常感谢!!!但我实际上想同时消除 figure 和 imshow(顺便说一句,在我的代码中我使用的是 figure(); imagesc(bw),而不是 imshow,这不是我的问题)。我所拥有的是 bw 在我的情况下是一个 1024x1392 矩阵,其中每个元素都是一个像素。我从网上获取的代码实际上是生成两个数组:x 和 y,长度为 50 个元素(每个元素值都是椭圆坐标)。如何将坐标轴坐标中的这些信息传递给 bw 矩阵?我的最终目标是做我提到的代码,跳过绘图部分,只是将椭圆添加到 bw 图像
    • @user990253:好的,现在我明白了。我已经用一个例子更新了代码。
    • 非常感谢!这是一个很大的改进,但仍在路上!我实际上需要椭圆周长是一条线,因为我的代码中的下一步是填充周长!顺便说一句,我对 x 和 y 都使用了 dim(1),以便叠加原始图形对象和生成的椭圆。由于超出范围错误,我在原始图像中丢失了很多对象!
    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2011-12-04
    相关资源
    最近更新 更多