matlab实现几何变换(平移、镜像、旋转、缩放)

1.平移


主函数main.m

close all;  %关闭当前所有图形窗口
clear all;  %清空工作空间变量
clc;        %清屏
I=imread('lena.bmp');
a=50;b=50;
J1=move(I,a,b);
a=-50;b=50;
J2=move(I,a,b);
a=50;b=-50;
J3=move(I,a,b);
a=-50;b=-50;
J4=move(I,a,b);
set(0,'defaultFigurePosition',[100,100,1000,500]);    %修改图形图像位置的默认设置
set(0,'defaultFigureColor', [1 1 1])                  %修改图形背景颜色的设置
figure,
subplot(221),imshow(J1),axis on;
subplot(222),imshow(J2),axis on;
subplot(223),imshow(J3),axis on;
subplot(224),imshow(J4),axis on;

move.m

function J = move(I, a, b)

[M, N, G] = size(I);
I = im2double(I);
J = ones(M + abs(a), N + abs(b), G); %建立新的矩阵,将新图像扩大,避免越过边界

for i = 1:M
    for j = 1:N
        if(a < 0 && b < 0)            
            J(i, j, :) = I(i, j, :);
        elseif(a > 0 && b > 0)
            J(i + a, j + b, :) = I(i, j , :);
        elseif(a < 0 && b > 0)
            J(i, j + b, :) = I(i, j, :);
        else
            J(i + a, j, :) = I(i, j, :);
        end
    end
end
end

实验结果

 

2.镜像


主函数main.m

close all;  %关闭当前所有图形窗口
clear all;  %清空工作空间变量
clc;        %清屏
I=imread('lena.bmp');
J1=mirror(I,1);% 1水平、2垂直、3水平垂直
J2=mirror(I,2);
J3=mirror(I,3);
set(0,'defaultFigurePosition',[100,100,1000,500]);    %修改图形图像位置的默认设置
set(0,'defaultFigureColor', [1 1 1])                  %修改图形背景颜色的设置
subplot(221),imshow(I),axis on;
subplot(222),imshow(J1),axis on;
subplot(223),imshow(J2),axis on;
subplot(224),imshow(J3),axis on;

mirror.m

function J = mirror(I, a)
[M, N, G] = size(I);
I = im2double(I);
J = ones(M, N, G); 
for i = 1:M
    for j = 1:N
        if(a == 1)%水平镜像            
            J(i, N-j+1, :) = I(i, j, :);
        elseif(a == 2 )%垂直镜像 
            J(M-i+1, j, :) = I(i, j, :);
        elseif(a == 3 )%水平垂直
            J(M-i+1, N-j+1, :) = I(i, j, :);
        end
    end
end

实验结果

 3.缩放


主函数main.m

close all;
clear all;
clc;
[I,map]=imread('lena.bmp');
I=rgb2gray(I);
J1=imresize(I,0.1);%缩小
J2=imresize(I,3);%放大两倍
J3=imresize(I,[20 10]);%设置缩放后图像行列
J4=imresize(I,1.6,'bilinear');%双线性插值法
J5=imresize(I,1.6,'triangle');%三角函数插值法

figure,
subplot(231),imshow(I),axis on;
subplot(232),imshow(J1),axis on;
subplot(233),imshow(J2),axis on;
subplot(234),imshow(J3),axis on;
subplot(235),imshow(J4),axis on;
subplot(236),imshow(J5),axis on;

实验结果

 4.旋转


主函数main.m

close all;
clear all;
clc;
I=imread('lena.bmp');
J1=imrotate(I,45);%设置旋转角度,大于0是逆时针,小于0是顺时针。
J2=imrotate(I,-30);
J3=imrotate(I,30,'bicubic','crop'); %设置输出图像大小,双线性插值
J4=imrotate(I,30,'bicubic','loose');%图像足够大,包括旋转图像
figure,
subplot(221),imshow(J1);
subplot(222),imshow(J2);
subplot(223),imshow(J3);
subplot(224),imshow(J4);
% imrotate(I,angel,method,bbox),angel为旋转角度
% method取值为'nearest'最近邻插值,'bilinear'双线性插值和'bicubic'双三次插值
% bbox说明返回图像大小,crop表示一样,loose表示输出的图像足够大包括完整的旋转图像

实验结果

 

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安心不心安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值