欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年07月09日 09:21:03   作者:on2way  
Matlab 擅長(zhǎng)于操作矩陣,而圖像其實(shí)就是矩陣,這篇文章主要給大家介紹了關(guān)于matlab原始處理圖像幾何變換的相關(guān)資料,需要的朋友可以參考下

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

(1)圖像的平移與比例

         圖像的平移很簡(jiǎn)單,平移前后的坐標(biāo)分別為(x,y)和(x',y'),則滿足的關(guān)系式為

              x'= x +Tx;

       y'= y +Ty;

其中Tx與Ty分別為對(duì)應(yīng)的偏移量。 

圖像的比例也很簡(jiǎn)單,可以描述為:x'=S_x * x;  y'=S_y * y;

那么上述的關(guān)系怎么用一個(gè)矩陣來(lái)表示呢?一個(gè)很重要的矩陣來(lái)了,那就是變換矩陣T,并且對(duì)于二維坐標(biāo)下的點(diǎn),一般轉(zhuǎn)化為笛卡爾坐標(biāo)系下進(jìn)行計(jì)算,用一個(gè)三維點(diǎn)表示二維的,只不過(guò)把最后一項(xiàng)值置為1,這樣一個(gè)二維坐標(biāo)(x,y)就變?yōu)?nbsp;(x,y,1)了。在把上述的平移等式關(guān)系轉(zhuǎn)化為矩陣形式為:

 

比例等式關(guān)系為:

(2)關(guān)于旋轉(zhuǎn)變換

對(duì)于某個(gè)點(diǎn),在坐標(biāo)系中的變換為(旋轉(zhuǎn)角度為θ,并且逆時(shí)針旋轉(zhuǎn)為正):

那么可以看出,這個(gè)時(shí)候?qū)?yīng)的旋轉(zhuǎn)矩陣為T就如圖上所示。

(3)關(guān)于對(duì)稱變換

對(duì)稱變換比較簡(jiǎn)單,還是以點(diǎn)的變換為例,比如變換前的點(diǎn)P(x,y)和變換后的點(diǎn)P'=(x',y'),那么對(duì)稱變換包括點(diǎn)關(guān)于x軸、y軸、原點(diǎn)、y=x、y=-x等等,點(diǎn)的變換可以自己推導(dǎo)下,這樣也就可以得到對(duì)應(yīng)的變換矩陣T了。

比如,關(guān)于x對(duì)稱的話,T=[1,0,0;0,-1,0;0,0,1],關(guān)于原點(diǎn)對(duì)稱的話,T=[-1,0,0;0,-1,0;0,0,1];關(guān)于y=x對(duì)稱的話,T=[0,1,0;1,0,0;0,0,1];等等。

(4)復(fù)合變換

下面再重點(diǎn)介紹下復(fù)合變換,因?yàn)橛械淖儞Q不是簡(jiǎn)單的初等變換,但是有一點(diǎn)需要明確的是任何復(fù)合變換都可以用初等變換一步步變換而來(lái)。比如前面的旋轉(zhuǎn)變換,旋轉(zhuǎn)點(diǎn)選取的是原點(diǎn),這樣才有的那個(gè)公式,那要是旋轉(zhuǎn)點(diǎn)不是原點(diǎn)怎么辦?比如任一點(diǎn)s(X_f,Y_f),那么點(diǎn)P繞著點(diǎn)s旋轉(zhuǎn)一定的角度θ該怎么表示呢?這里就要把這個(gè)復(fù)合變換化成為3個(gè)簡(jiǎn)單的初等變換,具體步驟為:首先把s點(diǎn)平移操作至原點(diǎn)(這個(gè)過(guò)程中,相當(dāng)于所有的點(diǎn)都按照一定的方向平移了),然后相當(dāng)于在原點(diǎn)對(duì)平移后的P點(diǎn)進(jìn)行旋轉(zhuǎn)變換,變換完后再把這個(gè)店反平移回去,這樣是不是就相當(dāng)于完成了那個(gè)復(fù)合變換。此時(shí)的變換矩陣為T,則T可以看出是兩次平移矩陣T1、T2和一次旋轉(zhuǎn)矩陣T3相乘的組合,即T=T1*T3*T2,注意方向不能反,因?yàn)槭蔷仃囅喑?,反的話相乘的結(jié)果不一定相同。

