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


Posted in Python onJuly 09, 2021
目录
  • (一)图像几何变换理论知识
    • (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)了。在把上述的平移等式关系转化为矩阵形式为:

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

比例等式关系为:

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

 

(2)关于旋转变换

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

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

那么可以看出,这个时候对应的旋转矩阵为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原始处理图像几何变换

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

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

 

(二)matlab编程实现变换

 

(1)对图像的理解

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

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

 

(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):

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

bili(image,0.5,0.5):

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

可以看到,分别对图像扩大和缩小的时候,都是以行和列为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):

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

bili(image,0.5,0.5):

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

可以看出,这样操作以后是不是协调多了,基本上和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)

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

>> duichen(image,2)

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

(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)

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

>> xuanzhuan(image,-pi/3)

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

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

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

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

 

总结

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

Python 相关文章推荐
python解析xml文件操作实例
Oct 05 Python
进一步了解Python中的XML 工具
Apr 13 Python
Python中字典的基本知识初步介绍
May 21 Python
Python变量和数据类型详解
Feb 15 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
使用Python写一个小游戏
Apr 02 Python
浅谈Python traceback的优雅处理
Aug 31 Python
Python中的asyncio代码详解
Jun 10 Python
Flask-WTF表单的使用方法
Jul 12 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
Python中生成ndarray实例讲解
Feb 22 Python
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
You might like
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
php常量详细解析
2015/10/27 PHP
[原创]PHP global全局变量经典应用与注意事项分析【附$GLOBALS用法对比】
2019/07/12 PHP
jquery $(document).ready() 与window.onload的区别
2009/12/28 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
Vue自定义图片懒加载指令v-lazyload详解
2020/12/31 Javascript
详解如何使用webpack打包Vue工程
2017/05/27 Javascript
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python2.x和3.x下maketrans与translate函数使用上的不同
2015/04/13 Python
json跨域调用python的方法详解
2017/01/11 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
使用tensorflow实现AlexNet
2017/11/20 Python
有趣的python小程序分享
2017/12/05 Python
python实现在图片上画特定大小角度矩形框
2018/10/24 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
绢花、人造花和人造花卉:BLOOM
2019/08/07 全球购物
关爱女孩行动实施方案
2014/03/13 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
2015试用期转正工作总结
2014/12/12 职场文书
校长一岗双责责任书
2015/05/09 职场文书
2016春季幼儿园小班开学寄语
2015/12/03 职场文书
初三数学教学反思
2016/02/17 职场文书