圖像的幾何變換_第1頁(yè)
圖像的幾何變換_第2頁(yè)
圖像的幾何變換_第3頁(yè)
圖像的幾何變換_第4頁(yè)
圖像的幾何變換_第5頁(yè)
已閱讀5頁(yè),還剩121頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

圖像的幾何變換第一頁(yè),共一百二十六頁(yè),2022年,8月28日6.1幾何變換基礎(chǔ)6.1.1概述圖像的幾何變換,是指使用戶獲得或設(shè)計(jì)的原始圖像。按照需要產(chǎn)生大小、形狀和位置的變化。從圖像類型來(lái)分,圖像的幾何變換有二維平面圖像的幾何變換和三維圖像的幾何變換以及由三維向二維平面投影變換等。從變換的性質(zhì)分,圖像的幾何變換有平移、比例縮放、旋轉(zhuǎn)、反射和錯(cuò)切等基本變換,透視變換等復(fù)合變換,以及插值運(yùn)算等。第二頁(yè),共一百二十六頁(yè),2022年,8月28日數(shù)字圖像是把連續(xù)圖像在坐標(biāo)空間和性質(zhì)空間離散化了的圖像。例如,一幅二維數(shù)字圖像就是把一幅連續(xù)的二維(2D)。圖像在坐標(biāo)空間XOY和性質(zhì)空間F都離散化了的圖像,它可以用一組二維(2D)數(shù)組f(x,y)來(lái)表示,其中x和y表示2D空間XOY中一個(gè)坐標(biāo)點(diǎn)的位置,f代表圖像在點(diǎn)(x,y)的某種性質(zhì)F的數(shù)值,如果所處理的是一幅灰度圖,這時(shí)f表示灰度值。而且此時(shí)f、x、y都在整數(shù)集合中取值。因此,除了插值運(yùn)算外,常見的圖像幾何變換可以通過與之對(duì)應(yīng)的矩陣線性變換來(lái)實(shí)現(xiàn)。第三頁(yè),共一百二十六頁(yè),2022年,8月28日對(duì)于2D圖像幾何變換及變換中心在坐標(biāo)原點(diǎn)的比例縮放、反射、錯(cuò)切和旋轉(zhuǎn)等各種變換,都可以用2×2的矩陣表示和實(shí)現(xiàn)。但是一個(gè)2×2變換矩陣 卻不能實(shí)現(xiàn)圖像的平移以及繞任意點(diǎn)的比例縮放、反射、錯(cuò)切和旋轉(zhuǎn)等各種變換。因此,為了能夠用統(tǒng)一的矩陣線性變換形式,表示和實(shí)現(xiàn)這些常見的圖像幾何變換,就需要引入一種新的坐標(biāo),即齊次坐標(biāo)。利用齊次坐標(biāo)來(lái)變換處理,才能實(shí)現(xiàn)上述各種2D圖像的幾何變換。第四頁(yè),共一百二十六頁(yè),2022年,8月28日6.1.2齊次坐標(biāo)現(xiàn)設(shè)點(diǎn)P0(x0,y0)進(jìn)行平移后,移到P(x,y),其中x方向的平移量為Δx,y方向的平移量為Δy。那么,點(diǎn)P(x,y)的坐標(biāo)為如圖6-1所示。這個(gè)變換用矩陣的形式可以表示為第五頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-1點(diǎn)的平移第六頁(yè),共一百二十六頁(yè),2022年,8月28日而平面上點(diǎn)的變換矩陣 中沒有引入平移常量,無(wú)論a、b、c、d取什么值,都不能實(shí)現(xiàn)上述的平移變換。因此,需要使用2×3階變換矩陣,取其形式為此矩陣的第一、二列構(gòu)成單位矩陣,第三列元素為平移常量。由上述可知,對(duì)2D圖像進(jìn)行變換,只需要將圖像的點(diǎn)集矩陣乘以變換矩陣即可,2D圖像對(duì)應(yīng)的點(diǎn)集矩陣是2×n階的,而上式擴(kuò)展后的變換矩陣是2×3階的矩陣,這不符合矩陣相乘時(shí)要求前者的列數(shù)與后者的行數(shù)相等的規(guī)則。第七頁(yè),共一百二十六頁(yè),2022年,8月28日所以需要在點(diǎn)的坐標(biāo)列矩陣[xy]T中引入第三個(gè)元素,增加一個(gè)附加坐標(biāo),擴(kuò)展為3×1的列矩陣[xy1]T,這樣用三維空間點(diǎn)(x,y,1)表示二維空間點(diǎn)(x,y),即采用一種特殊的坐標(biāo),可以實(shí)現(xiàn)平移變換,變換結(jié)果為式 符合上述平移后的坐標(biāo)位置。通常將2×3階矩陣擴(kuò)充為3×3階矩陣,以拓寬功能。由此可得平移變換矩陣為第八頁(yè),共一百二十六頁(yè),2022年,8月28日下面再驗(yàn)證一下點(diǎn)P(x,y)按照3×3的變換矩陣T平移變換的結(jié)果從上式可以看出,引入附加坐標(biāo)后,擴(kuò)充了矩陣的第3行,并沒有使變換結(jié)果受到影響。這種用n+1維向量表示n維向量的方法稱為齊次坐標(biāo)表示法。第九頁(yè),共一百二十六頁(yè),2022年,8月28日因此,2D圖像中的點(diǎn)坐標(biāo)(x,y)通常表示成齊次坐標(biāo)(Hx,Hy,H),其中H表示非零的任意實(shí)數(shù),當(dāng)H=1時(shí),則(x,y,1)就稱為點(diǎn)(x,y)的規(guī)范化齊次坐標(biāo)。顯然規(guī)范化齊次坐標(biāo)的前兩個(gè)數(shù)是相應(yīng)二維點(diǎn)的坐標(biāo),沒有變化,僅在原坐標(biāo)中增加了H=1的附加坐標(biāo)。由點(diǎn)的齊次坐標(biāo)(Hx,Hy,H)求點(diǎn)的規(guī)范化齊次坐標(biāo)(x,y,1),可按如下公式進(jìn)行:第十頁(yè),共一百二十六頁(yè),2022年,8月28日齊次坐標(biāo)的幾何意義相當(dāng)于點(diǎn)(x,y)落在3D空間H=1的平面上,如圖6-2所示。如果將XOY平面內(nèi)的三角形abc的各頂點(diǎn)表示成齊次坐標(biāo)(xi,yi,1)(i=1,2,3)的形式,就變成H=1平面內(nèi)的三角形a1b1c1的各頂點(diǎn)。圖6-2齊次坐標(biāo)的幾何意義第十一頁(yè),共一百二十六頁(yè),2022年,8月28日齊次坐標(biāo)在2D圖像幾何變換中的另一個(gè)應(yīng)用是:如某點(diǎn)S(60000,40000)在16位計(jì)算機(jī)上表示則大于32767的最大坐標(biāo)值,需要進(jìn)行復(fù)雜的操作。但如果把S的坐標(biāo)形式變成(Hx,Hy,H)形式的齊次坐標(biāo),則情況就不同了。在齊次坐標(biāo)系中,設(shè)H=1/2,則(60000,40000)的齊次坐標(biāo)為(1/2x,1/2y,1/2),那么所要表示的點(diǎn)變?yōu)?30000,20000,1/2),此點(diǎn)顯然在16位計(jì)算機(jī)上二進(jìn)制數(shù)所能表示的范圍之內(nèi)。因此,采用齊次坐標(biāo),并將變換矩陣改成3×3階的形式后,便可實(shí)現(xiàn)所有2D圖像幾何變換的基本變換。第十二頁(yè),共一百二十六頁(yè),2022年,8月28日6.1.3二維圖像幾何變換的矩陣?yán)谬R次坐標(biāo)及改成3×3階形式的變換矩陣,實(shí)現(xiàn)2D圖像幾何變換的基本變換的一般過程是:將2×n階的二維點(diǎn)集矩陣 表示成齊次坐標(biāo) 的形式,然后乘以相應(yīng)的變換矩陣即可完成,即變換后的點(diǎn)集矩陣=變換矩陣T×變換前的點(diǎn)集矩陣(圖像上各點(diǎn)的新齊次坐標(biāo))(圖像上各點(diǎn)的原齊次坐標(biāo))第十三頁(yè),共一百二十六頁(yè),2022年,8月28日設(shè)變換矩陣T為則上述變換可以用公式表示為第十四頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D像上各點(diǎn)的新齊次坐標(biāo)規(guī)范化后的點(diǎn)集矩陣為引入齊次坐標(biāo)后,表示2D圖像幾何變換的3×3矩陣的功能就完善了,可以用它完成2D圖像的各種幾何變換。下面討論3×3階變換矩陣中各元素在變換中的功能。幾何變換的3×3矩陣的一般形式為第十五頁(yè),共一百二十六頁(yè),2022年,8月28日3×3的階矩陣T可以分成四個(gè)子矩陣。其中,這一子矩陣可使圖像實(shí)現(xiàn)恒等、比例、反射(或鏡像)、錯(cuò)切和旋轉(zhuǎn)變換。[lm]這一行矩陣可以使圖像實(shí)現(xiàn)平移變換。[p

q]T這一列矩陣可以使圖像實(shí)現(xiàn)透視變換,但當(dāng)p=0,q=0時(shí)它無(wú)透視作用。[s]這一元素可以使圖像實(shí)現(xiàn)全比例變換。例如,將圖像進(jìn)行全比例變換,即第十六頁(yè),共一百二十六頁(yè),2022年,8月28日將齊次坐標(biāo) 規(guī)范化后, 。由此可見,當(dāng)s>1時(shí),圖像按比例縮??;當(dāng)0<s<1時(shí),整個(gè)圖像按比例放大;當(dāng)s=1時(shí),圖像大小不變。第十七頁(yè),共一百二十六頁(yè),2022年,8月28日6.2圖像比例縮放6.2.1圖像比例縮放變換圖像比例縮放是指將給定的圖像在x軸方向按比例縮放fx倍,在y軸方向按比例縮放fy倍,從而獲得一幅新的圖像。如果fx=fy,即在x軸方向和y軸方向縮放的比率相同,稱這樣的比例縮放為圖像的全比例縮放。如果fx≠fy,圖像的比例縮放會(huì)改變?cè)紙D像的像素間的相對(duì)位置,產(chǎn)生幾何畸變。設(shè)原圖像中的點(diǎn)P0(x0,y0)比例縮放后,在新圖像中的對(duì)應(yīng)點(diǎn)為P(x,y),則P0(x0,y0)和P(x,y)之間的對(duì)應(yīng)關(guān)系如圖6-3所示。第十八頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-3比例縮放第十九頁(yè),共一百二十六頁(yè),2022年,8月28日比例縮放前后兩點(diǎn)P0(x0,y0)、P(x,y)之間的關(guān)系用矩陣形式可以表示為(6-1)公式(6-1)的逆運(yùn)算為第二十頁(yè),共一百二十六頁(yè),2022年,8月28日即比例縮放所產(chǎn)生的圖像中的像素可能在原圖像中找不到相應(yīng)的像素點(diǎn),這樣就必須進(jìn)行插值處理。插值處理常用的方法有兩種,一種是直接賦值為和它最相近的像素值,另一種是通過一些插值算法來(lái)計(jì)算相應(yīng)的像素值。前一種方法計(jì)算簡(jiǎn)單,但會(huì)出現(xiàn)馬賽克現(xiàn)象;后者處理效果要好些,但是運(yùn)算量也相應(yīng)增加。在下面的算法中直接采用了前一種做法。實(shí)際上,這也是一種插值算法,稱為最鄰近插值法(NearestNeighborInterpolation)。第二十一頁(yè),共一百二十六頁(yè),2022年,8月28日下面首先討論圖像的比例縮小。最簡(jiǎn)單的比例縮小是當(dāng)fx=fy=1/2時(shí),圖像被縮到一半大小,此時(shí)縮小后圖像中的(0,0)像素對(duì)應(yīng)于原圖像中的(0,0)像素;(0,1)像素對(duì)應(yīng)于原圖像中的(0,2)像素;(1,0)像素對(duì)應(yīng)于原圖像中的(2,0)像素,依此類推。圖像縮小之后,因?yàn)槌休d的信息量小了,所以畫布可相應(yīng)縮小。此時(shí),只需在原圖像基礎(chǔ)上,每行隔一個(gè)像素取一點(diǎn),每隔一行進(jìn)行操作,即取原圖的偶(奇)數(shù)行和偶(奇)數(shù)列構(gòu)成新的圖像,如圖6-4所示。如果圖像按任意比例縮小,則需要計(jì)算選擇的行和列。第二十二頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-4圖像縮小一半第二十三頁(yè),共一百二十六頁(yè),2022年,8月28日如果M×N大小的原圖像F(x,y)縮小為kM×kN大?。╧<1)的新圖像I(x,y)時(shí),則I(x,y)=F(int(c×x),int(c×y))其中,c=1/k。由此公式可以構(gòu)造出新圖像,如圖6-5所示。圖6-5圖像按任意比例縮小第二十四頁(yè),共一百二十六頁(yè),2022年,8月28日當(dāng)fx≠fy(fx,fy>0)時(shí),圖像不按比例縮小,這種操作因?yàn)樵趚方向和y方向的縮小比例不同,一定會(huì)帶來(lái)圖像的幾何畸變。圖像不按比例縮小的方法是:如果M×N大小的舊圖F(x,y)縮小為k1M×k2N(k1<1,k2<1)大小的新圖像I(x,y)時(shí),則

