source url: http://blog.csdn.net/u014096352/article/details/53526747

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

  第二次写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
  • 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
  • 15


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

4. 仿射变换

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

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

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

x′=HAX=(A0t1)x

其中 A是仿射矩阵。 t是平移矢量, s是缩放尺度,有6个自由度(4个仿射矩阵的元素+2个平移 tx,ty),需要3组点6个方程求解。这里多说一句,仿射变换的 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
  • 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
  • 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 imageImage=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_numImage{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 cornerx=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;endclose 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
  • 47

函数calc_homegraphy的代码如下:

function T = calc_homography(points1, points2)xaxb = points2(:,1) .* points1(:,1);xayb = points2(:,1) .* points1(:,2);yaxb = points2(:,2) .* points1(:,1);yayb = points2(:,2) .* points1(:,2);A = zeros(size(points1, 1)*2, 9);A(1:2:end,3) = 1;A(2:2:end,6) = 1;A(1:2:end,1:2) = points1;A(2:2:end,4:5) = points1;A(1:2:end,7) = -xaxb;A(1:2:end,8) = -xayb;A(2:2:end,7) = -yaxb;A(2:2:end,8) = -yayb;A(1:2:end,9) = -points2(:,1);A(2:2:end,9) = -points2(:,2);[~,~,V] = svd(A);h = V(:,9) ./ V(9,9);T= reshape(h,3,3);
end

图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现相关推荐

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

    第二次写CSDN文档,上一篇的排版实在太烂了,于是决定认真学习一下markdown的语法. 好了,废话不多说,今天,我们学习一下图像(2维平面)到图像(2维平面)的四种变换,等距变换,相似变换,仿射变 ...

  2. 图像坐标空间变换:透视变换(Perspective Transformation),或称为单应性(Homography)变换

    文章目录 透视变换简介 预备知识 透视变换公式推导 投影 二维坐标向齐次坐标的变换 公式求解 例子:A4纸视角校正 原始图片和坐标变换模板 计算程序 结果 透视变换的限制 前向映射与后向映射矩阵不互逆 ...

  3. 多视图几何总结——等距变换、相似变换、仿射变换和射影变换

    多视图几何总结--等距变换.相似变换.仿射变换和射影变换 多视图几何总结--等距变换.相似变换.仿射变换和射影变换 等距变换 相似变化 仿射变换 射影变换 总结 多视图几何总结--等距变换.相似变换. ...

  4. 图像变换:刚性变换(等距变换、欧式变换)、相似变换、仿射变换、射影变换(透视变换、投影变换)

    刚性变换(等距变换.欧式变换).相似变换.仿射变换.射影变换(透视变换.投影变换) 1.刚性变换:只对物体进行 平移 和 旋转,而形状不变 2.相似变换:等距变换 + 均匀缩放,类似相似三角形,比例不 ...

  5. transform.SimilarityTransform()==>图像的相似变换=等距变换(平移+旋转变换)+均匀尺度缩放

    SimilarityTransform(图像变换的一种:相似变换) 相似变换:等距变换+均匀尺度缩放,所谓等距变换就是平移+旋转变换. 变换矩阵:变换效应:角度.平行性和垂直性不发生变换. 用法 输入 ...

  6. 【数字图像处理】-- 弄懂等距变换(刚性变换)、相似变换、仿射变换、透视变换(投影变换)

    目录 概述(Introduction) 等距变换(Euclidean Transformation) 平移变换(Translation Transformation) 旋转变换(Rotation Tr ...

  7. 单应性变换与仿射变换

    经典的仿射变换 初始来自于 ABB实习的项目:目前看有关于多帧去噪论文 Burst Image Deblurring,发现论文作者使用单应性变换进行多帧图片之间的粗对齐. 1.详细的总结性文章 知乎专 ...

  8. 【OpenCV 例程200篇】33. 图像的复合变换

    [OpenCV 例程200篇]33. 图像的复合变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像的复合变换是 ...

  9. 第二章 图像基本运算及变换

    文章目录 前言 一.图像运算 1. 加减乘除 2. 位运算 二.翻转与旋转 1.翻转 2.旋转 三.仿射变换 1. 介绍 2. 变换的数学表达 2.1 平移 2.2 缩放 2.3 旋转 3. 变换矩阵 ...

最新文章

  1. Masonry自动布局详解一:基本用法
  2. counterfactual
  3. TMS320F28335的SCI通信-FIFO中断通信实验
  4. [转帖]H.264 RTP payload 格式(有效载荷)
  5. export Oracle_sid =asm,单实例下oracle数据库从文件系统迁移到ASM上
  6. 关于Jquery中animate可以操作css样式属性总结
  7. DOTNET零碎要点---字符串截取操作
  8. SQL PASS西雅图之行——会议篇
  9. wpf之访问当前程序下的图片
  10. react native 使用TabNavigator编写APP底部导航
  11. 学c语言和51单片机的作业,《手把手教你学51单片机(C语言版)》例程和源码
  12. 古体字与简体字对照表_简体字繁体字对照表?
  13. 面试常见的逻辑推理题
  14. 特斯拉公布马斯克去年薪酬状况:工资5.6万美元 期权激励超过22亿美元
  15. UVM-sequence和sequencer
  16. 必应壁纸爬取 def
  17. sam账号服务器已断开连接,删了sam文件后引发的IIS问题的解决方法
  18. 华为硬件工程师手册_华为,英飞凌,中兴硬件工程师面试题
  19. stanfordcorenlp识别中文人名实战记录及心得
  20. 计算汉字笔画数的脚本

热门文章

  1. html 可脱机浏览,如何脱机浏览Web页面
  2. Apache基于域名、端口、IP的虚拟主机配置(Centos 6.5)
  3. 安卓ExpandableListView实现多组列表,类似于QQ分组
  4. Pytorch中Parameter的打印和修改
  5. move_base导航框架中recovery_behaviors
  6. 在linux环境中安装jieba模块
  7. Modbus通讯协议(一)——测试工具ModbusPoll和ModbusSlave
  8. 小旋风asp iis_ASP 4-绕.NET 4(和Visual Studio 2010)Beta 1的旋风之旅
  9. 如何在线编辑Office文档
  10. 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?