主頁 > 知識庫 > 圖文詳解matlab原始處理圖像幾何變換

圖文詳解matlab原始處理圖像幾何變換

熱門標(biāo)簽:預(yù)覽式外呼系統(tǒng) 銀川電話機(jī)器人電話 煙臺電話外呼營銷系統(tǒng) 上海正規(guī)的外呼系統(tǒng)最新報價 外賣地址有什么地圖標(biāo)注 電銷機(jī)器人錄音要學(xué)習(xí)什么 企業(yè)彩鈴地圖標(biāo)注 長春極信防封電銷卡批發(fā) 如何地圖標(biāo)注公司

(一)圖像幾何變換理論知識

(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提取圖片曲線

標(biāo)簽:盤錦 湖北 上饒 宜昌 潮州 西寧 珠海 佳木斯

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《圖文詳解matlab原始處理圖像幾何變換》,本文關(guān)鍵詞  圖文,詳解,matlab,原始,處理,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《圖文詳解matlab原始處理圖像幾何變換》相關(guān)的同類信息!
  • 本頁收集關(guān)于圖文詳解matlab原始處理圖像幾何變換的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章