I(x,y)=F(int(c1×x),int(c2×y))其中由此公式可以構(gòu)造出新圖像。第二十五頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D像在縮小操作中,是在現(xiàn)有的信息里如何挑選所需要的有用信息。而在圖像的放大操作中,則需要對(duì)尺寸放大后所多出來(lái)的空格填入適當(dāng)?shù)南袼刂?,這是信息的估計(jì)問題,所以較圖像的縮小要難一些。當(dāng)fx=fy=2時(shí),圖像被按全比例放大2倍,放大后圖像中的(0,0)像素對(duì)應(yīng)于原圖中的(0,0)像素;(0,1)像素對(duì)應(yīng)于原圖中的(0,0.5)像素,該像素不存在,可以近似為(0,0)也可以近似(0,1);(0,2)像素對(duì)應(yīng)于原圖像中的(0,1)像素;(1,0)像素對(duì)應(yīng)于原圖中的(0.5,0),它的像素值近似于(0,0)或(1,0)像素;(2,0)像素對(duì)應(yīng)于原圖中的(1,0)像素,依此類推。其實(shí)這是將原圖像每行中的像素重復(fù)取值一遍,然后每行重復(fù)一次。圖6-6是原始圖像,圖6-7和圖6-8是分別采用上述兩種近似方法放大后的圖像。第二十六頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-6放大前的圖像第二十七頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-7按最近鄰域法放大兩倍的圖像第二十八頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-8按插值法放大兩倍的圖像第二十九頁(yè),共一百二十六頁(yè),2022年,8月28日一般地,按比例將原圖像放大k倍時(shí),如果按照最近鄰域法則需要將一個(gè)像素值添在新圖像的k×k的子塊中,如圖6-9所示。顯然,如果放大倍數(shù)太大,按照這種方法處理會(huì)出現(xiàn)馬賽克效應(yīng)。當(dāng)fx≠fy(fx,fy>0)時(shí),圖像在x方向和y方向不按比例放大,此時(shí),這種操作由于x方向和y方向的放大倍數(shù)不同,一定帶來(lái)圖像的幾何畸變。放大的方法是將原圖像的一個(gè)像素添到新圖像的一個(gè)k1×k2的子塊中去。為了提高幾何變換后的圖像質(zhì)量,常采用線性插值法。該方法的原理是,當(dāng)求出的分?jǐn)?shù)地址與像素點(diǎn)不一致時(shí),求出周圍四個(gè)像素點(diǎn)的距離比,根據(jù)該比率,由四個(gè)鄰域的像素灰度值進(jìn)行線性插值,如圖6-10所示。第三十頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-9按最近鄰域法放大五倍的圖像第三十一頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-10線性插值法示意圖第三十二頁(yè),共一百二十六頁(yè),2022年,8月28日簡(jiǎn)化后的灰度值計(jì)算式如下:g(x,y)=(1-q){(1-p)×g([x],[y])+p×g([x]+1,[y])}+q{(1-p)×g([x],[y]+1)+p×g([x]+1,[y]+1)}式中:g(x,y)為坐標(biāo)(x,y)處的灰度值,[x]、[y]分別為不大于x,y的整數(shù)。關(guān)于這個(gè)問題的詳細(xì)算法及其實(shí)現(xiàn),讀者可以參考有關(guān)參考文獻(xiàn)。第三十三頁(yè),共一百二十六頁(yè),2022年,8月28日6.2.2比例縮放的實(shí)現(xiàn)圖6-11圖像比例縮放處理結(jié)果第三十四頁(yè),共一百二十六頁(yè),2022年,8月28日下面給出這個(gè)函數(shù)的框架和主要算法。//*****************************************//函數(shù)名稱:BOOLZoomImage()//基本功能:本函數(shù)對(duì)傳入的CDibObject對(duì)象中的圖像進(jìn)行縮放操作//參數(shù)說明:floatfXZoomRatioX軸方向縮放比率// floatfYZoomRatioY軸方向縮放比率// BOOLbBilinearTRUE為雙線性插值,F(xiàn)ALSE為最鄰近插值// CDibObject*pDibObject默認(rèn)為NULL//返回值:BOOL成功返回TRUE,失敗返回FALSE第三十五頁(yè),共一百二十六頁(yè),2022年,8月28日//*****************************************BOOLCGeoTrans::ZoomImage(floatfXZoomRatio,floatfYZoomRatio, BOOLbBilinear,CDibObject*pDibObject){//獲得圖像寬度和高度,計(jì)算縮放后的圖像實(shí)際寬度nNewWidth=(int)(nOldWidth*fXZoomRatio+0.5);nNewHeight=(int)(nOldHeight*fYZoomRatio+0.5);//獲取源圖像指針,為新圖像分配內(nèi)存,用白色填充新圖像數(shù)據(jù)區(qū),調(diào)整新圖像信息//由圖像位數(shù)確定的移動(dòng)字節(jié)數(shù)nMovedBits//針對(duì)圖像每行進(jìn)行操作for(y=0;y<nNewHeight;y++){第三十六頁(yè),共一百二十六頁(yè),2022年,8月28日//指向新圖像第y行pNewTemp=pNewBits;pNewTemp+=(nNewHeight-1[KG*3]-y)*nNewWidthBytes;//針對(duì)圖像每列進(jìn)行操作for(x=0;x<nNewWidth;x++){//計(jì)算該像素在源圖像中的坐標(biāo)inty0=(long)(y/fYZoomRatio+0.5);intx0=(long)(x/fXZoomRatio+0.5);//判斷是否在源圖范圍內(nèi)if((x0>=0)&&(x0<nOldWidth)&&(y0>=0)&&(y0<nOldHeight)){if(bBilinear){第三十七頁(yè),共一百二十六頁(yè),2022年,8月28日//雙線性插值}else{//指向源圖像第y0行,第x0個(gè)像素pOldTemp=pOldBits;pOldTemp+=(nOldHeight-1-y0)*nOldWidthBytes;pOldTemp+=x0*nMovedBits;memcpy(pNewTemp,pOldTemp,nMovedBits);}}pNewTemp+=nMovedBits;}}//將內(nèi)存解鎖和將不再使用的內(nèi)存釋放,將新圖像設(shè)置為當(dāng)前圖像returnTRUE;}第三十八頁(yè),共一百二十六頁(yè),2022年,8月28日6.3圖像平移6.3.1圖像平移變換圖6-12圖像平移第三十九頁(yè),共一百二十六頁(yè),2022年,8月28日設(shè)點(diǎn)P0(x0,y0)進(jìn)行平移后,移到P(x,y),其中x方向的平移量為Δx,y方向的平移量為Δy。那么,點(diǎn)P(x,y)的坐標(biāo)為利用齊次坐標(biāo),變換前后圖像上的點(diǎn)P0(x0,y0)和P(x,y)之間的關(guān)系可以用如下的矩陣變換表示為(6-2)第四十頁(yè),共一百二十六頁(yè),2022年,8月28日對(duì)變換矩陣求逆,可以得到式(6-2)的逆變換即第四十一頁(yè),共一百二十六頁(yè),2022年,8月28日這樣,平移后的圖像上的每一點(diǎn)都可以在原圖像中找到對(duì)應(yīng)的點(diǎn)。例如,對(duì)于新圖中的(0,0)像素,代入上面的方程組,可以求出對(duì)應(yīng)原圖中的像素(-Δx,-Δy)。如果Δx或Δy大于0,則點(diǎn)(-Δx,-Δy)不在原圖像中。對(duì)于不在原圖像中的點(diǎn),可以直接將它的像素值統(tǒng)一設(shè)置為0或者255(對(duì)于灰度圖就是黑色或白色)。同樣,若有像素點(diǎn)不在原圖像中,也就說明原圖像中有點(diǎn)被移出顯示區(qū)域。如果不想丟失被移出的部分圖像,可以將新生成的圖像寬度擴(kuò)大|Δx|,高度擴(kuò)大|Δy|。第四十二頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-13平移前的圖像第四十三頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-14平移后的圖像第四十四頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-15平移擴(kuò)大后的圖像第四十五頁(yè),共一百二十六頁(yè),2022年,8月28日6.3.2圖像平移的算法按照上述理論,可以比較容易地用VC++來(lái)實(shí)現(xiàn)圖像的平移。下面介紹灰度圖像的平移,因?yàn)榛叶葓D像每個(gè)像素位數(shù)正好是8位,即1個(gè)字節(jié),在進(jìn)行圖像處理時(shí)可以不用考慮拼湊字節(jié)的問題。而且由于灰度圖像調(diào)色板的特殊性,進(jìn)行灰度圖像處理時(shí)不必考慮調(diào)色板的問題。所以,在介紹圖像處理時(shí),一般采用灰度圖像,以便將重點(diǎn)放在算法本身。由上述分析,可以得到實(shí)現(xiàn)圖像平移的算法如下。第四十六頁(yè),共一百二十六頁(yè),2022年,8月28日//*****************************************//函數(shù)名稱:BOOLTranslationPixel()//基本功能:本函數(shù)對(duì)傳入的CDibObject對(duì)象中的圖像進(jìn)行逐點(diǎn)平移操作//參數(shù)說明:longlXOffset X軸平移量(像素?cái)?shù))// longlYOffset Y軸平移量(像素?cái)?shù))//返回值:BOOL成功返回TRUE,失敗返回FALSE//注意:該函數(shù)不會(huì)改變圖像的大小,移出的部分圖像將截去,空白部分用白色填充//*****************************************BOOLCGeoTrans::TranslationPixel(longlXOffset,longlYOffset,CDibObject*pDibObject){//定義變量,獲得源圖像指針及其圖像信息,為新圖像分配內(nèi)存及用白色填充新圖第四十七頁(yè),共一百二十六頁(yè),2022年,8月28日//由圖像位數(shù)確定的移動(dòng)字節(jié)數(shù)nMovedBits,對(duì)于灰度圖像有nMovedBits=1//每行for(y=0;y<nHeight;y++){pNewTemp=pNewBits;pNewTemp+=(nHeight-1-y)*nWidthBytes;//每列for(x=0;x<nWidth;x++){//指向新DIB第y行,第x個(gè)像素的指針,計(jì)算該像素在源DIB中的坐標(biāo)intx0=x-lXOffset;inty0=y-lYOffset;//判斷是否在源圖范圍內(nèi)if((x0>=0)&&(x0<nWidth)&&(y0>=0)&&(y0<nHeight))第四十八頁(yè),共一百二十六頁(yè),2022年,8月28日{(diào)//指向源DIB第y0行,第x0個(gè)像素的指針pOldTemp=pOldBits;pOldTemp+=(nHeight-1-y0)*nWidthBytes;pOldTemp+=x0*nMovedBits;//復(fù)制像素memcpy(pNewTemp,pOldTemp,nMovedBits);}pNewTemp+=nMovedBits;}}//用新圖像數(shù)據(jù)填充源圖像數(shù)據(jù)區(qū)memcpy(pOldBits,pNewBits,nWidthBytes*nHeight);}第四十九頁(yè),共一百二十六頁(yè),2022年,8月28日6.4圖像鏡像6.4.1圖像鏡像變換圖像的鏡像變換不改變圖像的形狀。圖像的鏡像(Mirror)變換分為兩種:一種是水平鏡像,另外一種是垂直鏡像。圖像的水平鏡像操作是將圖像左半部分和右半部分以圖像垂直中軸線為中心進(jìn)行鏡像對(duì)換;圖像的垂直鏡像操作是將圖像上半部分和下半部分以圖像水平中軸線為中心進(jìn)行鏡像對(duì)換,如圖6-16所示。第五十頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-16圖像的鏡像第五十一頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D像的鏡像變換也可以用矩陣變換表示。設(shè)點(diǎn)P0(x0,y0)進(jìn)行鏡像后的對(duì)應(yīng)點(diǎn)為P(x,y),圖像高度為fHeight,寬度為fWidth,原圖像中P0(x0,y0)經(jīng)過水平鏡像后坐標(biāo)將變?yōu)椋╢Width-x0,y0),其矩陣表達(dá)式為(6-3)第五十二頁(yè),共一百二十六頁(yè),2022年,8月28日逆運(yùn)算矩陣表達(dá)式為即第五十三頁(yè),共一百二十六頁(yè),2022年,8月28日同樣,P0(x0,y0)經(jīng)過垂直鏡像后坐標(biāo)將變?yōu)?x0,fHeight-y0),其矩陣表表達(dá)式為(6-4)第五十四頁(yè),共一百二十六頁(yè),2022年,8月28日逆運(yùn)算矩陣表達(dá)式為即第五十五頁(yè),共一百二十六頁(yè),2022年,8月28日6.4.2圖像鏡像的算法按照上面的變換公式(6-3)和(6-4),可以比較簡(jiǎn)單的實(shí)現(xiàn)圖像的水平和垂直鏡像操作,讀者可以參照6.3.2中平移的算法,寫出公式(6-3)和(6-4)對(duì)應(yīng)的算法。和圖像平移一樣,在垂直鏡像中也可以利用位圖存儲(chǔ)的連續(xù)性整行復(fù)制圖像。下面將介紹采用這種方法的算法,其主要算法如下,bDirection為真時(shí)表示水平鏡像,否則為垂直鏡像。第五十六頁(yè),共一百二十六頁(yè),2022年,8月28日//由圖像位數(shù)確定的移動(dòng)字節(jié)數(shù)nMovedBits//判斷鏡像方式if(bDirection){//垂直中軸坐標(biāo)intnMiddleX=nWidth/2;//針對(duì)圖像每行進(jìn)行操作for(y=0;y<nHeight;y++){//指向圖像的倒數(shù)第y行pOldTemp=pOldBits;pOldTemp+=y*nWidthBytes;pNewTemp=pNewBits;第五十七頁(yè),共一百二十六頁(yè),2022年,8月28日pNewTemp+=y*nWidthBytes;//針對(duì)每行圖像左半部分進(jìn)行操作for(x=0;x<=nMiddleX;x++){//將源圖像第x個(gè)像素復(fù)制到新圖像倒數(shù)第x個(gè)像素pTemp1=pOldTemp+x*nMovedBits;pTemp2=pNewTemp+(nWidth-1-x)*nMovedBits;memcpy(pTemp2,pTemp1,nMovedBits);//將源圖像倒數(shù)第x個(gè)像素復(fù)制到新圖像第x個(gè)像素pTemp1=pOldTemp+(nWidth-1-x)*nMovedBits;pTemp2=pNewTemp+x*nMovedBits;memcpy(pTemp2,pTemp1,nMovedBits);}}}第五十八頁(yè),共一百二十六頁(yè),2022年,8月28日else{//水平中軸坐標(biāo)intnMiddleY=nHeight/2;//針對(duì)上半圖像進(jìn)行操作for(y=0;y<=nMiddleY;y++){//指向源圖像倒數(shù)第y行像素起點(diǎn)的指針pOldTemp=pOldBits;pOldTemp+=y*nWidthBytes;//指向新圖像第y行像素起點(diǎn)的指針pNewTemp=pNewBits;pNewTemp+=(nHeight-1-y)*nWidthBytes;//將源圖像倒數(shù)第y行像素復(fù)制到新圖像第y行第五十九頁(yè),共一百二十六頁(yè),2022年,8月28日memcpy(pNewTemp,pOldTemp,nWidthBytes);//指向源圖像第y行像素起點(diǎn)的指針pOldTemp=pOldBits;pOldTemp+=(nHeight-1-y)*nWidthBytes;//指向新圖像倒數(shù)第y行像素起點(diǎn)的指針pNewTemp=pNewBits;pNewTemp+=y*nWidthBytes;//將源圖像第y行像素復(fù)制到新圖像倒數(shù)第y行memcpy(pNewTemp,pOldTemp,nWidthBytes);}}//用新圖像數(shù)據(jù)填充原圖像數(shù)據(jù)區(qū)memcpy(pOldBits,pNewBits,nWidthBytes*nHeight);第六十頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-17鏡像前的圖像第六十一頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-18水平鏡像第六十二頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-19垂直鏡像第六十三頁(yè),共一百二十六頁(yè),2022年,8月28日6.5圖像旋轉(zhuǎn)6.5.1圖像旋轉(zhuǎn)變換本節(jié)介紹一種相對(duì)復(fù)雜的幾何變換——圖像的旋轉(zhuǎn)。一般圖像的旋轉(zhuǎn)是以圖像的中心為原點(diǎn),將圖像上的所有像素都旋轉(zhuǎn)一個(gè)相同的角度。圖像的旋轉(zhuǎn)變換是圖像的位置變換,但旋轉(zhuǎn)后,圖像的大小一般會(huì)改變。和圖像平移一樣,在圖像旋轉(zhuǎn)變換中既可以把轉(zhuǎn)出顯示區(qū)域的圖像截去,也可以擴(kuò)大圖像范圍以顯示所有的圖像。如圖6-20、圖6-21所示。第六十四頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-20旋轉(zhuǎn)前的圖像第六十五頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-21旋轉(zhuǎn)θ后的圖像(擴(kuò)大圖像、轉(zhuǎn)出部分被截)第六十六頁(yè),共一百二十六頁(yè),2022年,8月28日同樣,圖像的旋轉(zhuǎn)變換也可以用矩陣變換表示。設(shè)點(diǎn)P0(x0,y0)旋轉(zhuǎn)θ角后的對(duì)應(yīng)點(diǎn)為P(x,y),如圖6-22所示。那么,旋轉(zhuǎn)前后點(diǎn)P0(x0,y0)、P(x,y)的坐標(biāo)分別是:圖6-22圖像旋轉(zhuǎn)θ角第六十七頁(yè),共一百二十六頁(yè),2022年,8月28日寫成矩陣表達(dá)式為(6-5)第六十八頁(yè),共一百二十六頁(yè),2022年,8月28日其逆運(yùn)算為利用公式(6-5)可以確定旋轉(zhuǎn)后圖像上的像素。例如,當(dāng)θ=30°時(shí),公式(6-5)為第六十九頁(yè),共一百二十六頁(yè),2022年,8月28日而且,此時(shí)xmin=0.866-0.5×3=-0.634;xmin=0.866×3-0.5=2.098ymin=0.866+0.5=1.366;ymax=0.866×3+0.5×3=4.098圖6-23圖像旋轉(zhuǎn)θ角第七十頁(yè),共一百二十六頁(yè),2022年,8月28日利用公式(6-5)進(jìn)行圖像旋轉(zhuǎn)時(shí)需要注意如下兩點(diǎn):(1)圖像旋轉(zhuǎn)之前,為了避免信息的丟失,一定要有坐標(biāo)平移,具體的做法有如圖6-24所示的兩種方法。圖6-24圖像旋轉(zhuǎn)之前進(jìn)行的平移第七十一頁(yè),共一百二十六頁(yè),2022年,8月28日(2)圖像旋轉(zhuǎn)之后,會(huì)出現(xiàn)許多空洞點(diǎn),如圖6-23所示。對(duì)這些空洞點(diǎn)必須進(jìn)行填充處理,否則畫面效果不好,一般也稱這種操作為插值處理。最簡(jiǎn)單的方法是行插值方法或列插值方法:①找出當(dāng)前行的最小和最大的非白點(diǎn)的坐標(biāo),記作:(i,k1)、(i,k2)。②在(k1,k2)范圍內(nèi)進(jìn)行插值,插值的方法是:空點(diǎn)的像素值等于前一點(diǎn)的像素值。③同樣的操作重復(fù)到所有行。經(jīng)過如上的插值處理之后,圖像效果就變得自然。如圖6-25所示。列插值方法與此類同,請(qǐng)讀者自己給出。第七十二頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-25圖6-23中的圖像處理后的效果第七十三頁(yè),共一百二十六頁(yè),2022年,8月28日6.5.2圖像旋轉(zhuǎn)的實(shí)現(xiàn)按照上述理論,也可以用VC++編程實(shí)現(xiàn)圖像的旋轉(zhuǎn)。為了將重點(diǎn)放在算法本身,下面介紹灰度圖像的旋轉(zhuǎn)算法。由上面的公式(6-6)以及產(chǎn)生空穴時(shí)的雙線性插值方法,可以編制一個(gè)實(shí)現(xiàn)圖像旋轉(zhuǎn)的函數(shù)RotateDIB2()。下面給出這個(gè)函數(shù)的框架和主要算法。//*****************************************//函數(shù)名稱:BOOLRotate()//基本功能:本函數(shù)對(duì)傳入的CDibObject對(duì)象中的圖像進(jìn)行旋轉(zhuǎn)操作//參數(shù)說明:intiRotateAngle旋轉(zhuǎn)的角度(0~360度)// BOOLbBilinearTRUE為雙線性插值,F(xiàn)ALSE為最鄰近插值// CDibObject*pDibObject默認(rèn)為NULL第七十四頁(yè),共一百二十六頁(yè),2022年,8月28日//返回值:BOOL成功返回TRUE,失敗返回FALSE//*****************************************BOOLCGeoTrans::Rotate(intnRotateAngle,BOOLbBilinear,CDibObject*pDibObject){//獲得圖像寬度和高度:nOldWidth、nOldHeight//定義旋轉(zhuǎn)角度(弧度)及其正弦和余弦值:fRotateAngle、fSina、fCosa//定義源圖四個(gè)角的坐標(biāo)、旋轉(zhuǎn)后四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn))//計(jì)算旋轉(zhuǎn)角度的正弦和余弦值//計(jì)算源圖的四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn))//計(jì)算新圖四個(gè)角的坐標(biāo)(以圖像中心為坐標(biāo)系原點(diǎn))第七十五頁(yè),共一百二十六頁(yè),2022年,8月28日fDstX1=fCosa*fSrcX1+fSina*fSrcY1;fDstY1=-fSina*fSrcX1+fCosa*fSrcY1;fDstX2=fCosa*fSrcX2+fSina*fSrcY2;fDstY2=-fSina*fSrcX2+fCosa*fSrcY2;fDstX3=fCosa*fSrcX3+fSina*fSrcY3;fDstY3=-fSina*fSrcX3+fCosa*fSrcY3;fDstX4=fCosa*fSrcX4+fSina*fSrcY4;fDstY4=-fSina*fSrcX4+fCosa*fSrcY4;//計(jì)算旋轉(zhuǎn)后的圖像實(shí)際寬度intnNewWidth=(long)(max(fabs(fDstX4-fDstX1),fabs(fDstX3-fDstX2))+0.5);//計(jì)算旋轉(zhuǎn)后的圖像高度第七十六頁(yè),共一百二十六頁(yè),2022年,8月28日intnNewHeight=(long)(max(fabs(fDstY4-fDstY1),fabs(fDstY3-fDstY2))+0.5);//計(jì)算兩個(gè)常數(shù)f1=(float)(-0.5*(nNewWidth-1)*fCosa-0.5*(nNewHeight-1)*fSina+0.5*(nOldWidth-1));f2=(float)(0.5*(nNewWidth-1)*fSina-0.5*(nNewHeight-1)*fCosa+0.5*(nOldHeight-1));//獲取指向源圖像的指針,為旋轉(zhuǎn)圖像分配內(nèi)存并用白色填充新圖像數(shù)據(jù)區(qū)//由圖像位數(shù)確定的移動(dòng)字節(jié)數(shù)nMovedBits//針對(duì)圖像每行進(jìn)行操作for(y=0;y<nNewHeight;y++){第七十七頁(yè),共一百二十六頁(yè),2022年,8月28日//指向新圖像第y行pNewTemp=pNewBits;pNewTemp+=(nNewHeight-1-y)*nNewWidthBytes;//針對(duì)圖像每列進(jìn)行操作for(x=0;x<nNewWidth;x++){//計(jì)算該像素在源圖像中的坐標(biāo)inty0=(long)(-((float)x)*fSina+((float)y)*fCosa+f2+0.5);intx0=(long)(((float)x)*fCosa+((float)y) *fSina+f1+0.5);//判斷是否在源圖范圍內(nèi)第七十八頁(yè),共一百二十六頁(yè),2022年,8月28日if((x0>=0)&&(x0<nOldWidth)&&(y0>=0)&&(y0<nOldHeight)){//用雙線性插值if(bBilinear){unsignedchar*pTemp=Interpolation(nOldWidth,nOldHeight,(float)x0,(float)y0,nOldWidthBytes,nMovedBits,pOldBits);//復(fù)制像素memcpy(pNewTemp,pTemp,nMovedBits);delete[]pTemp;}else{第七十九頁(yè),共一百二十六頁(yè),2022年,8月28日//指向源圖像第y0行,第x0個(gè)像素pOldTemp=pOldBits;pOldTemp+=(nOldHeight-1-y0)*nOldWidthBytes;pOldTemp+=x0*nMovedBits;//復(fù)制像素memcpy(pNewTemp,pOldTemp,nMovedBits);}}pNewTemp+=nMovedBits;}}//將內(nèi)存解鎖和將不再使用的內(nèi)存釋放,將新圖像設(shè)置為當(dāng)前圖像returnTRUE;}第八十頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-26旋轉(zhuǎn)前的圖像第八十一頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-27旋轉(zhuǎn)15°并進(jìn)行插值處理的圖像第八十二頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-28被放大的旋轉(zhuǎn)前圖像第八十三頁(yè),共一百二十六頁(yè),2022年,8月28日6-29旋轉(zhuǎn)300并進(jìn)行插值處理的放大圖像第八十四頁(yè),共一百二十六頁(yè),2022年,8月28日6.6圖像復(fù)合變換6.6.1圖像復(fù)合變換圖像的復(fù)合變換是指對(duì)給定的圖像連續(xù)施行若干次如前所述的平移、鏡像、比例、旋轉(zhuǎn)等基本變換后所完成的變換,圖像的復(fù)合變換又叫級(jí)聯(lián)變換。利用齊次坐標(biāo),對(duì)給定的圖像依次按一定順序連續(xù)施行若干次基本變換,其變換的矩陣仍然可以用3×3階的矩陣表示,而且從數(shù)學(xué)上可以證明,復(fù)合變換的矩陣等于基本變換的矩陣按順序依次相乘得到的組合矩陣。設(shè)對(duì)給定的圖像依次進(jìn)行了基本變換F1,F(xiàn)2,…,F(xiàn)N,它們的變換矩陣分別為T1,T2,…,TN,按照公式(6-1)~(6-6)的表示形式,圖像復(fù)合變換的矩陣T可以表示為:T=TNTN-1…T1。第八十五頁(yè),共一百二十六頁(yè),2022年,8月28日

