我想旋转用Matlab非平方图像:没有图像处理工具箱旋转图像
- 而不使用
imrotate
功能,因为它是图像处理工具箱的一部分, - 与
loose
参数,这意味着输出的大小不同于输入图像的大小, - 并且与
imrotate
相比具有不太慢的功能。
我已经为了做到这一点(只需更换imshow
和bestblk
用自己的功能,以便不使用工具箱)发现a function,但它是大型图片很慢。我的方法是尽量避免制作循环,并尽可能依靠interp2
。
函数的签名将是:
imOutput = my_imrotate(imInput, theta_degres, interpolation, bbox)
其中:
interpolation
将是bilinear
,bicubic
或nearest
,bbox
将crop
或loose
。
作物
我已经有了一个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);
宽松
我的想法是计算的大小该帧将包含原始图像以及旋转的图像,然后:
- 垫原始图像,以便具有一个图像,其大小是该帧的大小,
- 填充的图像上使用
interp2
, - 作物所产生的图像,以具有不遗体旋转图像的填充。
为了获得与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);
令人惊讶的是这个问题有3K的意见,但只有4 upvotes,答案只有2 upvotes,但问题是明确的,正确回答。 – Wok 2013-01-14 17:44:53