图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
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),保持欧式距离不变,当图像中的点用齐次坐标表示时,变换矩阵如下所示:
当 ε=1是保向的, ε=−1是逆向的,等距变换可以更简单的写成
其中 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):等距变换+均匀缩放,当图像中的点用齐次坐标表示时,变换矩阵如下所示:
当 s=1是保向的, s=−1是逆向的,相似变换可以更简单的写成
其中 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):非奇异变换+均匀缩放,当图像中的点用齐次坐标表示时,变换矩阵如下所示:
仿射变换可以更简单的写成
其中 A是仿射矩阵。 t是平移矢量, s是缩放尺度,有6个自由度(4个仿射矩阵的元素+2个平移 tx,ty),需要3组点6个方程求解。这里多说一句,仿射变换的 A矩阵是可以做SVD分解的,即:
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):当图像中的点的齐次坐标的一般非奇异线性变换。有些文献中把射影变换矩阵称为单应性矩阵变换矩阵如下所示:
仿射变换可以更简单的写成
其中 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实现相关推荐
- matlab程序求一个正交的相似变换矩阵,图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现...
第二次写CSDN文档,上一篇的排版实在太烂了,于是决定认真学习一下markdown的语法. 好了,废话不多说,今天,我们学习一下图像(2维平面)到图像(2维平面)的四种变换,等距变换,相似变换,仿射变 ...
- 图像坐标空间变换:透视变换(Perspective Transformation),或称为单应性(Homography)变换
文章目录 透视变换简介 预备知识 透视变换公式推导 投影 二维坐标向齐次坐标的变换 公式求解 例子:A4纸视角校正 原始图片和坐标变换模板 计算程序 结果 透视变换的限制 前向映射与后向映射矩阵不互逆 ...
- 多视图几何总结——等距变换、相似变换、仿射变换和射影变换
多视图几何总结--等距变换.相似变换.仿射变换和射影变换 多视图几何总结--等距变换.相似变换.仿射变换和射影变换 等距变换 相似变化 仿射变换 射影变换 总结 多视图几何总结--等距变换.相似变换. ...
- 图像变换:刚性变换(等距变换、欧式变换)、相似变换、仿射变换、射影变换(透视变换、投影变换)
刚性变换(等距变换.欧式变换).相似变换.仿射变换.射影变换(透视变换.投影变换) 1.刚性变换:只对物体进行 平移 和 旋转,而形状不变 2.相似变换:等距变换 + 均匀缩放,类似相似三角形,比例不 ...
- transform.SimilarityTransform()==>图像的相似变换=等距变换(平移+旋转变换)+均匀尺度缩放
SimilarityTransform(图像变换的一种:相似变换) 相似变换:等距变换+均匀尺度缩放,所谓等距变换就是平移+旋转变换. 变换矩阵:变换效应:角度.平行性和垂直性不发生变换. 用法 输入 ...
- 【数字图像处理】-- 弄懂等距变换(刚性变换)、相似变换、仿射变换、透视变换(投影变换)
目录 概述(Introduction) 等距变换(Euclidean Transformation) 平移变换(Translation Transformation) 旋转变换(Rotation Tr ...
- 单应性变换与仿射变换
经典的仿射变换 初始来自于 ABB实习的项目:目前看有关于多帧去噪论文 Burst Image Deblurring,发现论文作者使用单应性变换进行多帧图片之间的粗对齐. 1.详细的总结性文章 知乎专 ...
- 【OpenCV 例程200篇】33. 图像的复合变换
[OpenCV 例程200篇]33. 图像的复合变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 图像的复合变换是 ...
- 第二章 图像基本运算及变换
文章目录 前言 一.图像运算 1. 加减乘除 2. 位运算 二.翻转与旋转 1.翻转 2.旋转 三.仿射变换 1. 介绍 2. 变换的数学表达 2.1 平移 2.2 缩放 2.3 旋转 3. 变换矩阵 ...
最新文章
- Masonry自动布局详解一:基本用法
- counterfactual
- TMS320F28335的SCI通信-FIFO中断通信实验
- [转帖]H.264 RTP payload 格式(有效载荷)
- export Oracle_sid =asm,单实例下oracle数据库从文件系统迁移到ASM上
- 关于Jquery中animate可以操作css样式属性总结
- DOTNET零碎要点---字符串截取操作
- SQL PASS西雅图之行——会议篇
- wpf之访问当前程序下的图片
- react native 使用TabNavigator编写APP底部导航
- 学c语言和51单片机的作业,《手把手教你学51单片机(C语言版)》例程和源码
- 古体字与简体字对照表_简体字繁体字对照表?
- 面试常见的逻辑推理题
- 特斯拉公布马斯克去年薪酬状况:工资5.6万美元 期权激励超过22亿美元
- UVM-sequence和sequencer
- 必应壁纸爬取 def
- sam账号服务器已断开连接,删了sam文件后引发的IIS问题的解决方法
- 华为硬件工程师手册_华为,英飞凌,中兴硬件工程师面试题
- stanfordcorenlp识别中文人名实战记录及心得
- 计算汉字笔画数的脚本
热门文章
- html 可脱机浏览,如何脱机浏览Web页面
- Apache基于域名、端口、IP的虚拟主机配置(Centos 6.5)
- 安卓ExpandableListView实现多组列表,类似于QQ分组
- Pytorch中Parameter的打印和修改
- move_base导航框架中recovery_behaviors
- 在linux环境中安装jieba模块
- Modbus通讯协议(一)——测试工具ModbusPoll和ModbusSlave
- 小旋风asp iis_ASP 4-绕.NET 4(和Visual Studio 2010)Beta 1的旋风之旅
- 如何在线编辑Office文档
- 用python做一个舆情分析系统_如何用Python做舆情时间序列可视化?