1.復(fù)合平移設(shè)某個(gè)圖像先平移到新的位置P1(x1,y1)后,再將圖像平移到P2(x2,y2)的位置,則復(fù)合平移矩陣為由此可見,盡管一些順序的平移,用到矩陣的乘法,但最后合成的平移矩陣,只需對(duì)平移常量作加法運(yùn)算。(6-7)第八十六頁(yè),共一百二十六頁(yè),2022年,8月28日

2.復(fù)合比例同樣,對(duì)某個(gè)圖像連續(xù)進(jìn)行比例變換,最后合成的復(fù)合比例矩陣,只要對(duì)比例常量作乘法運(yùn)算即可。復(fù)合比例矩陣如下:(6-8)第八十七頁(yè),共一百二十六頁(yè),2022年,8月28日

3.復(fù)合旋轉(zhuǎn)類似地,對(duì)某個(gè)圖像連續(xù)進(jìn)行旋轉(zhuǎn)變換,最后合成的旋轉(zhuǎn)變換矩陣等于兩次旋轉(zhuǎn)角度的和,復(fù)合旋轉(zhuǎn)變換矩陣如下式所示:(6-9)第八十八頁(yè),共一百二十六頁(yè),2022年,8月28日上述均為相對(duì)原點(diǎn)(圖像中央)作比例、旋轉(zhuǎn)等變換,如果要相對(duì)某一個(gè)參考點(diǎn)作變換,則要使用含有不同種基本變換的圖像復(fù)合變換。不同的復(fù)合變換,其變換過程不同,但是無(wú)論它的變換過程多么復(fù)雜,都可以分解成一系列基本變換。相應(yīng)地,使用齊次坐標(biāo)后,圖像復(fù)合變換的矩陣由一系列圖像基本幾何變換矩陣依次相乘而得到。下面通過一個(gè)例子討論含有不同種基本變換的圖像復(fù)合變換。第八十九頁(yè),共一百二十六頁(yè),2022年,8月28日從6.2和6.5節(jié)的討論中可以看出,在進(jìn)行圖像的比例縮放、圖像的旋轉(zhuǎn)變換時(shí),整個(gè)變換過程由兩部分組成,即需要兩個(gè)獨(dú)立的算法。首先,需要一個(gè)算法來(lái)完成幾何變換本身,用它描述每個(gè)像素如何從其初始位置移動(dòng)到終止位置;同時(shí),還需要一個(gè)用于灰度級(jí)插值的算法。這是因?yàn)?,在一般情況下,原始(輸入)圖像的位置坐標(biāo)(x,y)為整數(shù),而變換后(輸出)圖像的位置坐標(biāo)為非整數(shù),即產(chǎn)生“空穴”,反過來(lái)也是如此。因此,一般地,在進(jìn)行圖像的幾何變換時(shí),除了要進(jìn)行其本身的幾何變換外,還要進(jìn)行灰度級(jí)插值處理。第九十頁(yè),共一百二十六頁(yè),2022年,8月28日灰度級(jí)插值處理可采用如下兩種方法。第一,可以把幾何變換想像成將輸入圖像的灰度一個(gè)一個(gè)像素地轉(zhuǎn)移到輸出圖像中。如果一個(gè)輸入像素被映射到四個(gè)輸出像素之間的位置,則其灰度值就按插值算法在四個(gè)輸出像素之間進(jìn)行分配。把這種灰度級(jí)插值處理稱為像素移交(pixelcarryover)或稱為向前映射法,如圖6-30所示。另一種更有效的灰度級(jí)插值處理方法是像素填充(pixelfilling)或稱為向后映射算法。在這種算法中,輸出像素一次一個(gè)地映射回到原始(輸入)圖像中,以便確定其灰度級(jí)。如果一個(gè)輸出像素被映射到四個(gè)輸出像素之間,則其灰度值由灰度級(jí)插值決定,如圖6-30所示。向后空間變換是向前變換的逆變換。第九十一頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-30灰度級(jí)插值處理(像素變換)第九十二頁(yè),共一百二十六頁(yè),2022年,8月28日在像素填充法中,變換后(輸出)圖像的像素通常被映射到原始(輸入)圖像中的非整數(shù)位置,即位于四個(gè)輸入像素之間。因此,為了決定與該位置相對(duì)應(yīng)的灰度值,必須進(jìn)行插值運(yùn)算。最簡(jiǎn)單的插值方法是零階插值或稱為最近鄰插值,也叫最近鄰域法,參見本書6.2節(jié)。一階插值或稱雙線性插值法和零階插值法相比可產(chǎn)生更令人滿意的效果,只是程序稍復(fù)雜一些,運(yùn)行時(shí)間稍長(zhǎng)一些。它的原理如圖6-10和圖6-31所示,插值計(jì)算公式參見6.2.1中的公式(6-2)。由于篇幅所限,雙線性插值公式的推導(dǎo)在此從略,有興趣的讀者請(qǐng)參考書后的參考文獻(xiàn)。第九十三頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-31雙線性插值第九十四頁(yè),共一百二十六頁(yè),2022年,8月28日在這里還要說明一點(diǎn),為了提高雙線性插值的速度,雙線性插值也可以分解為三個(gè)線性插值來(lái)實(shí)現(xiàn),公式如下:f(x,0)=f(0,0)+x[f(1,0)-f(0,0)]

