图文详解matlab原始处理图像几何变换

目录
  • (一)图像几何变换理论知识
    • (1)图像的平移与比例
    • (2)关于旋转变换
    • (3)关于对称变换
    • (4)复合变换
  • (二)matlab编程实现变换
    • (1)对图像的理解
    • (2)比例变换
    • (3)对称变换
  • 总结

(一)图像几何变换理论知识

(1)图像的平移与比例

图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为

x'= x +Tx;

y'= y +Ty;

其中Tx与Ty分别为对应的偏移量。

图像的比例也很简单,可以描述为:x'=S_x * x;  y'=S_y * y;

那么上述的关系怎么用一个矩阵来表示呢?一个很重要的矩阵来了,那就是变换矩阵T,并且对于二维坐标下的点,一般转化为笛卡尔坐标系下进行计算,用一个三维点表示二维的,只不过把最后一项值置为1,这样一个二维坐标(x,y)就变为 (x,y,1)了。在把上述的平移等式关系转化为矩阵形式为:

比例等式关系为:

(2)关于旋转变换

对于某个点,在坐标系中的变换为(旋转角度为θ,并且逆时针旋转为正):

那么可以看出,这个时候对应的旋转矩阵为T就如图上所示。

(3)关于对称变换

对称变换比较简单,还是以点的变换为例,比如变换前的点P(x,y)和变换后的点P'=(x',y'),那么对称变换包括点关于x轴、y轴、原点、y=x、y=-x等等,点的变换可以自己推导下,这样也就可以得到对应的变换矩阵T了。

比如,关于x对称的话,T=[1,0,0;0,-1,0;0,0,1],关于原点对称的话,T=[-1,0,0;0,-1,0;0,0,1];关于y=x对称的话,T=[0,1,0;1,0,0;0,0,1];等等。

(4)复合变换

下面再重点介绍下复合变换,因为有的变换不是简单的初等变换,但是有一点需要明确的是任何复合变换都可以用初等变换一步步变换而来。比如前面的旋转变换,旋转点选取的是原点,这样才有的那个公式,那要是旋转点不是原点怎么办?比如任一点s(X_f,Y_f),那么点P绕着点s旋转一定的角度θ该怎么表示呢?这里就要把这个复合变换化成为3个简单的初等变换,具体步骤为:首先把s点平移操作至原点(这个过程中,相当于所有的点都按照一定的方向平移了),然后相当于在原点对平移后的P点进行旋转变换,变换完后再把这个店反平移回去,这样是不是就相当于完成了那个复合变换。此时的变换矩阵为T,则T可以看出是两次平移矩阵T1、T2和一次旋转矩阵T3相乘的组合,即T=T1*T3*T2,注意方向不能反,因为是矩阵相乘,反的话相乘的结果不一定相同。

那么这个时候总的变换矩阵T就是:

这个在编程实现原点移动位置时至关重要。

几何变换的基础知识就说到这,具体的可以再找相关文章了解。

(二)matlab编程实现变换

(1)对图像的理解

Matlab表示一副图像的方法很简单,对于灰度图像来说,就是一个二维矩阵,行与列存的就是像素点的位置,而矩阵值就是该像素点的灰度值。这里以有名的一副图lenna图为例,那么直接image=imread(‘lenna.jpg')就可以加载带matlab工作框中,显示的话imshow(image)就可以了,显示如下:

(2)比例变换

了解了变换的基本原理,要知道其中最重要的就是关于坐标的变换。如果以上图中的行和列都为1的点作为原点的话,变换的程序为:

%-------------函数说明----------------
%    比例变换
%       输入变量:img 灰白图像(彩色不行)
%                s_x  x方向上的比例系数
%                s_y  y方向上的比例系数
%-------------------------------------
function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
T1 = [s_x,0,0;0,s_y,0;0,0,1];   %对应的比例系数矩阵
for i=1:m
    for j=1:n
        p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
        if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
         new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
        else
        new_matrix(i,j) = 0;     %没有的点赋值为0
        end
    end
end
figure;imshow(new_matrix,[]);
————————————————
版权声明:本文为CSDN博主「on2way」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/on2way/article/details/40460675

这样运行对应程序:

bili(image,2,2):

bili(image,0.5,0.5):

可以看到,分别对图像扩大和缩小的时候,都是以行和列为1为原点来操作的。如果还是以这个点来进行旋转操作的话,就会非常不协调不好看。况且如果了解matlab本身自带这些旋转、比例操作函数的话会发现,这些函数操作原点是图像的正中心,这样操作起来后才很好看。那么现在的问题就是如何把图像的中心作为我们在坐标系下认为的原点呢?那就是上面讲到的三步走了,首先平移中心点至原点,再变换,再平移至中心点就好了。我们需要做的就是确定平移的行与列的长度(平移的长度应该是图像行与列总长度的一半吧,如果是把中心点当做原点的话)。基于此修改上述的程序如下:

function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移

T1 = [s_x,0,0;0,s_y,0;0,0,1];   %对应的比例系数矩阵
T = T2*T1*T3;     %P_new = P_old*T2*T1*T3  顺序不能错了
for i=1:m
    for j=1:n
        p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
        if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
         new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
        else
        new_matrix(i,j) = 0;     %没有的点赋值为0
        end
    end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);

