• 图像处理之图像的几何变换


    一、前言

    图像的几何变换是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置,它不改变图像的像素值,只是改变像素所在的几何位置,使原始图像按照需要产生位置、形状和大小的变化。本文主要介绍图像的基本几何变换,包括图像的平移、镜像变换、转置和放缩。

    二、图像的平移

    1、基本原理

    图像的平移是将一幅图像上的所有点都按照给定的偏移量在水平方向沿x轴、在垂直方向上沿y轴移动,平移后的图像与原图像大小相同。设(x0,y0) 为原图像上的一点,图像水平平移量为△x,垂直平移量为△y,则平移后点(x0,y0)坐标将变为(x1,y1),它们之间的数学关系式如下,坐标平移原理如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在MATLAB中,没有提供具体图像平移函数,直接运用MATLAB指令编程即可实现图像的平移操作。

    2、matlab实现

    I=imread('cameraman.tif');
    a=50;b=50; % a代表纵轴方向(正方向向下),b代表横轴方向(正方向向右)
    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);% 左上平移
    figure(1);
    imshow(I),axis on;% axis on显示坐标轴,而axis off去除坐标轴
    title('原始图像');
    
    figure(2);
    subplot(221),imshow(J1),axis on;
    title('右下平移后的图像');
    subplot(222),imshow(J2),axis on;
    title('右上平移后的图像');
    subplot(223),imshow(J3),axis on;
    title('左下平移后的图像');
    subplot(224),imshow(J4),axis on;
    title('左上平移后的图像');
    
     % 缺陷是平移后的图像不能完整显示
    function J = move(I, a, b)% matlab创建函数:关键字function,且注意函数名和.m文件名必须保持一致和最后以end结尾
    [M, N, G ] = size(I); % 此处写成三维数组是考虑RGB图像对应一个三维数组,而灰度图像对应一个二维数组
    I = im2double(I); % 将图像数据类型转换为双精度
    J= ones(M,N,G); %初始化矩阵为1,大小与原图相同
    for i = 1: M
        for j = 1: N
            if ((i+a >= 1) && (i+a <= M) && (j+b>=1) && (j+b <= N)); %判断坐标是否超出范围;
                J(i+a, j+b, :) = I(i, j, :);
            end
        end
    end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    实现效果:
    在这里插入图片描述
    在这里插入图片描述
    三、图像的镜像

    1、基本原理

    图像的镜像分为两种垂直镜像和水平镜像,其中水平镜像是指图像的左半部分和右半部分以图像竖直中轴线为中心轴进行对换。如原图像上的点坐标是(x0,y0),中心轴如图(a) 所示,经过水平镜像对应的新坐标点为(x1,y1),它们之间的数学关系式为:
    在这里插入图片描述
    垂直镜像是指图像的上半部分和下半部分以图像水平中轴线为中心轴进行对换,如原图像上的点坐标是(x0,J0),中心轴如图(b)所示,则垂直镜像对应的新坐标点为(x1,y1),它们之间的数学关系式为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在MATLAB中,没有提供具体图像镜像函数,直接运用MATLAB指令编程即可实现图像的镜像操作。

    2、matlab实现

    close all;
    clear all;
    clc;
    I=imread('cameraman.tif');
    J1=mirror(I,1);
    J2=mirror(I,2);
    J3=mirror(I,3);
    subplot(221),imshow(I);
    title('原始图像');
    subplot(222),imshow(J1);
    title('水平镜像的图像');
    subplot(223),imshow(J2);
    title('垂直镜像的图像');
    subplot(224),imshow(J3);
    title('水平垂直镜像的图像');
    
    function OutImage=mirror(InImage,n)
    % mirror函数实现图像镜像变换功能
    % 参数n为1时,实现水平镜像变换
    % 参数n为2时,实现垂直镜像变换
    % 参数n为3时,实现水平垂直镜像变换
    I=InImage;
    [M,N,G]=size(I);
    J=I;
    if(n==1)
        for i=1:M
            for j=1:N
                J(i,j,:)=I(M-i+1,j,:);% 水平镜像是指图像的左半部分和右半部分以图像竖直中轴线为中心轴进行对换,公式i=M-i+1
            end
        end
    elseif(n==2)
         for i=1:M
            for j=1:N
                J(i,j,:)=I(i,N-j+1,:);% 垂直镜像是指图像的上半部分和下半部分以图像水平中轴线为中心轴进行对换,公式j=N-j+1
            end
         end
    elseif(n==3)
         for i=1:M
            for j=1:N
                J(i,j,:)=I(M-i+1,N-j+1,:);% 水平垂直镜像
            end
         end
    else
        error('参数n输入不正确,n应取值1,2,3');
    end
    OutImage=J;
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    实现效果:
    在这里插入图片描述
    四、图像的缩放

    1、基本原理

    图像缩放是指将给定的图像在x轴方向按比例缩放fx倍,在y轴方向按比例缩放fy倍,从而获得一幅新的图像。 如果fx=fy,即在x轴方向和y轴方向缩放的比率相同,则称这样的比例缩放为图像的全比例缩放。如果fx≠fy,图像比例缩放会改变原始图像像素间的相对位置,产生几何畸变。

    MATLAB图像处理工具箱中提供了函数imresize()进行图像的缩放操作,其具体的调用格式如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2、matlab实现

    % 利用函数imresize()实现图像的缩放操作
    [X,map]=imread('trees.tif');
    % 第一种格式:B=imresize(A,m)其中m为缩放尺寸,当m取值大于0时小于1,A被缩小;当m取值大于1,A被放大(注意显示的缩小和放大的图像大小与原图像相等)
    J1=imresize(X,0.25);
    J2=imresize(X,3.5);
    % 第二种格式:B=imresize(A,[mrows,ncols])其中数组说明缩放后的B图像的行和列,上下限可以取值NaN
    J3=imresize(X,[64 40]);
    J4=imresize(X,[64 NaN]);
    % 第三种格式:[...]=imresize(...,method)采用method方法对索引图像进行缩放
    J5=imresize(X,1.6,'bilinear');% (method为说明插值方法的类型)bilinear表示双线性插值
    J6=imresize(X,1.6,'triangle');% (method为说明选择插值的核函数)triangle表示三角型核函数
    % 第四种格式:[...]=imresize(...,parameter,value,...)通过设置parameter的值value控制缩放
    [J7,newmap]=imresize(X,'Antialiasing',true,'Method','nearest','Colormap','original','Scale',0.15);% 'Antialiasing'对缩放图像进行边缘柔和,取值为布尔型;'Method'插值方法;'Colormap'为颜色映射,取值为布尔型;'Scale’为缩放比例
    
    figure(1),
    subplot(121),imshow(X);
    title('原始图像');
    subplot(122),imshow(J7);
    title('多参数设置的缩放图像');
    
    figure(2),
    subplot(231),imshow(J1);% 缩小后的图像会丢失一部分信息,出现模糊化
    title('缩小后的图像');
    subplot(232),imshow(J2);% 放大后的图像增加了原图像信息,显示更清晰
    title('放大后的图像');
    subplot(233),imshow(J3);
    title('按照指定行进行缩放的图像');
    subplot(234),imshow(J4);
    title('按照图像纵横比进行缩放的图像');
    subplot(235),imshow(J5);
    title('按bilinear插值的图像缩放的图像');
    subplot(236),imshow(J6);
    title('按triangle插值的图像缩放的图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    实现效果:
    在这里插入图片描述
    在这里插入图片描述
    五、图像的转置

    1、基本原理

    图像转置即为图像的行列坐标互换,如原图像上的点(x0,y0),转置后对应的新坐标点(x1,y1),它们之间的数学表达式为:
    在这里插入图片描述
    需要注意的是,进行图像转置后,图像的大小会发生改变。在MATLAB中,没有提供实现图像转置函数,直接运用MATLAB指令编程即可实现图像的转置操作。

    2、matlab实现

    I=imread('trees.tif');
    I1=transp(I);
    J=imread('cameraman.tif');
    J1=transp(J);
    
    % 行列大小不同,转置生成的图像大小发生变化
    figure(1),
    subplot(121),imshow(I);
    title('原始图像');
    subplot(122),imshow(I1);
    title('转置后的图像');
    
    % 行列大小相同,转置生成的图像大小发生变化
    figure(2),
    subplot(121),imshow(J);
    title('原始图像');
    subplot(122),imshow(J1);
    title('转置后的图像');
    
    % 图像转置即将行列坐标互换
    function J=transp(I)
    % I表示输入的原图像
    % J表示经过转置后的图像
    [M,N,G]=size(I);
    I=im2double(I);% 将图像数据类型转换为双精度(一定要带上否则最终可能显示白色图像)
    J=ones(M,N,G);% 初始化新图像矩阵全为1,大小与输入图像相同
    for i=1:M
        for j=1:N
            J(j,i,:)=I(i,j,:);% 交换行列数据即可
        end
    end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    实现效果:
    在这里插入图片描述
    在这里插入图片描述

    六、图像的旋转

    1、基本原理

    图像的旋转变换属于图像的位置变换,通常是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角度。
    旋转后,图像的大小一般会改变

    在MATLAB图像处理工具箱中提供了函数imrotate()进行图像的旋转操作,其具体的调用格式如下:

    在这里插入图片描述

    2、matlab实现

    % 图像的旋转属于图像位置变换,通常是以图像的中心为原点,将图像上所有像素旋转一个角度
    % 注意旋转后的图像大小一般会改变
    A=imread('office_2.jpg');
    % 第一种格式:B=imrotate(A,angle)即图像A按照angle角度以其原点为中心
    % angle大于0按照逆时针旋转;angle小于0时按照顺时针旋转
    J1=imrotate(A,30);
    J2=imrotate(A,-30);
    % 第二种格式:B=imrotate(A,angle,method,bbox)即图像A按照angle角度以其原点为中心且采用method进行插值,bbox说明返回图像的大小,取值可以是crop或loose
    J3=imrotate(A,30,'bicubic','crop');% bicubic表示插值方法是双三次插值(还有nearest为默认插值方法表示最近邻插值、bilinear表示双线性插值)
    J4=imrotate(A,30,'bicubic','loose');% crop表示输出图像大小和输入图像大小相等(从最终效果来看放大了):loose表示使输出图像足够大包括完整旋转图像(从最终效果来看缩小了)
    subplot(221),imshow(J1);
    title('逆时针旋转的图像');
    subplot(222),imshow(J2);
    title('顺时针旋转的图像');
    subplot(223),imshow(J3);
    title('裁剪后的旋转图像');
    subplot(224),imshow(J4);
    title('不裁剪后的旋转图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    实现效果:
    在这里插入图片描述

    七、图像的剪切

    1、基本原理

    在进行图像处理的过程中,有时用户只对采集的图像部分区域感兴趣,此时需要对原始图像进行剪切。在MATLAB图像处理工具箱中提供了函数imcrop()进行图像的剪切操作,其具体的调用格式如下:
    在这里插入图片描述

    在这里插入图片描述

    2、matlab实现

    (1)利用函数imcrop(),通过指令方式实现图像的剪切操作

    [A,map]=imread('peppers.png');
    rect=[10 100 130 112];% 定义裁剪区域,此区域以图像左上角为原点,向下和向右为正方向
    X1=imcrop(A,rect);% 该函数imcrop按照四元素数组rect剪切图像,其中rect=[xmin ymin width height],纵轴为y轴,横轴为x轴
    subplot(121),imshow(A),axis on;
    title('原始图像');
    rectangle('Position',rect,'LineWidth',2,'EdgeColor','r');% rectangle用来创建矩形,'Position'用来定义矩形大小和位置,'LineWidth'用来显示线条宽度,'EdgeColor'用来显示轮廓颜色
    subplot(122),imshow(X1),axis on;
    title('裁剪图像');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    实现效果:
    在这里插入图片描述
    (2)利用函数imcrop(,通过鼠标操作实现图像的剪切操作

    [A,map]=imread('peppers.png');
    [I2,rect]=imcrop(A);% 该函数类型执行后先显示原图像,然后利用鼠标选择剪切区域,并将剪切区域图像返回给I2,将剪切区域大小返回给rect
    subplot(121),imshow(A);
    rectangle('Position',rect,'LineWidth',2,'EdgeColor','r');
    subplot(122),imshow(I2);
    
    • 1
    • 2
    • 3
    • 4
    • 5

    实现效果:
    在这里插入图片描述
    注意:本例在执行时首先显示原图像,需用户按住鼠标左键选择剪切区域,再在选择的剪切区域内右击弹出剪切菜单,选择"剪切图像"选项即可

    八、图像的空间变换

    1、基本原理

    图像的旋转和剪切都可归结为图像的空间变换,在MATLAB的图像处理工具箱中提供了一个专门的函数intransform(), 用户可以定义参数实现多种类型的空间变换,包括放射变换(如平移、缩放、旋转、剪切)、投影变换等。函数intransform()其具体的调用格式如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在MATLAB中利用函数intransform()实现图像的空间变换时,都需要先定义空间变换的参数。对于空间变换参数的定义,MATLAB也提供了相应的函数maketform(),它的作用是创建进行空间变换的参数结构体,其具体调用方式如下:
    在这里插入图片描述
    用户结合使用函数maketform()和函数intransform(),就可以灵活实现图像的线性变换,而变换的结果和变换参数结构体密切相关。以放射性变换为例,原图像f(x,y)和变换后图像g(x’,y’),放射性变换中原图像中某个像素点坐标(x,y)和变换后该像素点坐标(x’,y’)满足关系式:
    在这里插入图片描述
    在这里插入图片描述
    2、matlab实现

    % B=imtransform(A,TFORM)A是待变换的图像矩阵,TFORM表示执行空间变换的所有参数的结构体且通过函数maketform返回,B为按照TFORM参数变换后的图像矩阵
    [I,map]=imread('peppers.png');
    % T=maketform('affine',A)中返回一个N维放射性变换参数结构体T,输入参数A是一个(N+1)*(N+1)(最后一列必须全为0)(N+1)*N矩阵
    % affine表示二维或N维放射变换
    Ta=maketform('affine',...% 此处的...表示下面还有语句没有写完,即相当于换行的意思
        [cosd(30) -sind(30) 0;sind(30) cosd(30) 0;0 0 1]');% cosd()中参数为度数,cos()中参数为弧度(cosd(30)=根号3/2,sind(30)=0.5)
    % [cosd(30) -sind(30) 0;sind(30) cosd(30) 0;0 0 1]'注意'符号表示矩阵转置,最后一行是0 0 1
    Ia=imtransform(I,Ta);
    
    Tb=maketform('affine',[5 0 0;0 10.5 0;0 0 1]');% [5 0 0;0 10.5 0;0 0 1]'为一个对角矩阵,主对角线元素分别为510.51,最后一列也是0 0 1
    Ib=imtransform(I,Tb);
    
    xform=[1 0 55; 0 1 155;0 0 1]';% 主对角线元素全为1
    Tc=maketform('affine',xform);
    Ic=imtransform(I,Tc,'XData',...% xform(3,1)即为55xform(3,2)即为155
        [1 (size(I,2)+xform(3,1))],'YData',...% size(I,2)=512,size(I,1)=384
        [1 (size(I,1)+xform(3,2))],'FillValues',255);
    
    Td=maketform('affine',[1 4 0;2 1 0;0 0 1]');
    Id=imtransform(I,Td,'FillValues',255);
    
    subplot(221),imshow(Ia),axis on;% 图像旋转
    title('图像的旋转');
    subplot(222),imshow(Ib),axis on;% 图像缩放
    title('图像的缩放');
    subplot(223),imshow(Ic),axis on;% 图像平移
    title('图像的平移');
    subplot(224),imshow(Id),axis on;% 图像整体切变
    title('图像的切变');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    实现效果:
    在这里插入图片描述
    注意:目前的matlab版本中已经弃用imtransform,换成使用imwarp

    >> help imwarp
     imwarp - 对图像应用几何变换
        此 MATLAB 函数 根据几何变换 tform 来变换数值、逻辑或分类图像 A。该函数在 B 中返回变
        换后的图像。
    
        B = imwarp(A,tform)
        B = imwarp(A,D)
        [B,RB] = imwarp(A,RA,tform)
        [___] = imwarp(___,interp)
        [___] = imwarp(___,Name,Value)
    
        另请参阅 图像配准器, affineOutputView, imregister, imregtform, imregdemons,
            imtranslate, randomCropWindow2d, centerCropWindow2d, missing, affine2d,
            affine3d, rigid2d, rigid3d, projective2d, geometricTransform2d,
            geometricTransform3d
    
        imwarp 的文档
        名为 imwarp 的其他函数
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    【Linux】项目日志——输出重定向
    计算机毕业设计Java公交线路查询系统(源码+系统+mysql数据库+Lw文档)
    R3300L, Q7 ATV Android9固件
    算法训练与程序竞赛题目集合(L1)
    vue 组件公共的方法
    博客系统自动化测试
    Mysql高级SQL语句一
    table表格初始化根据字段数字排序,table表格进入后返回上一级设置,第一级隐藏
    Go语言入门心法(十):Go语言操作MYSQL(CRUD)|事务处理
    十八、字符串(2)
  • 原文地址:https://blog.csdn.net/qq_44111805/article/details/126537001