图像的等距变换,相似变换,仿射变换,射影变换及其matlab实现
2016-12-08 23:20
543 查看
图像的等距变换,相似变换,仿射变换,射影变换及其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);
可以看出,等距变换就是对图像的旋转+平移
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);
可以看出,等距变换就是对图像的旋转+平移+缩放,这个图相对原图是变小了一些。
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);
可以看出,仿射变换就是对图像的旋转+平移+缩放+切变(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);
可以看出,射影变换就是对图像的旋转+平移+缩放+切变+射影,相比前三种变换图像的形变更为自由,原图中的平行线经过变换之后已经不在平行,而可能相交于一点,射影变换就是把理想点(平行直线在无穷远处相交)变换到图像上。
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)
函数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实现
- 仿射变换和射影变换、等距变换、相似变换
- Hough变换 直线检测原理及其Matlab实现
- 多种图像的颜色/纹理描述子及其matlab代码实现 相似性量测方法
- Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现
- MATLAB实现图像高帽和低帽变换
- 图像进行Sobel算子、Hough变换检测圆的matlab实现
- Matlab实现Hough变换检测图像中的直线 分类: 图像处理 2014-06-14 22:07 641人阅读 评论(0) 收藏
- 图像的纹理特性之灰度共生矩阵的graycomatrix函数及其matlab实现
- 图像处理PSNR及其计算(OpenCV和matlab实现)
- (实验二) --- 图像旋转变换---matlab实现
- Matlab实现Hough变换检测图像中的直线
- 图像算法之十二:非局部均值滤波及其Matlab实现
- Matlab中图像处理实例:灰度变换,空域滤波,频域滤波,傅里叶变换的实现
- MATLAB实现图像镜像变换的源代码!
- MATLAB实现图像镜像变换的源代码!
- Hough变换实现图像纠偏-从matlab到c++实现
- QT 类及其实现效果(3)--启动画面与图像变换
- (实验一) --- 彩色图像变换成灰度图像---matlab实现
- 基于HSV色彩空间变换的阴影检测算法——MATLAB实现