Image 基于双线性插值的matlab图像旋转

Image 基于双线性插值的matlab图像旋转,image,matlab,rotation,bilinear-interpolation,Image,Matlab,Rotation,Bilinear Interpolation,我尝试使用反向旋转和双线性插值来旋转图像,但唯一看到的是错误消息。它说“第一个索引超过了数组”。我的代码中有什么错误吗?这是一个工作版本,有许多更改。主要区别在于,在将坐标添加到旋转图像之前,它会检查原始图像中是否存在坐标。这允许任意旋转,如45度。此外,MATLAB中的图像以y为第一维,x为第二维,因此可作为I(y,x)或I(行,列)访问 清除 I=imread('256.jpg'); %imshow(I); 中心=128; [y,x]=尺寸(I);%在MATLAB中,图像的大小为y×x(即y

我尝试使用反向旋转和双线性插值来旋转图像,但唯一看到的是错误消息。它说“第一个索引超过了数组”。我的代码中有什么错误吗?

这是一个工作版本,有许多更改。主要区别在于,在将坐标添加到旋转图像之前,它会检查原始图像中是否存在坐标。这允许任意旋转,如45度。此外,MATLAB中的图像以y为第一维,x为第二维,因此可作为
I(y,x)
I(行,列)
访问

清除
I=imread('256.jpg');
%imshow(I);
中心=128;
[y,x]=尺寸(I);%在MATLAB中,图像的大小为y×x(即y为尺寸1)
原始=I;%原始需要的形象,我
旋转I=零(y,x);
θ=90;
对于行=1:y
对于列=1:x
x_原始=(列-中心)*cosd(θ)-(行-中心)*sind(θ)+中心;%θ是以度为单位的,所以使用cosd和sind
y_原始=(列-中心)*正弦(θ)+(行-中心)*余弦(θ)+中心;%还可以将中心重新添加到
p=地板(y_原件);%x_原件和y_原件在这里交换
q=地板(x_原件);%x_原件和y_原件在这里交换
a=y_原-p;
b=x_原始-q;
%检查坐标是否在原始图像中,以防止出现错误

如果p>0&&p 0&&q 0&&p 0&&q+1 0&&p+1 0&&q 0&&p+1 0&&q+1我不知道您是否需要自己的实现。但如果不是,您可以始终使用:

90
=>旋转角度

“双线性”
=>双线性插值(备选方案:
最近的
双三次的

“裁剪”
=>保持旋转图像的像素大小与输入图像相同


imrotate
是图像处理工具箱的一部分。

谢谢!!我不知道matlab是如何工作的。美丽的代码!
clear
I = imread('256.jpg');
%imshow(I);
center = 128;
[x, y] = size(I); % declare image size array
Original = [x, y];
Rotated_I = zeros(x,y); %declare size of array to store pixel
theta = 90;

for row = 1:y
    for column = 1:x
         x_original = (column - 128) * cos(theta) - (row - 128)*sin(theta);
         y_original = (column - 128) * sin(theta) + (row - 128)*cos(theta); % reverse rotate

         p = floor(x_original);
         q = floor(y_original);
         a = y_original - p;
         b = x_original - q; %
         Rotated_I(column, row) = (1-a)*((1-b)*Original(p,q)+b*Original(p,q+1))+a*((q-b)*Original(p+1,q)+b*Original(p+1,q+1)); % Find pixel using bilinear interpolation

    end
end

imshow(Rotated_I);  
Rotated_I = imrotate(I, 90, 'bilinear', 'crop');