第二次写CSDN文档,上一篇的排版实在太烂了,于是决定认真学习一下markdown的语法。

好了,废话不多说,今天,我们学习一下图像(2维平面)到图像(2维平面)的四种变换,等距变换,相似变换,仿射变换,投影变换 首先介绍它的原理,最后介绍matlab的实现

1.数学基础

射影变换矩阵H属于射影群PL(n)中的一个,仿射群是由PL(3)中最后一行为(0,0,1)的矩阵组成的子群,包括仿射群,欧式群,其中欧式群是仿射群的子群,其左上角的矩阵是正交的,当它的行列式为1是称为定向欧式群,距离是欧式群的不变量,但不是相似群的不变量,而夹角是这两个群的不变量。

听了这么多群,不变量的数学概念,可能有点晕,下面我用最直观的语言解释。线性空间中的线性变换可以用矩阵来描述,因此我们用矩阵来刻画这四种变换。我们以数学系的经典代数入门教材北大版的《高等代数》为例,研究这些变换是如何进行的

2. 等距变换

等距变换(isometric transform),保持欧式距离不变,当图像中的点用齐次坐标表示时,变换矩阵如下所示:

⎛⎝⎜x′y′1⎞⎠⎟=⎛⎝⎜εcos(θ)εsin(θ)0−εsin(θ)−εcos(θ)0txty1⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟

当ε=1是保向的,ε=−1是逆向的,等距变换可以更简单的写成

x′=HEx=(R0t1)x

其中R是旋转矩阵。t是平移矢量,有3个自由度(1旋转角θ+两个平移tx,ty),需要2组点4个方程求解,等距变换的不变量是:长度,角度,面积。用matlab实现等距变换如下:

clear;close all;clc

I=imread('book1.jpg');

figure,imshow(I);

[w,h]=size(I);

theta=pi/4;

t=[100,100];

s=0.5;

% test Eucludian transform