f(x,1)=f(0,1)+x[f(1,1)-f(0,1)] (6-10)

f(x,y)=f(x,0)+y[f(x,1)-f(x,0)]

因?yàn)楣?6-2)需要用到四次乘法、八次加(或減)法運(yùn)算,而公式(6-10)表示的第二種方法只需要三次乘法和六次加(或減)法,所以幾何變換程序一般選擇后者。從圖6-31也可以看出雙線性插值與最近鄰插值的區(qū)別。第九十五頁(yè),共一百二十六頁(yè),2022年,8月28日在幾何運(yùn)算中,雙線性灰度插值的平滑作用可能會(huì)使圖像的細(xì)節(jié)產(chǎn)生退化,尤其是在進(jìn)行放大處理時(shí),這種影響將更為明顯。而在其他應(yīng)用中,雙線性插值的斜率不連續(xù)性會(huì)產(chǎn)生不希望得到的結(jié)果。這兩種情況都可以通過高階插值得到修正,當(dāng)然這需要增加計(jì)算量。使用高階插值函數(shù)的例子有:三次樣條、Legendre中心函數(shù)和sin(αx)/α函數(shù)(即sin(αx)函數(shù))。高階插值常用卷積來(lái)實(shí)現(xiàn),這部分內(nèi)容請(qǐng)讀者參考書后所附的參考文獻(xiàn)。第九十六頁(yè),共一百二十六頁(yè),2022年,8月28日6.6.2圖像復(fù)合變換的示例圖6-32坐標(biāo)系的平移第九十七頁(yè),共一百二十六頁(yè),2022年,8月28日兩個(gè)坐標(biāo)系之間的坐標(biāo)變換矩陣表達(dá)式為:它的逆變換矩陣表達(dá)式是:第九十八頁(yè),共一百二十六頁(yè),2022年,8月28日為了推導(dǎo)公式簡(jiǎn)單起見,假設(shè)圖像未旋轉(zhuǎn)時(shí)中心坐標(biāo)為(a,b),旋轉(zhuǎn)后中心坐標(biāo)為(c,d)(在新的坐標(biāo)系下旋轉(zhuǎn)后新圖像左上角為原點(diǎn)),則旋轉(zhuǎn)變換矩陣表達(dá)式為(6-11)第九十九頁(yè),共一百二十六頁(yè),2022年,8月28日其逆變換表達(dá)式為(6-12)即(6-13)第一百頁(yè),共一百二十六頁(yè),2022年,8月28日因此(6-14)公式(6-10)說明繞任意點(diǎn)(a,b)旋轉(zhuǎn)的幾何變換是由平移—旋轉(zhuǎn)—平移三個(gè)基本變換所構(gòu)成,即先將坐標(biāo)系平移到點(diǎn)(a,b),再進(jìn)行旋轉(zhuǎn),然后將旋轉(zhuǎn)后的圖像平移回原來(lái)的坐標(biāo)原點(diǎn)。第一百零一頁(yè),共一百二十六頁(yè),2022年,8月28日利用上面的轉(zhuǎn)換公式(6-12)~(6-14),就可以比較方便地編寫出實(shí)現(xiàn)圖像旋轉(zhuǎn)的VC++函數(shù)。首先應(yīng)計(jì)算出公式中需要的幾個(gè)參數(shù):a,b,c,d和旋轉(zhuǎn)后新圖像的高、寬度。現(xiàn)在已知圖像的原始寬度為lWidth,高度為lHeight,以圖像中心為坐標(biāo)系原點(diǎn),則原始圖像四個(gè)角的坐標(biāo)分別為第一百零二頁(yè),共一百二十六頁(yè),2022年,8月28日按照旋轉(zhuǎn)公式(6-11)~(6-14),在旋轉(zhuǎn)后的新圖像中,這四個(gè)點(diǎn)坐標(biāo)為第一百零三頁(yè),共一百二十六頁(yè),2022年,8月28日則新圖像的寬度lNewWidth和高度lNewHeight為lNewWidth=max(|fDstX4-fDstY1|,|fDstX3-fDstY2|)lNewHeight=max(|fDstX4-fDstY1|,|fDstX3-fDstY2|)如果令(6-15)由已知及假設(shè)第一百零四頁(yè),共一百二十六頁(yè),2022年,8月28日由公式(6-13)得(6-16)公式(6-16)、(6-17)便是圖像繞任意點(diǎn)(a,b)旋轉(zhuǎn)的變換公式,由此便可以編寫出實(shí)現(xiàn)該變換的VC++程序。事實(shí)上,只要先按上述公式計(jì)算出旋轉(zhuǎn)后新圖像的高度和寬度以及常數(shù)f1和f2,并按照公式(6-17)計(jì)算出變換后圖像上的點(diǎn)(i0,j0)://計(jì)算該像素在源DIB中的坐標(biāo)i0=-((float)j)*fsina+((float)i)*fcosa+f2;j0=((float)j)*fcosa+((float)i)*fsina+f1;第一百零五頁(yè),共一百二十六頁(yè),2022年,8月28日6.7透視變換6.7.1透視變換把三維物體或?qū)ο筠D(zhuǎn)變?yōu)槎S圖形表示的過程稱為投影變換。根據(jù)視點(diǎn)(投影中心)與投影平面之間距離的不同,投影可分為平行投影和透視投影,透視投影即透視變換。平行投影的視點(diǎn)與投影平面之間的距離為無(wú)窮大,而對(duì)透視投影(變換),該距離是有限的。這個(gè)距離決定著透視投影的特性——透視縮小效應(yīng),即三維物體或?qū)ο笸敢曂队暗拇笮∨c形體到視點(diǎn)的距離成反比。例如,等長(zhǎng)的兩直線段,都平行于投影面,但離投影中心近的線段,其透視投影大,而離投影中心遠(yuǎn)的線段,透視投影小。這種效應(yīng)所產(chǎn)生的視覺效果與照相機(jī)系統(tǒng)和人的視覺系統(tǒng)十分類似。與平行投影相比,透視投影的深度感更強(qiáng),看上去更真實(shí),但透視投影不能真實(shí)地反映物體的精確尺寸和形狀。第一百零六頁(yè),共一百二十六頁(yè),2022年,8月28日對(duì)于透視投影,一束平行于投影面的平行線的投影可保持平行,而不平行于投影面的平行線的投影會(huì)聚集到一個(gè)點(diǎn),這個(gè)點(diǎn)稱為滅點(diǎn)(VanishingPoint)。滅點(diǎn)可以看作是無(wú)限遠(yuǎn)處的一點(diǎn)在投影面上的投影。透視投影的滅點(diǎn)可以有無(wú)限多個(gè),不同方向的平行線在投影面上就能形成不同的滅點(diǎn),坐標(biāo)軸方向的平行線在投影面上形成的滅點(diǎn)又稱作主滅點(diǎn)。因?yàn)橛衳,y和z三個(gè)坐標(biāo)軸,所以主滅點(diǎn)最多有3個(gè)。透視投影是按主滅點(diǎn)的個(gè)數(shù)來(lái)分類的,即按投影面與坐標(biāo)軸的夾角來(lái)分類的,可分為一點(diǎn)透視、二點(diǎn)透視和三點(diǎn)透視,如圖6-33所示。第一百零七頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-33透視變換(a)一點(diǎn)透視;(b)二點(diǎn)透視;(c)三點(diǎn)透視第一百零八頁(yè),共一百二十六頁(yè),2022年,8月28日下面討論一點(diǎn)透視。一點(diǎn)透視只有一個(gè)主滅點(diǎn),即投影面與一個(gè)坐標(biāo)軸正交,與另外兩個(gè)坐標(biāo)軸平行,如圖6-33(a)所示。進(jìn)行一點(diǎn)透視投影變換,要很好地考慮圖面布局,以避免三維形體或?qū)ο蟮钠矫嬗蚍e聚成直線或直線積聚成點(diǎn)而影響直觀性。具體地說,就是要考慮下列幾點(diǎn):①三維形體或?qū)ο笈c畫面(投影面)的相對(duì)位置;②視距,即視點(diǎn)與畫面的距離;③視點(diǎn)的高度。由此,假設(shè)視點(diǎn)在坐標(biāo)原點(diǎn),z坐標(biāo)軸方向與觀察方向重合一致,三維形體或?qū)ο笊夏骋稽c(diǎn)為P(x,y,z),一點(diǎn)透視變換后在投影面(觀察平面)UO′V上的對(duì)應(yīng)點(diǎn)為P′(x′,y′,z′),投影面與z軸垂直,且與視點(diǎn)的距離為d,z軸過投影面窗口的中心,窗口是邊長(zhǎng)為2S的正方形,如圖6-34所示。根據(jù)相似三角形對(duì)應(yīng)邊成比例的關(guān)系,有:第一百零九頁(yè),共一百二十六頁(yè),2022年,8月28日(6-18)利用齊次坐標(biāo),與二維幾何變換類似,將該過程寫成變換矩陣形式為(6-19)第一百一十頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-34一點(diǎn)透視變換第一百一十一頁(yè),共一百二十六頁(yè),2022年,8月28日一般地,視點(diǎn)不在原點(diǎn),投影平面是任意平面的情況,一點(diǎn)透視變換的矩陣也可以用一個(gè)4×4的矩陣表示。當(dāng)根據(jù)公式(6-19)求出它的逆變換后,可以用VC++編寫一個(gè)實(shí)現(xiàn)圖像透視的程序,實(shí)現(xiàn)圖像的透視。第一百一十二頁(yè),共一百二十六頁(yè),2022年,8月28日6.7.2其他變換如前所述,齊次坐標(biāo)為確定各種基本變換和復(fù)合變換公式提供了一個(gè)簡(jiǎn)單的方法。然而,在許多圖像處理與分析應(yīng)用中,所需的幾何變換都相當(dāng)復(fù)雜,甚至有些無(wú)法用簡(jiǎn)便的數(shù)學(xué)式來(lái)表達(dá)。此外,所需幾何變換經(jīng)常要從對(duì)實(shí)際圖像的測(cè)量中獲得,因此更希望用這些測(cè)量結(jié)果而不是函數(shù)形式來(lái)描述幾何變換。例如,在對(duì)由攝像機(jī)拍攝的有幾何畸變的圖像進(jìn)行幾何校正時(shí),首先應(yīng)將一個(gè)矩形柵格目標(biāo)數(shù)字化并顯示出來(lái)。因?yàn)閿z像機(jī)中有幾何變形,所顯示的圖案不會(huì)是準(zhǔn)確的矩形,因此所求幾何變換應(yīng)能使其柵格圖案再次被復(fù)原為準(zhǔn)確的矩形,從而修正了攝像機(jī)產(chǎn)生的畸變。采用同樣的幾何變換可用于校正同一攝像機(jī)生成的數(shù)字化圖像(假定畸變與景物無(wú)關(guān)),由此可得到不畸變的圖像。第一百一十三頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D像幾何變換的一個(gè)重要應(yīng)用是消除由于攝像機(jī)導(dǎo)致的數(shù)字圖像的幾何畸變。當(dāng)需要從數(shù)字圖像中得到定量的空間測(cè)量數(shù)據(jù)時(shí),幾何校正被證明是十分重要的。某些圖像,例如,從衛(wèi)星上或飛機(jī)側(cè)視雷達(dá)上得到的圖像,都有相當(dāng)嚴(yán)重的幾何變形,這些圖像需要先經(jīng)過幾何校正,然后才能對(duì)其內(nèi)容做出解釋。一些圖像系統(tǒng)使用非矩形的像素坐標(biāo),例如,極坐標(biāo)、柱坐標(biāo)、球面坐標(biāo)等,用普通的顯示設(shè)備觀察這些圖像時(shí),必須先對(duì)它們進(jìn)行校正,也就是說,將其轉(zhuǎn)換為矩形像素坐標(biāo)。例如,在油(水)井套管缺陷識(shí)別中,有時(shí)需要將極坐標(biāo)系中的內(nèi)窺鏡圖像轉(zhuǎn)換為直角坐標(biāo)系中的圖像,然后進(jìn)行分析與處理,如圖6-35、6-36所示。第一百一十四頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-35極坐標(biāo)系中的內(nèi)窺鏡圖像第一百一十五頁(yè),共一百二十六頁(yè),2022年,8月28日?qǐng)D6-36轉(zhuǎn)換為直角坐標(biāo)系中的圖像第一百一十六頁(yè),共一百二十六頁(yè),2022年,8月28日有時(shí)機(jī)器人的魚眼透鏡拍

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論