数字图像处理--图像旋转

利用书中的公式,实现图像选转操作(不用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');

最终可能有点偏差,实现最终结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值