2011-06-15 58 views
8

我想旋转用Matlab非平方图像:没有图像处理工具箱旋转图像

  • 而不使用imrotate功能,因为它是图像处理工具箱的一部分,
  • loose参数,这意味着输出的大小不同于输入图像的大小,
  • 并且与imrotate相比具有不太慢的功能。

我已经为了做到这一点(只需更换imshowbestblk用自己的功能,以便不使用工具箱)发现a function,但它是大型图片很慢。我的方法是尽量避免制作循环,并尽可能依靠interp2


函数的签名将是:

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

其中:

  • interpolation将是bilinearbicubicnearest
  • bboxcroploose

作物

我已经有了一个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. 作物所产生的图像,以具有不遗体旋转图像的填充。

为了获得与loose参数旋转图像的大小,我计算rotation_matrix和四角的输入图像的p的坐标呼叫rotate_points

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); 
+0

令人惊讶的是这个问题有3K的意见,但只有4 upvotes,答案只有2 upvotes,但问题是明确的,正确回答。 – Wok 2013-01-14 17:44:53

回答

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 
+0

太棒了!我相信我(几乎)明白了,谢谢你! – Wok 2011-06-15 12:25:20

+0

@wok:我刚才看到你总是分开加减中心。如果所有的meshgrid都是从'-s/2:s/2'开始的,或者在我的解决方案中只用1:szNew,可能会更容易。 – Jonas 2011-06-15 12:40:34

+0

太棒了!我可以重写'imrotate',但它比900x1000图像上的'imrotate'慢。但仍然可以接受! :) – Wok 2011-06-15 14:37:26