图文详解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 中文乱码问题深入分析
Mar 13 Python
Python下使用Psyco模块优化运行速度
Apr 05 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
解决pandas展示数据输出时列名不能对齐的问题
Nov 18 Python
python装饰器代替set get方法实例
Dec 19 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
Python基于requests实现模拟上传文件
Apr 21 Python
PyTorch 导数应用的使用教程
Aug 31 Python
Django中session进行权限管理的使用
python利用pandas分析学生期末成绩实例代码
使用pandas生成/读取csv文件的方法实例
python自动化八大定位元素讲解
python实现简单聊天功能
Python re.sub 反向引用的实现
Jul 07 #Python
Python制作一个随机抽奖小工具的实现
You might like
用PHP和ACCESS写聊天室(六)
2006/10/09 PHP
PHP在线生成二维码代码(google api)
2013/06/03 PHP
php实现图片缩略图的方法
2016/03/29 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
jquery 图片截取工具jquery.imagecropper.js
2010/04/09 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
2013/07/31 Javascript
兼容ie、firefox的图片自动缩放的css跟js代码分享
2013/08/12 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
js报$ is not a function 的问题的解决方法
2014/01/20 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
第四篇Bootstrap网格系统偏移列和嵌套列
2016/06/21 Javascript
详解js数组的完全随机排列算法
2016/12/16 Javascript
jQuery UI仿淘宝搜索下拉列表功能
2017/01/10 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
JavaScript实现换肤功能
2017/09/15 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
Node.js动手撸一个静态资源服务器的方法
2019/03/09 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
JS前端广告拦截实现原理解析
2020/02/17 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
python常用知识梳理(必看篇)
2017/03/23 Python
Python cookbook(数据结构与算法)同时对数据做转换和换算处理操作示例
2018/03/23 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python 处理微信对账单数据的实例代码
2019/07/19 Python
pandas apply多线程实现代码
2020/08/17 Python
css3圆角样式分享自定义按钮样式
2013/12/27 HTML / CSS
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
程序员求职信
2014/04/16 职场文书
社区助残日活动总结
2014/08/29 职场文书
致我们终将逝去的青春观后感
2015/06/10 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书