Matlab:如何将图像放在网格上

时间:2014-09-09 22:28:41

标签: matlab image-processing

我正在学习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)

但是我无法将图像放在网格上并旋转以及缩放它。帮帮我们

1 个答案:

答案 0 :(得分:0)

我个人会使用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两次:每次转换一次。因此,让我们使用cameraman.tif图像作为MATLAB系统路径的一部分。因此,您的代码将如下所示:

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');

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

enter image description here

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

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

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

这应该让你开始。祝你好运!