【问题标题】:Matlab: How to place image on a gridMatlab:如何将图像放在网格上
【发布时间】:2014-09-10 07:21:55
【问题描述】:

我正在学习matlab。我正在尝试创建一个演示来显示几何变换对图像的影响,例如旋转、缩放等。 我创建了一个这样的网格:

I=imread('cameraman.tif');
x = linspace(-1,10);
y = linspace(0,1);
a=imrotate(I,30); % rotate image
figure  imshow(a)
grid on;

我想在网格上放置一个图像并执行几何变换:

1.rotate by 30 degrees.
2. Scale like newx=0.75x and newy=0.6y  (x and y are coordinates on grid)

但我无法将图像放在网格上并进行旋转和缩放。帮帮我,伙计们。

【问题讨论】:

    标签: matlab image-processing


    【解决方案1】:

    我个人会使用imwarp 对您的图像进行几何变换。如果要进行组合旋转和缩放,则无法在一个组合操作中执行此操作。您需要分两步执行此操作,并且需要为每个操作创建适当的转换矩阵。在 MATLAB 中,变换矩阵实际上是计算机图形学中通常定义的转置矩阵。

    旋转的变换矩阵如下所示:

    T = [cos(theta) -sin(theta) 0;
         sin(theta) cos(theta)  0;
             0          0       1];
    

    theta 表示旋转角度。该矩阵将逆时针旋转您的图像。

    每个轴缩放的变换矩阵如下所示:

    T = [sx 0 0;
         0 sy 0;
         0 0 1];
    

    sxsy 是您想要的每个轴的比例因子。

    现在,您所要做的就是制作两个转换矩阵,然后一个接一个地应用。您可以使用affine2d 执行此操作,并指定上述任一转换矩阵。这将创建一个可以与imwarp 一起使用的转换对象。在此之后,您将调用imwarp 两次:您想要的每个转换都调用一次。因此,让我们使用作为 MATLAB 系统路径一部分的 cameraman.tif 图像。因此,您的代码将如下所示:

    theta = pi/6; %// 30 degrees in radians
    Trotate = [cos(theta) -sin(theta) 0;
              sin(theta) cos(theta)  0;
                 0          0       1];
    sx = 0.75;
    sy = 0.6;
    Tscale = [sx 0 0;
         0 sy 0;
         0 0 1];
    
    %// Make objects
    objRotate = affine2d(Trotate);
    objScale = affine2d(Tscale);
    
    %// Read in image
    im = imread('cameraman.tif');
    
    %// Rotate the image
    out = imwarp(im, objRotate);
    
    %// Take the rotated image and scale it
    out2 = imwarp(out, objScale);
    
    %// Show the images
    figure;
    subplot(1,3,1);
    imshow(im); title('Original Image');
    subplot(1,3,2);
    imshow(out); title('Rotated Image');
    subplot(1,3,3);
    imshow(out2); title('Scaled Image');
    

    这是我在运行上述代码时得到的:

    上面的代码执行了您在上面指定的每个转换,并且我创建了一个新图来显示原始图像和您指定的每个转换。

    现在,如果您想将此图像放置在xy 坐标的特定范围内,您当然可以这样做,但您需要指定两个额外的标志:XDataYData。对于这些字段中的每一个,您可以指定轴的最小值和最大值。在您的情况下,x 为 -1 到 10,y 为 0 和 1。请记住,在您转换图像后,我不建议您将图像应用到此网格,因为它看起来非常挤压。但是,如果这是您想要的,您只需这样做:

    imshow(out2, 'XData', [-1 10], 'YData', [0 1]);
    

    这应该可以帮助您入门。祝你好运!

    【讨论】:

    • 谢谢,这是一个很好的开始。我也实现了仿射变换。你能给我一些关于实现透视变换的想法吗?因为它的矩阵中没有标识列。(如果我错了,请纠正我)
    • @nikhilk - 当然!只需使用 projective2d: 类 - mathworks.com/help/images/ref/projective2d-class.html。创建对象的方法同affine2d。我引用的链接中有一些关于如何进行投影变换的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2022-07-07
    • 2015-03-30
    • 2014-01-15
    相关资源
    最近更新 更多