从程序可以看出,只是多了那么两个矩阵而已就可以实现原点的转移了。

运行相应程序,bili(image,2,2):

bili(image,0.5,0.5):

可以看出,这样操作以后是不是协调多了,基本上和matlab自带的函数有相同的功能了。

(3)对称变换

对称变换和上述变换差不多,无非修改相应的变换矩阵,程序如下:

%-------------函数说明----------------
%    对称变换
%       输入变量:img 灰白图像(彩色不行)
%                num 对称类型
%     0:原点对称,1:x轴对称,2:y轴对称
%     3:y=x轴对称 4:y=-x轴对称  其他。。
%-------------------------------------
function duichen(img,num)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移

T_x = [1,0,0;0,-1,0;0,0,1];     %x轴对称矩阵
T_y = [-1,0,0;0,1,0;0,0,1];     %y轴对称矩阵
T_o = [-1,0,0;0,-1,0;0,0,1];    %原点对称矩阵
T_yx = [0,1,0;1,0,0;0,0,1];     %y=x对称的矩阵
T_xy = [0,-1,0;-1,0,0;0,0,1];   %y=-x对称的矩阵
switch num                     %选择某一种对称方式
    case 0
        T = T2*T_o*T3 ;
    case 1
        T = T2*T_x*T3 ;
    case 2
        T = T2*T_y*T3 ;
    case 3
        T = T2*T_yx*T3 ;
    case 4
        T = T2*T_xy*T3 ;
end
for i=1:m                  %对于每一个像素点
    for j=1:n
        p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
        if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
         new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
        else
        new_matrix(i,j) = 0;     %没有的点赋值为0
        end
    end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
————————————————

运行相应程序:

>> duichen(image,0)

>> duichen(image,2)

(4)旋转变换

%-------------函数说明----------------
%    旋转变换
%       输入变量:img 灰白图像(彩色不行)
%                theat 变化的角度,逆时针旋转为正
%---------------------------------------
function xuanzhuan(img,theat)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移

T1 = [cos(theat),sin(theat),0;-sin(theat),cos(theat),0;0,0,1];%旋转变换
T = T2*T1*T3;                  %P_new = P_old*T2*T1*T3  顺序不能错了
for i=1:m
    for j=1:n
        p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
        if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
         new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
        else
        new_matrix(i,j) = 0;     %没有的点赋值为0
        end
    end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);

运行相应程序:

>> xuanzhuan(image,pi/4)

>> xuanzhuan(image,-pi/3)

至此,一些基本的几何变换操作就完成了,其他的变换就在次基础上发挥了。

有一个问题是上述的变换在旋转的时候,原图的部分图像会被切割掉,这个是没有考虑到的,因为部分像素点在变换以后必然超出范围,对比matlab自带的旋转函数可以发现自带的函数是可以对出界的部分进行压缩到范围内。当然这一点我们也可以编程处理,不过稍微要麻烦点,必须对每个像素点再进行压缩处理,这个有待研究。

二维图像的几何变换大致如此了。那么引申一下,对于三维图像的几何变换怎么处理了?其实归结到底还是有一个变换矩阵T,而这个矩阵不再是3*3的了,这个时候增加了一维,那么对应的矩阵也得增加一维变成4*4的了,维数的增加必然带来处理上的更加复杂了,不过理解了二维变换的原理,再来处理三维的话还是很好处理的,弄清楚对应关系就可以了。

总结