那么這個(gè)時(shí)候總的變換矩陣T就是:

這個(gè)在編程實(shí)現(xiàn)原點(diǎn)移動(dòng)位置時(shí)至關(guān)重要。

幾何變換的基礎(chǔ)知識(shí)就說(shuō)到這,具體的可以再找相關(guān)文章了解。

(二)matlab編程實(shí)現(xiàn)變換

(1)對(duì)圖像的理解

        Matlab表示一副圖像的方法很簡(jiǎn)單,對(duì)于灰度圖像來(lái)說(shuō),就是一個(gè)二維矩陣,行與列存的就是像素點(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ù)說(shuō)明----------------
%    比例變換
%       輸入變量: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];   %對(duì)應(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;     %沒(méi)有的點(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)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/on2way/article/details/40460675

這樣運(yùn)行對(duì)應(yīng)程序:

bili(image,2,2):

bili(image,0.5,0.5):

可以看到,分別對(duì)圖像擴(kuò)大和縮小的時(shí)候,都是以行和列為1為原點(diǎn)來(lái)操作的。如果還是以這個(gè)點(diǎn)來(lái)進(jìn)行旋轉(zhuǎn)操作的話,就會(huì)非常不協(xié)調(diào)不好看。況且如果了解matlab本身自帶這些旋轉(zhuǎn)、比例操作函數(shù)的話會(huì)發(fā)現(xiàn),這些函數(shù)操作原點(diǎn)是圖像的正中心,這樣操作起來(lái)后才很好看。那么現(xiàn)在的問(wèn)題就是如何把圖像的中心作為我們?cè)谧鴺?biāo)系下認(rèn)為的原點(diǎn)呢?那就是上面講到的三步走了,首先平移中心點(diǎn)至原點(diǎn),再變換,再平移至中心點(diǎn)就好了。我們需要做的就是確定平移的行與列的長(zhǎng)度(平移的長(zhǎng)度應(yīng)該是圖像行與列總長(zhǎ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];   %對(duì)應(yīng)的比例系數(shù)矩陣
T = T2*T1*T3;     %P_new = P_old*T2*T1*T3  順序不能錯(cuò)了
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;     %沒(méi)有的點(diǎn)賦值為0
        end
    end
end
% figure;imshow(img,[]);
figure;imshow(new_matrix,[]);

從程序可以看出,只是多了那么兩個(gè)矩陣而已就可以實(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)對(duì)稱變換

   對(duì)稱變換和上述變換差不多,無(wú)非修改相應(yīng)的變換矩陣,程序如下:

%-------------函數(shù)說(shuō)明----------------
%    對(duì)稱變換
%       輸入變量:img 灰白圖像(彩色不行)
%                num 對(duì)稱類型
%     0:原點(diǎn)對(duì)稱,1:x軸對(duì)稱,2:y軸對(duì)稱
%     3:y=x軸對(duì)稱 4:y=-x軸對(duì)稱  其他。。
%-------------------------------------
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軸對(duì)稱矩陣
T_y = [-1,0,0;0,1,0;0,0,1];     %y軸對(duì)稱矩陣
T_o = [-1,0,0;0,-1,0;0,0,1];    %原點(diǎn)對(duì)稱矩陣
T_yx = [0,1,0;1,0,0;0,0,1];     %y=x對(duì)稱的矩陣
T_xy = [0,-1,0;-1,0,0;0,0,1];   %y=-x對(duì)稱的矩陣
switch num                     %選擇某一種對(duì)稱方式
    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                  %對(duì)于每一個(gè)像素點(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;     %沒(méi)有的點(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ù)說(shuō)明----------------
%    旋轉(zhuǎn)變換
%       輸入變量:img 灰白圖像(彩色不行)
%                theat 變化的角度,逆時(shí)針旋轉(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  順序不能錯(cuò)了
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;     %沒(méi)有的點(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ā)揮了。

有一個(gè)問(wèn)題是上述的變換在旋轉(zhuǎn)的時(shí)候,原圖的部分圖像會(huì)被切割掉,這個(gè)是沒(méi)有考慮到的,因?yàn)椴糠窒袼攸c(diǎn)在變換以后必然超出范圍,對(duì)比matlab自帶的旋轉(zhuǎn)函數(shù)可以發(fā)現(xiàn)自帶的函數(shù)是可以對(duì)出界的部分進(jìn)行壓縮到范圍內(nèi)。當(dāng)然這一點(diǎn)我們也可以編程處理,不過(guò)稍微要麻煩點(diǎn),必須對(duì)每個(gè)像素點(diǎn)再進(jìn)行壓縮處理,這個(gè)有待研究。

二維圖像的幾何變換大致如此了。那么引申一下,對(duì)于三維圖像的幾何變換怎么處理了?其實(shí)歸結(jié)到底還是有一個(gè)變換矩陣T,而這個(gè)矩陣不再是3*3的了,這個(gè)時(shí)候增加了一維,那么對(duì)應(yīng)的矩陣也得增加一維變成4*4的了,維數(shù)的增加必然帶來(lái)處理上的更加復(fù)雜了,不過(guò)理解了二維變換的原理,再來(lái)處理三維的話還是很好處理的,弄清楚對(duì)應(yīng)關(guān)系就可以了。

總結(jié)

到此這篇關(guān)于matlab原始處理圖像幾何變換的文章就介紹到這了,更多相關(guān)matlab原始處理圖像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python版本五子棋的實(shí)現(xiàn)代碼

    python版本五子棋的實(shí)現(xiàn)代碼

    五子棋是常見(jiàn)的一款小游戲,五子棋問(wèn)題是人工智能中的一個(gè)經(jīng)典問(wèn)題。這篇文章主要介紹了python版本五子棋的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • python 刪除列表里所有空格項(xiàng)的方法總結(jié)

    python 刪除列表里所有空格項(xiàng)的方法總結(jié)

    下面小編就為大家分享一篇python 刪除列表里所有空格項(xiàng)的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python列表list常用內(nèi)建函數(shù)實(shí)例小結(jié)

    Python列表list常用內(nèi)建函數(shù)實(shí)例小結(jié)

    這篇文章主要介紹了Python列表list常用內(nèi)建函數(shù),結(jié)合實(shí)例形式總結(jié)分析了Python列表list常見(jiàn)內(nèi)建函數(shù)的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-10-10
  • 基于Python制作打地鼠小游戲

    基于Python制作打地鼠小游戲

    這篇文章主要為大家介紹了如何利用Python實(shí)現(xiàn)打地鼠小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • python中os.environ基本介紹及使用方法

    python中os.environ基本介紹及使用方法

    os.environ是Python中的一個(gè)字典對(duì)象,它包含了當(dāng)前進(jìn)程的環(huán)境變量,通過(guò)使用os.environ,可以獲取和設(shè)置環(huán)境變量的值,這篇文章主要介紹了python中os.environ基本介紹及使用方法,需要的朋友可以參考下
    2023-08-08
  • Python中OTSU算法的原理與實(shí)現(xiàn)詳解

    Python中OTSU算法的原理與實(shí)現(xiàn)詳解

    OTSU算法是大津展之提出的閾值分割方法,又叫最大類間方差法,本文主要為大家詳細(xì)介紹了OTSU算法的原理與Python實(shí)現(xiàn),感興趣的小伙伴可以了解下
    2023-12-12
  • python中單下劃線與雙下劃線的區(qū)別及說(shuō)明

    python中單下劃線與雙下劃線的區(qū)別及說(shuō)明

    這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • django 2.0更新的10條注意事項(xiàng)總結(jié)

    django 2.0更新的10條注意事項(xiàng)總結(jié)

    Django 是 Python Web 開(kāi)發(fā)最常用的框架之一,跟進(jìn)它的最新變化絕對(duì)是必須的。下面這篇文章主要給大家介紹了關(guān)于django 2.0更新的10條注意事項(xiàng),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2018-01-01
  • python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解

    python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解

    這篇文章主要介紹了python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解,有正在學(xué)習(xí)python的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)下水仙花數(shù)怎么用python計(jì)算吧
    2021-03-03
  • Pyinstaller打包Scrapy項(xiàng)目的實(shí)現(xiàn)步驟

    Pyinstaller打包Scrapy項(xiàng)目的實(shí)現(xiàn)步驟

    這篇文章主要介紹了Pyinstaller打包Scrapy項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評(píng)論