H_e=projective2d([cos(theta) -sin(theta) t(1);

sin(theta) cos(theta) t(2);

0 0 1]');

newimg=imwarp(I,H_e);

figure,imshow(newimg);1

2

3

4

5

6

7

8

9

10

11

12

13

141

2

3

4

5

6

7

8

9

10

11

12

13

14

可以看出,等距变换就是对图像的旋转+平移

3. 相似变换

相似变换(similarity transform):等距变换+均匀缩放,当图像中的点用齐次坐标表示时,变换矩阵如下所示:

⎛⎝⎜x′y′1⎞⎠⎟=⎛⎝⎜scos(θ)ssin(θ)0−ssin(θ)−scos(θ)0txty1⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟

当s=1是保向的,s=−1是逆向的,相似变换可以更简单的写成

x′=HSx=(sR0t1)x

其中R是旋转矩阵。t是平移矢量,s是缩放尺度,有4个自由度(1旋转角θ+2个平移tx,ty+1个缩放尺度),需要2组点4个方程求解,相似变换的不变量是:角度,长度的比例,面积的比例。用matlab实现相似变换如下:

clear;close all;clc

I=imread('book1.jpg');

figure,imshow(I);

[w,h]=size(I);

theta=pi/4;

t=[100,100];

s=0.5;

%% test similar transform

H_s=projective2d([s*cos(theta) -s*sin(theta) t(1);

s*sin(theta) s*cos(theta) t(2);

0 0 1]');

newimg=imwarp(I,H_s);

figure,imshow(newimg);1

2

3

4

5

6

7

8

9

10

11

12

13

14

151

2

3

4

5

6

7

8

9

10

11

12

13

14

15

可以看出,等距变换就是对图像的旋转+平移+缩放,这个图相对原图是变小了一些。

4. 仿射变换

仿射变换(affine transform):非奇异变换+均匀缩放,当图像中的点用齐次坐标表示时,变换矩阵如下所示:

⎛⎝⎜x′y′1⎞⎠⎟=⎛⎝⎜a11a210a12a220txty1⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟

仿射变换可以更简单的写成

x′=HAX=(A0t1)x

其中A是仿射矩阵。t是平移矢量,s是缩放尺度,有6个自由度(4个仿射矩阵的元素+2个平移tx,ty),需要2组点4个方程求解。这里多说一句,仿射变换的A矩阵是可以做SVD分解的,即:

A=R(θ)R(−ϕ)DR(ϕ)

D=diag(λ1,λ2)仿射变换A可以看作是一个旋转ϕ+x,y方向按照比例因子λ1,λ2的缩放+回转−ϕ+旋转θ的复合变换,

仿射变换的不变量是:平行线,平行线的长度的比例,面积的比例。用matlab实现仿射变换如下:

clear;close all;clc

I=imread('book1.jpg');

figure,imshow(I);

[w,h]=size(I);

theta=pi/4;

t=[100,100];

s=0.5;

%% test affine transform

H_a=projective2d([1 0.5 t(1);

0 0.5 t(2);

0 0 1]');

newimg=imwarp(I,H_a);

figure,imshow(newimg);1

2

3

4

5

6

7

8

9

10

11

12

13

14

151

2

3

4

5

6

7

8

9

10

11

12

13

14

15

可以看出,仿射变换就是对图像的旋转+平移+缩放+切变(shear),相比前两种变换图像的形状发生了改变,但是原图中的平行线仍然保持平行。

5. 射影变换

射影变换(projection transform):当图像中的点的齐次坐标的一般非奇异线性变换。有些文献中把射影变换矩阵称为单应性矩阵变换矩阵如下所示:

⎛⎝⎜x′y′1⎞⎠⎟=⎛⎝⎜h11h21h31h12h22h32h13h231⎞⎠⎟⎛⎝⎜xy1⎞⎠⎟

仿射变换可以更简单的写成

x′=HAX=(AvTtv)x

其中A是旋转矩阵。t是平移矢量,s是缩放尺度,有8个自由度(矩阵中的8个h),需要4组点8个方程求解。同样的,射影变换的A矩阵是可以做分解的,QR分解,SVD分解都有各自不同的含义。我们常说的矩阵内外参数矩阵就是QR分解中的一种(QR分解不唯一),即把单应性矩阵分解成=内参矩阵×外参矩阵 。给定世界坐标系中的二维平面,用相机对二维平面拍照,通过对应点求拍摄照片的单应性矩阵(射影矩阵)的过程就称为相机标定,直接用代数的方法求解参数会有一定的误差,在张正友的标定方法中,讲的就是如何通过迭代使得误差最小。具体可以见我写的第一篇文章张正友相机标定法。对一般的两张照片也可以求单应性矩阵,具体的应用就是把其中的一张变换到另一张上,进一步可以做图像融合。

射影变换的不变量是:长度的交比。用matlab实现射影变换如下:

clear;close all;clc

I=imread('book1.jpg');

figure,imshow(I);

[w,h]=size(I);

theta=pi/4;

t=[100,100];

s=0.5;

%% test projective transform

H_P=projective2d([0.765,-0.122,-0.0002;

-0.174,0.916,9.050e-05;

105.018,123.780,1]);

newimg=imwarp(I,H_P);

figure,imshow(newimg);1

2

3

4

5

6

7

8

9

10

11

12

13

14

151

2

3

4

5

6

7

8

9

10

11

12

13

14

15

可以看出,射影变换就是对图像的旋转+平移+缩放+切变+射影,相比前三种变换图像的形变更为自由,原图中的平行线经过变换之后已经不在平行,而可能相交于一点,射影变换就是把理想点(平行直线在无穷远处相交)变换到图像上。

6 应用

说了这么多,下边举一个简单的小应用,就是把通过求两幅对应点的单应性矩阵(射影矩阵),把一种图片变换成另一张的形状。如图:

选择两幅图像对应的四个点

第一幅

第二幅

变换的结果

这样就成功把第二幅图片变成第一副图片的角度

下面附上代码

%% Initial

clear;

clc;

img_num=2; %the number of image

compress_scale=0.4; %define image compress scale

points_p=[0 0;1 0;2 1;2 0]; %define cordinate of 2D plain in 3D space

%% define a cell that load image

Image=cell(1,img_num);

%% read the image

Image{1,1}=imread('book1.jpg');

Image{1,2}=imread('book2.jpg');

%% image compression, transform rgb to gray, and select feature points

feature=[];

for i=1:img_num

Image{1,i}=imresize(Image{1,i},compress_scale);

I{:,:,i}=Image{1,i};

Image{1,i}=rgb2gray(Image{1,i});

imshow(Image{1,i});

hold on;

for j=1:4

[x,y]= ginput(1); %select the corner

x=round(x);

y=round(y);

plot(x,y,'ro');

feature(j,2*i-1)=x; %feature is a matrix containing corner cordination

feature(j,2*i)=y;

end

close all;

end

%% calculate homegraphy matrix for each matrix

featurep1=feature(:,1:2);

featurep2=feature(:,3:4);

h = calc_homography(featurep2, featurep1);

Im=I{:,:,2};

[a,b]=size(I);

tform=projective2d(h);

J=imwarp(Im,tform); % matlab自带的处理图像变换的函数

figure,imshow(I{:,:,1});

figure,imshow(I{:,:,2});

figure,imshow(J)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

471

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

matlab程序求一个正交的相似变换矩阵,图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现...相关推荐

  1. matlab求两点间距离,matlab如何求一个N*2的矩阵的任意两点间的距离?

    matlab如何求一个N*2的矩阵的任意两点间的距离? mip版  关注:64  答案:3  悬赏:0 解决时间 2021-02-23 20:55 已解决 2021-02-23 16:37 假设有个矩 ...

  2. 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现

    source url: http://blog.csdn.net/u014096352/article/details/53526747 图像的等距变换,相似变换,仿射变换,射影变换及其matlab实 ...

  3. matlab怎么对sinx求导,用matlab程序求y=ln(sinx 1)的导数

    哪位高手会画函数f(x,y)=(1+e^y)*cosx-y*e^y的图像啊?求真相,最好是用Matlab并附上程序! clearall;clc;%画函数f(x,y)=(1+e^y)*cosx-y*e^ ...

  4. matlab程序求尖锐度,业务名称

    有偿程序代写 QQ:122353503 霍夫曼编译码的仿真实现 任务书,开题报告,文献综述报告 电力机车主辅电路在线检测系统设计 蒙特卡罗方法 非周期信号的恢复 ,可能会用到非周期随机共振.duffi ...

  5. matlab矩阵绝对值,matlab怎么求一个矩阵所有元素的绝对值之和,看完就明白了

    有时候我们在使用matlab的时候,想求一个矩阵所有元素的绝对值之和,怎么求呢,下面来分享一下方法 工具/材料 matlab 求矩阵所有元素的绝对值之和 操作方法 01 第一步在我们的电脑上打开mat ...

  6. matlab怎么求一个三元一次方程组的解,用MATLAB求解一个带参数的三元一次方程组,求大神指点!...

    想求一个方程组,改了很多遍都还是出错,请求大神指点 . 代码如下 i=[1 2 3]; %编号为1的机械臂 r=50; %动平台半径 R=210; 想求一个方程组,改了很多遍都还是出错,请求大神指点 ...

  7. matlab 图像dct变换矩阵,图像的DCT变换的实现

    用matlab实现图像的DCT变换,在频域压缩后再反变换 I=imread('lenna.jpg'); imshow(I); title('未压缩的原图') A=im2double(I); D = d ...

  8. matlab怎么求一个三元一次方程组的解,关于一个三元一次方程的问题(matlab和excel)...

    今天碰到一个同学问我一个关于考勤的问题. 每个月他需要工作27天,需要在一天工作4个小时.10个小时.8个小时之前做选择天数,然后凑够一个月180个小时的工时. 数学上看,这就是个"三元一次 ...

  9. matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...

    在Matlab下输入:edit,然后将下面两行百分号之间的内容,复制进去,保存 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function f=f ...

最新文章

  1. 构建Java并发模型框架
  2. 软件需求工程与UML建模——第九组原型系统总结
  3. [FI] SAP 关于标准成本、计划成本、目标成本、实际成本
  4. php读取某类型文件代码,php代码实现读取文件头判断文件类型
  5. 处理tiff格式dem数据的方法——输出xyz坐标
  6. linux amd显卡调风扇转速,显卡风扇转速设置教程方法
  7. 车型代号对照表_车型与VIN代号对照表
  8. 关于编程中变量的定义
  9. 国内外优秀的设计素材网站推荐
  10. 实例分割:R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN
  11. 提高睡眠质量的牛皮凉席!
  12. Phusion Passenger
  13. 计算机网络(16)数据链路层:数据链路层的功能
  14. 更换Eclipse黑色皮肤
  15. 7-3 字符串替换 (10分)(Java,超长字符串替换创建快速输入流)
  16. IMX6Q的官方uboot移植,并且把1G的DDR3升级成2G的DDR3,修改网络驱动
  17. (赠书活动第3期)清华大学出版社618大促《IT系列丛书》
  18. 为什么要出具软件测试报告及测试场景
  19. 超级详细的阐述:大数据、云计算和人工智能的关系
  20. 售后人员管理系统应该具备哪些功能

热门文章

  1. python中reduce是什么意思,python中的map和reduce有什么不同
  2. python中webdriver_Linux上部署python+selenium+webdriver常见问题解决方案
  3. 3层、5层、3层一个卷积核BP神经网络性能比较
  4. 第4章-无人车UGV模型分析
  5. 1.13 总结-深度学习第五课《序列模型》-Stanford吴恩达教授
  6. zynq 文件系统中加载PL fpga.bit笔记
  7. C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast
  8. UOJ#449. 【集训队作业2018】喂鸽子
  9. Leetcode PHP题解--D16 922. Sort Array By Parity II
  10. kvm 网络配置之nat、用户模式