到此这篇关于matlab原始处理图像几何变换的文章就介绍到这了,更多相关matlab原始处理图像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 图文详解matlab原始处理图像几何变换

    目录 (一)图像几何变换理论知识 (1)图像的平移与比例 (2)关于旋转变换 (3)关于对称变换 (4)复合变换 (二)matlab编程实现变换 (1)对图像的理解 (2)比例变换 (3)对称变换 总结 (一)图像几何变换理论知识 (1)图像的平移与比例 图像的平移很简单,平移前后的坐标分别为(x,y)和(x',y'),则满足的关系式为 x'= x +Tx: y'= y +Ty: 其中Tx与Ty分别为对应的偏移量. 图像的比例也很简单,可以描述为:x'=S_x * x;  y'=S_y * y;

  • Linux操作系统启动流程图文详解

    理解Linux操作系统启动流程,能有助于后期在企业中更好的维护Linux服务器,能快速定位系统问题,进而解决问题. 上图为Linux操作系统启动流程 1.加载BIOS 计算机电源加电质检,首先加载基本输入输出系统(Basic Input Output System,BIOS),BIOS中包含硬件CPU.内存.硬盘等相关信息,包含设备启动顺序信息.硬盘信息.内存信息.时钟信息.即插即用(Plug-and-Play,PNP)特性等.加载完BIOS信息,计算机将根据顺序进行启动. 2.读取MBR 读取

  • 详解基于python的图像Gabor变换及特征提取

    1.前言 在深度学习出来之前,图像识别领域北有"Gabor帮主",南有"SIFT慕容小哥".目前,深度学习技术可以利用CNN网络和大数据样本搞事情,从而取替"Gabor帮主"和"SIFT慕容小哥"的江湖地位.但,在没有大数据和算力支撑的"乡村小镇"地带,或是对付"刁民小辈","Gabor帮主"可以大显身手,具有不可撼动的地位.IT武林中,有基于C++和OpenCV,或

  • Python的Pillow库进行图像文件处理(图文详解)

    目录 目标 1.打开PyCharm,创建一个新的.py文件 2.配置环境 3.PIL库概述 4.代码段 本文详解的讲解了使用Pillow库进行图片的简单处理,使用PyCharm开发Python的详细过程和各种第三方库的安装与使用. 目标 1.熟悉Python的开发环境: 2.掌握Pillow库的安装方法: 3.熟悉Pillow库的使用方法. 开始吧! 1.打开PyCharm,创建一个新的.py文件 2.配置环境 本文中使用Python3.6版本开发 点击ok 2.库的安装使用 在搜索栏中输入pi

  • 详解Matlab如何绘制小提琴图

    目录 1使用示例 基础使用,Y为矩阵 基础使用,Y为向量,X为标签 基础使用多个图像绘制,并添加图例 2完整代码 写了个matlab绘制小提琴图的函数: 1.图中小提琴状区域为核密度曲线 2.白色方块为25%,75%分位数 3.中间横线为中位数 4.白色点为离群值点 5.竖着的黑线是去掉离群值点后点的上下限 1使用示例 基础使用,Y为矩阵 X=1:5; Y=randn(100,5); Hdl1=violinChart(gca,X,Y,[0 0.447 0.741],0.6); X:横坐标 Y:数

  • 详解Matlab如何绘制桑基图

    目录 详细用法 1使用示例 2输入参数 3输出 函数完整代码 使用示例代码 这次主要是分享自己写的一个函数,用来绘制桑基图,效果大概是下面这样子: 先说明函数(sankey2)怎么用,函数完整代码放在博客最后 详细用法 1 使用示例 新建一个m文件,运行如下代码 List={'a1',1,'A'; 'a2',1,'A'; 'a3',1,'A'; 'a3',0.5,'C'; 'b1',1,'B'; 'b2',1,'B'; 'b3',1,'B'; 'c1',1,'C'; 'c2',1,'C'; 'c

  • 详解Matlab如何绘制圆角半透明图例

    目录 基本使用 使用说明 完整代码 目前MATLAB的legend图例是不支持圆角和半透明的,欸,不能咱就自己画,就是把原始图例隐藏后不断追踪其位置绘制半透明的圆角矩形嘛,这有任何难度吗???完全没有!!因此就有了这篇推送(目前不支持三维绘图): 基本使用 继续假设我们编写了如下代码: t=0:0.35:3*pi; plot(t,sin(t),'Marker','d','LineWidth',2,'Color',[102,194,166]./255) hold on plot(t,cos(t./

  • 一文详解matlab实现形态学图像处理

    目录 目的 内容 膨胀的简单应用 函数imopen 和imclose 的应用 灰度图像形态学开运算和闭运算 灰度图像形态学使用重构删除复杂图像的背景 目的 文章和代码以及样例图片等相关资源,已经归档至[Github仓库:digital-image-processing-matlab] 膨胀的简单应用.使用 strel 函数.腐蚀的说明 函数imopen 和imclose 的应用.使用IPT函数bwhitmiss 灰度图像形态学开运算和闭运算 灰度图像形态学使用重构删除复杂图像的背景 内容 膨胀的

  • Mac OS系统下mysql 5.7.20安装教程图文详解

    Mac OS X 下 TAR.GZ 方式安装 MySQL 5.7 与 MySQL 5.6 相比, 5.7 版本在安装时有两处不同: 1:初始化方式改变, 从scripts/mysql_install_db --user=mysql初始化方式变成了bin/mysqld --initialize --user=mysql方式; 2: 初始密码生成改变, 5.6 的版本在 tar gz 方式初始化完成后默认 root 密码为空, 5.7 版本在初始化完成后会生成一个临时的 root 密码: 一.在浏览

  • Microsoft Sql server2005的安装步骤图文详解及常见问题解决方案

    一:安装sql server 2005过程中出现如下问题:"选择的功能中没有任何功能可以安装或升级": 解决方案:Microsoft SQL Server 2005→配置工具→SQL配置管理器→SQL Server 2005服务→右边的两个服务启动SQL Server FullTest Search() 和服务SQl Sever(计算机名) 二:无法将数CLSID写入\Software\Classes\PROTOCOLS\Handler\ms-help. 解决办法:退出电脑安全软件 三

随机推荐