我个人会使用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];
sx 和 sy 是您想要的每个轴的比例因子。
现在,您所要做的就是制作两个转换矩阵,然后一个接一个地应用。您可以使用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');
这是我在运行上述代码时得到的:
上面的代码执行了您在上面指定的每个转换,并且我创建了一个新图来显示原始图像和您指定的每个转换。
现在,如果您想将此图像放置在x 和y 坐标的特定范围内,您当然可以这样做,但您需要指定两个额外的标志:XData 和YData。对于这些字段中的每一个,您可以指定轴的最小值和最大值。在您的情况下,x 为 -1 到 10,y 为 0 和 1。请记住,在您转换图像后,我不建议您将图像应用到此网格,因为它看起来非常挤压。但是,如果这是您想要的,您只需这样做:
imshow(out2, 'XData', [-1 10], 'YData', [0 1]);
这应该可以帮助您入门。祝你好运!