无需图像处理工具箱即可旋转图像

问题描述

| 我想用Matlab旋转非平方图像: 由于它是“图像处理工具箱”的一部分,因此无需使用“ 0”功能, 如果使用ѭ1,参数,则表示输出的大小与输入图像的大小不同, 与
imrotate
相比,其功能不太慢。 我已经找到了执行此操作的功能(只需用您自己的功能替换
imshow
bestblk
即可不使用工具箱),但是对于大图像而言,它确实很慢。我的方法将尝试避免造成循环并尽可能多地依赖
interp2
。 该函数的签名为:
imOutput = my_imrotate(imInput,theta_degres,interpolation,bBox)
哪里:
interpolation
将是
bilinear
bicubic
nearest
bBox
将是
crop
或or1ѭ。 作物 使用
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,Xii,Yii);
    

解决方法

        对于
loose
版本,您所需要做的就是找出所需的填充量。您只需一点点几何就可以轻松估算出它: 如果绘制“宽松”矩形,则实际上是在原始矩形中添加四个直角三角形。三角形的斜边是矩形的边。如果可以确定其他两边,则可以轻松计算出新边的长度,从而计算出内边距。幸运的是,直角三角形的一个角度正是您的旋转角度。 事实证明,您甚至不需要显式计算填充-您只需创建一个更大的数组Xi,Yi即可,其大小为\'loose \'图像。 从而:
[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