圖文詳解matlab原始處理圖像幾何變換
(一)圖像幾何變換理論知識(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 刪除列表里所有空格項(xiàng)的方法總結(jié)
下面小編就為大家分享一篇python 刪除列表里所有空格項(xiàng)的方法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python列表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-10Python中OTSU算法的原理與實(shí)現(xiàn)詳解
OTSU算法是大津展之提出的閾值分割方法,又叫最大類間方差法,本文主要為大家詳細(xì)介紹了OTSU算法的原理與Python實(shí)現(xiàn),感興趣的小伙伴可以了解下2023-12-12python中單下劃線與雙下劃線的區(qū)別及說(shuō)明
這篇文章主要介紹了python中單下劃線與雙下劃線的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09django 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-01python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解
這篇文章主要介紹了python實(shí)現(xiàn)水仙花數(shù)實(shí)例講解,有正在學(xué)習(xí)python的同學(xué)可以跟著小編一起來(lái)學(xué)習(xí)下水仙花數(shù)怎么用python計(jì)算吧2021-03-03Pyinstaller打包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