目錄
- (一)圖像幾何變換理論知識
- (1)圖像的平移與比例
- (2)關(guān)于旋轉(zhuǎn)變換
- (3)關(guān)于對稱變換
- (4)復(fù)合變換
- (二)matlab編程實(shí)現(xiàn)變換
- 總結(jié)
(一)圖像幾何變換理論知識
(1)圖像的平移與比例
圖像的平移很簡單,平移前后的坐標(biāo)分別為(x,y)和(x',y'),則滿足的關(guān)系式為
x'= x +Tx;
y'= y +Ty;
其中Tx與Ty分別為對應(yīng)的偏移量。
圖像的比例也很簡單,可以描述為:x'=S_x * x; y'=S_y * y;
那么上述的關(guān)系怎么用一個矩陣來表示呢?一個很重要的矩陣來了,那就是變換矩陣T,并且對于二維坐標(biāo)下的點(diǎn),一般轉(zhuǎn)化為笛卡爾坐標(biāo)系下進(jìn)行計(jì)算,用一個三維點(diǎn)表示二維的,只不過把最后一項(xiàng)值置為1,這樣一個二維坐標(biāo)(x,y)就變?yōu)?nbsp;(x,y,1)了。在把上述的平移等式關(guān)系轉(zhuǎn)化為矩陣形式為:
比例等式關(guān)系為:
(2)關(guān)于旋轉(zhuǎn)變換
對于某個點(diǎn),在坐標(biāo)系中的變換為(旋轉(zhuǎn)角度為θ,并且逆時針旋轉(zhuǎn)為正):
那么可以看出,這個時候?qū)?yīng)的旋轉(zhuǎn)矩陣為T就如圖上所示。
(3)關(guān)于對稱變換
對稱變換比較簡單,還是以點(diǎn)的變換為例,比如變換前的點(diǎn)P(x,y)和變換后的點(diǎn)P'=(x',y'),那么對稱變換包括點(diǎn)關(guān)于x軸、y軸、原點(diǎn)、y=x、y=-x等等,點(diǎn)的變換可以自己推導(dǎo)下,這樣也就可以得到對應(yīng)的變換矩陣T了。
比如,關(guān)于x對稱的話,T=[1,0,0;0,-1,0;0,0,1],關(guān)于原點(diǎn)對稱的話,T=[-1,0,0;0,-1,0;0,0,1];關(guān)于y=x對稱的話,T=[0,1,0;1,0,0;0,0,1];等等。
(4)復(fù)合變換
下面再重點(diǎn)介紹下復(fù)合變換,因?yàn)橛械淖儞Q不是簡單的初等變換,但是有一點(diǎn)需要明確的是任何復(fù)合變換都可以用初等變換一步步變換而來。比如前面的旋轉(zhuǎn)變換,旋轉(zhuǎn)點(diǎn)選取的是原點(diǎn),這樣才有的那個公式,那要是旋轉(zhuǎn)點(diǎn)不是原點(diǎn)怎么辦?比如任一點(diǎn)s(X_f,Y_f),那么點(diǎn)P繞著點(diǎn)s旋轉(zhuǎn)一定的角度θ該怎么表示呢?這里就要把這個復(fù)合變換化成為3個簡單的初等變換,具體步驟為:首先把s點(diǎn)平移操作至原點(diǎn)(這個過程中,相當(dāng)于所有的點(diǎn)都按照一定的方向平移了),然后相當(dāng)于在原點(diǎn)對平移后的P點(diǎn)進(jìn)行旋轉(zhuǎn)變換,變換完后再把這個店反平移回去,這樣是不是就相當(dāng)于完成了那個復(fù)合變換。此時的變換矩陣為T,則T可以看出是兩次平移矩陣T1、T2和一次旋轉(zhuǎn)矩陣T3相乘的組合,即T=T1*T3*T2,注意方向不能反,因?yàn)槭蔷仃囅喑?,反的話相乘的結(jié)果不一定相同。
那么這個時候總的變換矩陣T就是:
這個在編程實(shí)現(xiàn)原點(diǎn)移動位置時至關(guān)重要。
幾何變換的基礎(chǔ)知識就說到這,具體的可以再找相關(guān)文章了解。
(二)matlab編程實(shí)現(xiàn)變換
(1)對圖像的理解
Matlab表示一副圖像的方法很簡單,對于灰度圖像來說,就是一個二維矩陣,行與列存的就是像素點(diǎn)的位置,而矩陣值就是該像素點(diǎn)的灰度值。這里以有名的一副圖lenna圖為例,那么直接image=imread(‘lenna.jpg')就可以加載帶matlab工作框中,顯示的話imshow(image)就可以了,顯示如下:
(2)比例變換
了解了變換的基本原理,要知道其中最重要的就是關(guān)于坐標(biāo)的變換。如果以上圖中的行和列都為1的點(diǎn)作為原點(diǎn)的話,變換的程序?yàn)椋?/p>
%-------------函數(shù)說明----------------
% 比例變換
% 輸入變量:img 灰白圖像(彩色不行)
% s_x x方向上的比例系數(shù)
% s_y y方向上的比例系數(shù)
%-------------------------------------
function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
T1 = [s_x,0,0;0,s_y,0;0,0,1]; %對應(yīng)的比例系數(shù)矩陣
for i=1:m
for j=1:n
p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
if (p(1)=m)(p(1)>0)(p(2)=n)(p(2)>0) %限制范圍
new_matrix(i,j) = img(p(1),p(2)); %坐標(biāo)變換關(guān)系
else
new_matrix(i,j) = 0; %沒有的點(diǎn)賦值為0
end
end
end
figure;imshow(new_matrix,[]);
————————————————
版權(quán)聲明:本文為CSDN博主「on2way」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/on2way/article/details/40460675
這樣運(yùn)行對應(yīng)程序:
bili(image,2,2):
bili(image,0.5,0.5):
可以看到,分別對圖像擴(kuò)大和縮小的時候,都是以行和列為1為原點(diǎn)來操作的。如果還是以這個點(diǎn)來進(jìn)行旋轉(zhuǎn)操作的話,就會非常不協(xié)調(diào)不好看。況且如果了解matlab本身自帶這些旋轉(zhuǎn)、比例操作函數(shù)的話會發(fā)現(xiàn),這些函數(shù)操作原點(diǎn)是圖像的正中心,這樣操作起來后才很好看。那么現(xiàn)在的問題就是如何把圖像的中心作為我們在坐標(biāo)系下認(rèn)為的原點(diǎn)呢?那就是上面講到的三步走了,首先平移中心點(diǎn)至原點(diǎn),再變換,再平移至中心點(diǎn)就好了。我們需要做的就是確定平移的行與列的長度(平移的長度應(yīng)該是圖像行與列總長度的一半吧,如果是把中心點(diǎn)當(dāng)做原點(diǎn)的話)?;诖诵薷纳鲜龅某绦蛉缦拢?/p>
function bili(img,s_x,s_y)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y軸平移值原點(diǎn)
T3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y軸反平移
T1 = [s_x,0,0;0,s_y,0;0,0,1]; %對應(yīng)的比例系數(shù)矩陣
T = T2*T1*T3; %P_new = P_old*T2*T1*T3 順序不能錯了
for i=1:m
for j=1:n
p = floor([i,j,1]*T1^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
if (p(1)=m)(p(1)>0)(p(2)=n)(p(2)>0) %限制范圍
new_matrix(i,j) = img(p(1),p(2)); %坐標(biāo)變換關(guān)系
else
new_matrix(i,j) = 0; %沒有的點(diǎn)賦值為0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
從程序可以看出,只是多了那么兩個矩陣而已就可以實(shí)現(xiàn)原點(diǎn)的轉(zhuǎn)移了。
運(yùn)行相應(yīng)程序,bili(image,2,2):
bili(image,0.5,0.5):
可以看出,這樣操作以后是不是協(xié)調(diào)多了,基本上和matlab自帶的函數(shù)有相同的功能了。
(3)對稱變換
對稱變換和上述變換差不多,無非修改相應(yīng)的變換矩陣,程序如下:
%-------------函數(shù)說明----------------
% 對稱變換
% 輸入變量:img 灰白圖像(彩色不行)
% num 對稱類型
% 0:原點(diǎn)對稱,1:x軸對稱,2:y軸對稱
% 3:y=x軸對稱 4:y=-x軸對稱 其他。。
%-------------------------------------
function duichen(img,num)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y軸平移值原點(diǎn)
T3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y軸反平移
T_x = [1,0,0;0,-1,0;0,0,1]; %x軸對稱矩陣
T_y = [-1,0,0;0,1,0;0,0,1]; %y軸對稱矩陣
T_o = [-1,0,0;0,-1,0;0,0,1]; %原點(diǎn)對稱矩陣
T_yx = [0,1,0;1,0,0;0,0,1]; %y=x對稱的矩陣
T_xy = [0,-1,0;-1,0,0;0,0,1]; %y=-x對稱的矩陣
switch num %選擇某一種對稱方式
case 0
T = T2*T_o*T3 ;
case 1
T = T2*T_x*T3 ;
case 2
T = T2*T_y*T3 ;
case 3
T = T2*T_yx*T3 ;
case 4
T = T2*T_xy*T3 ;
end
for i=1:m %對于每一個像素點(diǎn)
for j=1:n
p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
if (p(1)=m)(p(1)>0)(p(2)=n)(p(2)>0) %限制范圍
new_matrix(i,j) = img(p(1),p(2)); %坐標(biāo)變換關(guān)系
else
new_matrix(i,j) = 0; %沒有的點(diǎn)賦值為0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
————————————————
運(yùn)行相應(yīng)程序:
>> duichen(image,0)
>> duichen(image,2)
(4)旋轉(zhuǎn)變換
%-------------函數(shù)說明----------------
% 旋轉(zhuǎn)變換
% 輸入變量:img 灰白圖像(彩色不行)
% theat 變化的角度,逆時針旋轉(zhuǎn)為正
%---------------------------------------
function xuanzhuan(img,theat)
[m,n] = size(img);
new_matrix = ones(m,n);
T2 = [1,0,0;0,1,0;-m/2,-n/2,1]; %x、y軸平移值原點(diǎn)
T3 = [1,0,0;0,1,0;m/2,n/2,1]; %x、y軸反平移
T1 = [cos(theat),sin(theat),0;-sin(theat),cos(theat),0;0,0,1];%旋轉(zhuǎn)變換
T = T2*T1*T3; %P_new = P_old*T2*T1*T3 順序不能錯了
for i=1:m
for j=1:n
p = floor([i,j,1]*T^-1);%由P_new = P_old*T 可得:P_old = P_new*(T^-1)
if (p(1)=m)(p(1)>0)(p(2)=n)(p(2)>0) %限制范圍
new_matrix(i,j) = img(p(1),p(2)); %坐標(biāo)變換關(guān)系
else
new_matrix(i,j) = 0; %沒有的點(diǎn)賦值為0
end
end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);
運(yùn)行相應(yīng)程序:
>> xuanzhuan(image,pi/4)
>> xuanzhuan(image,-pi/3)
至此,一些基本的幾何變換操作就完成了,其他的變換就在次基礎(chǔ)上發(fā)揮了。
有一個問題是上述的變換在旋轉(zhuǎn)的時候,原圖的部分圖像會被切割掉,這個是沒有考慮到的,因?yàn)椴糠窒袼攸c(diǎn)在變換以后必然超出范圍,對比matlab自帶的旋轉(zhuǎn)函數(shù)可以發(fā)現(xiàn)自帶的函數(shù)是可以對出界的部分進(jìn)行壓縮到范圍內(nèi)。當(dāng)然這一點(diǎn)我們也可以編程處理,不過稍微要麻煩點(diǎn),必須對每個像素點(diǎn)再進(jìn)行壓縮處理,這個有待研究。
二維圖像的幾何變換大致如此了。那么引申一下,對于三維圖像的幾何變換怎么處理了?其實(shí)歸結(jié)到底還是有一個變換矩陣T,而這個矩陣不再是3*3的了,這個時候增加了一維,那么對應(yīng)的矩陣也得增加一維變成4*4的了,維數(shù)的增加必然帶來處理上的更加復(fù)雜了,不過理解了二維變換的原理,再來處理三維的話還是很好處理的,弄清楚對應(yīng)關(guān)系就可以了。
總結(jié)
到此這篇關(guān)于matlab原始處理圖像幾何變換的文章就介紹到這了,更多相關(guān)matlab原始處理圖像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Matlab實(shí)現(xiàn)時間序列預(yù)測分類實(shí)例代碼
- 利用Matlab繪制各類特殊圖形的實(shí)例代碼
- Matlab如何實(shí)現(xiàn)矩陣復(fù)制擴(kuò)充
- 如何利用Matlab制作一款真正的拼圖小游戲
- 利用Matlab提取圖片曲線