matlab程序求一个正交的相似变换矩阵,图像的等距变换,相似变换,仿射变换,射影变换及其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
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实现...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cumsum在matlab中,matla
- 下一篇: roomno9汉化版攻略(room no