matlab 中没有imrotate,matlab – 在没有图像处理工具箱的情况下旋转图像

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

>不使用imrotate函数,因为它是图像处理工具箱的一部分,

>使用松散参数,这意味着输出的大小与输入图像的大小不同,

>与imrotate相比,功能不太慢.

为了做到这一点,我已经找到了a function(只是用你自己的函数替换imshow和bestblk以便不使用工具箱),但对于大图像来说它真的很慢.我的方法是尽量避免在interp2上进行循环和尽可能多的依赖.

该功能的签名将是:

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

哪里:

>插值是双线性,双三次或最近的,

> bbox会裁剪或松动.

作物

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

这是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,

>裁剪生成的图像,以使旋转的图像没有填充的剩余部分.

要使用松散参数获取旋转图像的大小,我计算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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值