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

(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的点作为原点的话,变换的程序为:

  1. %-------------函数说明----------------
  2. %    比例变换
  3. %       输入变量:img 灰白图像(彩色不行)
  4. %                s_x  x方向上的比例系数
  5. %                s_y  y方向上的比例系数
  6. %-------------------------------------
  7. function bili(img,s_x,s_y)
  8. [m,n] = size(img);
  9. new_matrix = ones(m,n);
  10. T1 = [s_x,0,0;0,s_y,0;0,0,1];   %对应的比例系数矩阵
  11. for i=1:m
  12. for j=1:n
  13. p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
  14. if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
  15. new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
  16. else
  17. new_matrix(i,j) = 0;     %没有的点赋值为0
  18. end
  19. end
  20. end
  21. figure;imshow(new_matrix,[]);

这样运行对应程序:

bili(image,2,2):

bili(image,0.5,0.5):

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

  1. function bili(img,s_x,s_y)
  2. [m,n] = size(img);
  3. new_matrix = ones(m,n);
  4. T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
  5. T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移
  6. T1 = [s_x,0,0;0,s_y,0;0,0,1];   %对应的比例系数矩阵
  7. T = T2*T1*T3;     %P_new = P_old*T2*T1*T3  顺序不能错了
  8. for i=1:m
  9. for j=1:n
  10. p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
  11. if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
  12. new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
  13. else
  14. new_matrix(i,j) = 0;     %没有的点赋值为0
  15. end
  16. end
  17. end
  18. % figure;imshow(img,[]);
  19. figure;imshow(new_matrix,[]);

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

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

bili(image,0.5,0.5):

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

(3)对称变换

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

  1. %-------------函数说明----------------
  2. %    对称变换
  3. %       输入变量:img 灰白图像(彩色不行)
  4. %                num 对称类型
  5. %     0:原点对称,1:x轴对称,2:y轴对称
  6. %     3:y=x轴对称 4:y=-x轴对称  其他。。
  7. %-------------------------------------
  8. function duichen(img,num)
  9. [m,n] = size(img);
  10. new_matrix = ones(m,n);
  11. T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
  12. T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移
  13. T_x = [1,0,0;0,-1,0;0,0,1];     %x轴对称矩阵
  14. T_y = [-1,0,0;0,1,0;0,0,1];     %y轴对称矩阵
  15. T_o = [-1,0,0;0,-1,0;0,0,1];    %原点对称矩阵
  16. T_yx = [0,1,0;1,0,0;0,0,1];     %y=x对称的矩阵
  17. T_xy = [0,-1,0;-1,0,0;0,0,1];   %y=-x对称的矩阵
  18. switch num                     %选择某一种对称方式
  19. case 0
  20. T = T2*T_o*T3 ;
  21. case 1
  22. T = T2*T_x*T3 ;
  23. case 2
  24. T = T2*T_y*T3 ;
  25. case 3
  26. T = T2*T_yx*T3 ;
  27. case 4
  28. T = T2*T_xy*T3 ;
  29. end
  30. for i=1:m                  %对于每一个像素点
  31. for j=1:n
  32. p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
  33. if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
  34. new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
  35. else
  36. new_matrix(i,j) = 0;     %没有的点赋值为0
  37. end
  38. end
  39. end
  40. % figure;imshow(img,[]);
  41. figure;imshow(new_matrix,[]);

运行相应程序:

>> duichen(image,0)

>> duichen(image,2)

(4)旋转变换

  1. %-------------函数说明----------------
  2. %    旋转变换
  3. %       输入变量:img 灰白图像(彩色不行)
  4. %                theat 变化的角度,逆时针旋转为正
  5. %---------------------------------------
  6. function xuanzhuan(img,theat)
  7. [m,n] = size(img);
  8. new_matrix = ones(m,n);
  9. T2 = [1,0,0;0,1,0;-m/2,-n/2,1];  %x、y轴平移值原点
  10. T3 = [1,0,0;0,1,0;m/2,n/2,1];    %x、y轴反平移
  11. T1 = [cos(theat),sin(theat),0;-sin(theat),cos(theat),0;0,0,1];%旋转变换
  12. T = T2*T1*T3;                  %P_new = P_old*T2*T1*T3  顺序不能错了
  13. for i=1:m
  14. for j=1:n
  15. p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
  16. if (p(1)<=m)&&(p(1)>0)&&(p(2)<=n)&&(p(2)>0) %限制范围
  17. new_matrix(i,j) = img(p(1),p(2));   %坐标变换关系
  18. else
  19. new_matrix(i,j) = 0;     %没有的点赋值为0
  20. end
  21. end
  22. end
  23. % figure;imshow(img,[]);
  24. figure;imshow(new_matrix,[]);

运行相应程序:

>> xuanzhuan(image,pi/4)

>> xuanzhuan(image,-pi/3)

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

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

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

matlab之原始处理图像几何变换的更多相关文章

  1. C#数字图像处理算法学习笔记(三)--图像几何变换

    C#数字图像处理算法学习笔记(三)--图像几何变换 几何图像处理包括 图像的平移变换,镜像变换,旋转变换,伸缩变换,在这里仅以水平镜像为例,通过代码来理解其基本操作方式: 翻转前:

  2. 图像几何变换之平移(Matlab)

    G=imread('aini555.jpg'); A=rgb2gray(G); se=translate(strel(),[,]); B=imdilate(A,se); figure; subplot ...

  3. Numpy和OpenCV中的图像几何变换

    介绍 上面的图像使它不言而喻什么是几何变换.它是一种应用广泛的图像处理技术.例如,在计算机图形学中有一个简单的用例,用于在较小或较大的屏幕上显示图形内容时简单地重新缩放图形内容. 它也可以应用于扭曲一 ...

  4. matlab练习程序(图像球面化)

    十一没什么事干,接着看图像算法. 这个球面化算法最初是在ps上的球面化滤镜中看到的,感觉挺有意思,就研究了一下. 算法的详细推导可以在这篇博客中找到,我比较懒,只在纸上推了一遍,就不在博客上编辑了. ...

  5. [opencv] 图像几何变换:旋转,缩放,斜切

    几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动. 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几个像素之间,即不一定 ...

  6. matlab各类数据l图像之间的转化

    matlab各类数据图像之间的转化 rgb类型转化为二值的步骤例如以下: 1.採用命令im2double将rgb类型转化三维的double >> str='E:\programing\Ei ...

  7. matlab学习笔记,图像分块

    clc; clear all; close all; I = imread('E:\matlab\files-images\tomsen512.jpg'); rs = size(I, 1);% 行数c ...

  8. OpenCV2:第六章 图像几何变换

    一.简介 图像的几何变换有距离变换 坐标映射 平移  镜像 旋转  缩放  仿射变换等 二.重映射 把一张图像重新排列像素,比如倒置 CV_EXPORTS_W void remap( InputArr ...

  9. MATLAB解析PFM格式图像

    http://www.p-chao.com/ja/2016-09-27/matlab%E8%A7%A3%E6%9E%90pfm%E6%A0%BC%E5%BC%8F%E5%9B%BE%E5%83%8F/ ...

随机推荐

  1. [学习笔记] $Maximum$ $Minimum$ $identity$

    \(Maximum\) \(Minimum\) \(identity\)学习笔记 比较好玩的一个科技.具体来说就是\(max(a,b)=a+b-min(a,b)\),这个式子是比较显然的,但是这个可以 ...

  2. NX二次开发-创建功能区工具栏UF_UI_create_ribbon

    NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...

  3. flutter 死亡红屏 隐藏

    当组件报错的时候会出现红屏现象,解决办法是覆盖原有的ErrorWidget 用一个空白的组件去替换它 1.main.dart中进行修改 新增覆盖代码: void setCustomErrorPage( ...

  4. docker 使用网络以及容器互联

    [root@docker01 /]# docker run -d -p : --name web training/webapp ####小p ,容器的5000端口随机映射到宿主机的9999端口 se ...

  5. Python3批量修改指定目录下面的图片/文件名

    需求: 从网上下载的N张.png图片保存到image目录中,将下载下来的图片全部重命名test1.png/test2.png... 实现代码: 目录结构: config-->setting.py ...

  6. vue使用axios提交formdata格式的数据

    参考: https://www.cnblogs.com/qwert1/p/8909455.html https://blog.csdn.net/qq_42984640/article/details/ ...

  7. pdfkit

    官方文档 0.准备 需要引入两个包,首先要npm install pdfkit安装pdfkit包 const PDF = require('pdfkit'); const fs = require(' ...

  8. Dom关于位置和尺寸的api

    parentNode    直接父级//和offsetParent不同 inner2.parentNode <!DOCTYPE html> <html id="html&q ...

  9. 微服务配置中心实战:Spring + MyBatis + Druid + Nacos

    在结合场景谈服务发现和配置中我们讲述了 Nacos 配置中心的三个典型的应用场景,包括如何在 Spring Boot 中使用 Nacos 配置中心将数据库连接信息管控起来,而在“原生”的 Spring ...

  10. day31 类的组合及继承,文件目录规范

    Python之路,Day18 = Python基础18-面向对象继承与组合 类的继承 def talk(): print("I am come from talk..a") cla ...