利用书中的公式,实现图像选转操作(不用imrotate)。
clear,clc,close all;
f = [1 4 7;2 5 8; 3 6 9];
f = mat2gray(f);
subplot(2,2,1);
imshow(f);
title('原始图片');
angle = -60;
angle = angle/180 *pi;
[H,W] = size(f);
x1 = 0;y1 = 0;
x2 = (H-1)*cos(angle);y2 = -(W-1)*sin(angle);
x3 = (H-1)*cos(angle)+(W-1)*sin(angle);y3 = -(H-1)*sin(angle)+(W-1)*cos(angle);
x4 = (W-1)*sin(angle);y4 = (W-1)*cos(angle);
maxx = max(max(x1,x2),max(x3,x4));
minx = min(min(x1,x2),min(x3,x4));
maxy = max(max(y1,y2),max(y3,y4));
miny = min(min(y1,y2),min(y3,y4));
H_new = ceil(maxx-minx+1);
W_new = ceil(maxy-miny+1);
fn = zeros(H_new,W_new);
for i = 1:H_new
for j = 1:W_new
x_1 = i+minx;
y_1 = j+miny;
x_11 = x_1*cos(angle)-y_1*sin(angle);%书中公式
y_11 = x_1*sin(angle)+y_1*cos(angle);
b = y_11-floor(y_11);
a = x_11-floor(x_11);
x_dl = ceil(x_11-1);y_dl = ceil(y_11-1);
x_dr = ceil(x_11);y_dr = ceil(y_11-1);
x_ul = ceil(x_11-1);y_ul = ceil(y_11);
x_ur = ceil(x_11);y_ur = ceil(y_11);
if x_dl>W%边界处理
x_dl = W;
end
if x_dr>W
x_dr = W;
end
if x_ul>W
x_ul = W;
end
if x_ur>W
x_ur = W;
end
if y_dl>H
y_dl = H;
end
if y_dr>H
y_dr = H;
end
if y_ur>H
y_ur = H;
end
if y_ul>H
y_ul = H;
end
%
if x_dl<1
x_dl = 1;
end
if x_dr<1
x_dr = 1;
end
if x_ul<1
x_ul = 1;
end
if x_ur<1
x_ur = 1;
end
if y_dl<1
y_dl = 1;
end
if y_dr<1
y_dr = 1;
end
if y_ur<1
y_ur = 1;
end
if y_ul<1
y_ul = 1;
end
t1 = f(x_ul,y_ul)+b*(f(x_ul,y_ul)-f(x_ul,y_ul));
t2 = f(x_dr,y_dr)+b*(f(x_ur,y_ur)-t1);
fn(i,j) = t1+a*(t2-t1);
end
end
subplot(2,2,2);
imshow(mat2gray(fn));
title('旋转');
rotated_image = imrotate(f, -60, 'bilinear', 'crop');
subplot(2, 2, 3);
imshow(rotated_image);
title('imrotate');
最终可能有点偏差,实现最终结果: