在没有图像处理工具箱的情况下旋转图像

时间:2011-06-15 10:23:22

标签: matlab image-rotation

我想用Matlab旋转非平方图像:

  • 不使用imrotate函数,因为它是图像处理工具箱的一部分,
  • 带有loose参数的
  • ,表示输出的大小与输入图像的大小不同,
  • imrotate相比功能不太慢。

我已经找到a function来执行此操作(只需将imshowbestblk替换为您自己的函数,以便不使用工具箱),但它是对于大图片来说真的很慢我的方法是尽量避免在interp2上做出循环并尽可能地依赖。


该功能的签名是:

imOutput = my_imrotate(imInput, theta_degres, interpolation, bbox)

其中:

  • interpolation将是bilinearbicubicnearest
  • bbox将为croploose

农作物

我已经使用crop参数获得了良好的结果,但我无法找到loose参数的偏移量。

以下是crop参数的代码,其中Z是输入,Zi是输出:

Z = double(imInput);
sz = size(Z);
[X,Y] = meshgrid(1:sz(2), 1:sz(1));
%# Center
c = sz(end:-1:1)/2;
%# Angle
t = theta_degres*pi/180;
%# Rotation
ct = cos(t);
st = sin(t);
Xi = c(1) + ct*(X-c(1))-st*(Y-c(2));
Yi = c(2) + st*(X-c(1))+ct*(Y-c(2));
%# Rotation
Zi = interp2(X, Y, Z, Xi, Yi);

颗粒状

我的想法是计算包含原始图像和旋转图像的帧的大小,然后:

  1. 填充原始图像以使图像的大小为框架的大小,
  2. 在填充图片上使用interp2
  3. 裁剪生成的图像,以使旋转的图像没有填充的剩余部分。
  4. 要使用loose参数获取旋转图像的大小,我计算rotation_matrix并在输入图像的角rotate_points的坐标上调用p

    rotation_matrix = [ct, -st; st, ct];
    rotate_points = @(p) bsxfun(@plus, c', rotation_matrix * bsxfun(@minus, p, c)')';
    

    任何帮助都将受到高度赞赏。


    编辑:使用下面答案中提供的解决方案和以下代码,它似乎工作正常:

    %# See the answer below
    [sz1,sz2] = size(Z);
    sz1New = sz1*cos(t)+sz2*sin(t);
    sz2New = sz2*cos(t)+sz1*sin(t);
    [Xi,Yi] = meshgrid(-(sz2New-1)/2:(sz2New-1)/2,-(sz1New-1)/2:(sz1New-1)/2);
    %# now all that's left is rotating Xi,Yi - I have already subtracted the center
    
    %# My little piece of additional code
    Xii = (1+sz2)/2 + ct*Xi - st*Yi;
    Yii = (1+sz1)/2 + st*Xi + ct*Yi; 
    Zi = interp2(X, Y, Z, Xii, Yii);
    

1 个答案:

答案 0 :(得分:4)

对于loose版本,您需要做的就是找出所需的填充量。您可以通过一些几何结构轻松估算它:

如果绘制“松散”矩形,则实际上是在原始矩形中添加了四个直角三角形。三角形的斜边是矩形的边。如果您可以确定另外两个边,则可以轻松计算新边的长度,从而计算填充。幸运的是,直角三角形中的一个角正好是你的旋转角度。

事实证明,你甚至不需要明确地计算填充 - 你只需要创建一个更大的阵列Xi,Yi,它具有“松散”图像的大小。

因此:

[sz1,sz2] = size(Z);
sz1New = sz1*cos(t)+sz2*sin(t);
sz2New = sz2*cos(t)+sz1*sin(t);
[Xi,Yi] = meshgrid(-(sz2New-1)/2:(sz2New-1)/2,-(sz1New-1)/2:(sz1New-1)/2);
%# now all that's left is rotating Xi,Yi - I have already subtracted the center