图文详解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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
python正则表达式re模块详细介绍
May 29 Python
Python验证企业工商注册码
Oct 25 Python
python实现写数字文件名的递增保存文件方法
Oct 25 Python
Python笔记之观察者模式
Nov 20 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
python实现微信打飞机游戏
Mar 24 Python
详解基于Jupyter notebooks采用sklearn库实现多元回归方程编程
Mar 25 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
python从PDF中提取数据的示例
Oct 30 Python
pytorch实现线性回归以及多元回归
Apr 11 Python
python中print格式化输出的问题
Apr 16 Python
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
You might like
色色整理的PHP面试题集锦
2012/03/08 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
Zend Framework教程之模型Model用法简单实例
2016/03/04 PHP
javascript下IE与FF兼容函数收集
2008/09/17 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
2013/12/16 Javascript
JS 数字转换研究总结
2013/12/26 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
基于Vue过渡状态实例讲解
2017/09/14 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
wxpython 学习笔记 第一天
2009/02/09 Python
带你了解python装饰器
2017/06/15 Python
python tkinter控件布局项目实例
2019/11/04 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
八年级历史教学反思
2014/01/10 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
天坛导游词
2015/02/02 职场文书
酒店辞职信怎么写
2015/02/27 职场文书
村官个人总结范文
2015/03/03 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
创业计划书详解
2019/07/19 职场文书
SQLServer2019 数据库的基本使用之图形化界面操作的实现
2021/04/08 SQL Server
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers