【发布时间】:2011-09-15 10:09:24
【问题描述】:
我想用 Matlab 旋转一个非平方的图像:
- 不使用
imrotate函数,因为它是图像处理工具箱的一部分, - 带有
loose参数,表示输出的大小与输入的图像大小不同, - 与
imrotate相比,功能不太慢。
我已经找到a function 来执行此操作(只需将imshow 和bestblk 替换为您自己的函数,以免使用工具箱),但它真的很慢对于大图像。我的方法会尽量避免循环并尽可能依赖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 次赞成,而答案只有 2 次赞成,尽管问题很清楚并且回答正确。
标签: matlab image-rotation