王力濤 莊春曉 王秋成
摘 要:數(shù)字圖像處理是攝影測量的基礎(chǔ),圖像幾何變換是圖像處理最基本的內(nèi)容。文章就利用VC編程實(shí)現(xiàn)圖像的平移、旋轉(zhuǎn)、縮放的原理、算法和實(shí)現(xiàn)過程進(jìn)行詳細(xì)論述。
關(guān)鍵詞:VC;數(shù)字圖像;平移;旋轉(zhuǎn);縮放
前言
攝影測量與遙感所獲取數(shù)字影像,尤其是近景攝影測量采用非量測相機(jī)獲取的影像,不能直接應(yīng)用于測量,首先需要經(jīng)過圖像處理,形成滿足測量要求的圖像。
圖像幾何變換是圖像處理的基礎(chǔ)。經(jīng)過幾何變換,使圖像易于處理,有利于特征提取和對(duì)圖像信息的理解。
1 原理介紹
1.1 圖像平移
平移是指將圖像中所有的點(diǎn)都按照指定的平移量水平、垂直移動(dòng)。設(shè)(x0,y0)為原圖像上的一點(diǎn),圖像水平平移量tx,垂直平移量為ty,則平移后點(diǎn)(x0,y0)的坐標(biāo)變?yōu)椋▁1,y1)。
(x0,y0)與(x1,y1)之間的關(guān)系為:x1=x0+tx;y1=y0+ty。
平移后圖像上的一點(diǎn)是由原圖像上某點(diǎn)經(jīng)過平移得到的,因此平移后圖像中每個(gè)像素的顏色是由原圖像中對(duì)應(yīng)像素顏色確定的。如新圖中的(0,0)點(diǎn)的顏色和其在原圖中的對(duì)應(yīng)點(diǎn)(-tx,-ty)處的一樣。
1.2 圖像旋轉(zhuǎn)
圖像旋轉(zhuǎn)通常是以圖像的中心為圓心,按順時(shí)針方向旋轉(zhuǎn)。
設(shè)旋轉(zhuǎn)前一點(diǎn)坐標(biāo)(x0,y0),旋轉(zhuǎn)a 角度后對(duì)應(yīng)點(diǎn)坐標(biāo)(x1,y1),則以矩陣的形式表示:
1.3 圖像縮放
假設(shè)放大因子為ratio,縮放的變換矩陣為:
由于放大圖象時(shí)產(chǎn)生了新的象素,縮小時(shí)合并了像素,變換后圖像上點(diǎn)與原圖點(diǎn)不存在一一對(duì)應(yīng)的關(guān)系,所以采用的做法是找與之最臨近的點(diǎn)。
2 算法設(shè)計(jì)
2.1 圖像平移
圖像幾何變換都是基于像素處理的。
首先打開原始圖像,獲取圖像信息。
第二步設(shè)置水平平移量和垂直平移量。根據(jù)平移量和原圖像高度寬度,計(jì)算平移后圖像的寬度和高度:
NWidth=lWidth+(long)fXMove;NHeight=lHeight+(long)fYMove。
第三步采用行列循環(huán)方式,計(jì)算新圖像中每個(gè)像素對(duì)應(yīng)于原圖像的像素,將原圖像的像素灰度值或RGB顏色值賦值給新圖像的像素。對(duì)于原圖像中沒有的對(duì)應(yīng)點(diǎn)的像素,將其灰度值設(shè)為0(白色)。
2.2 圖像旋轉(zhuǎn)
首先打開原始圖像,獲取圖像信息,包括圖像的高度、寬度、調(diào)色板或者RGB值等信息。
第二步因?yàn)閳D像旋轉(zhuǎn)采用以圖像中心為原點(diǎn)的坐標(biāo)系,因此首先進(jìn)行坐標(biāo)轉(zhuǎn)換,計(jì)算原圖四角點(diǎn)在以圖像中心為原點(diǎn)的旋轉(zhuǎn)坐標(biāo)系中的坐標(biāo),并根據(jù)旋轉(zhuǎn)角度計(jì)算旋轉(zhuǎn)后圖像四角坐標(biāo),利用旋轉(zhuǎn)后圖像四角點(diǎn)計(jì)算新圖像高和寬。
第三步采用行列循環(huán)方式,計(jì)算新圖像中每個(gè)像素對(duì)應(yīng)于原圖像的像素,將原圖像的像素灰度值或RGB顏色值賦值給新圖像的像素。對(duì)于原圖像中沒有的對(duì)應(yīng)點(diǎn)的像素,將其灰度值設(shè)為0(白色)。
2.3 圖像縮放
首先打開原始圖像,獲取圖像信息,包括圖像的高度、寬度、調(diào)色板或者RGB值等信息。
第二步設(shè)置縮放參數(shù),并根據(jù)原圖像寬、高計(jì)算經(jīng)過縮放后的圖像的寬、高。
第三步采用行列循環(huán)方式,計(jì)算新圖像中每個(gè)像素對(duì)應(yīng)于原圖像的像素,將原圖像的像素灰度值或RGB顏色值賦值給新圖像的像素。對(duì)于原圖像中沒有的對(duì)應(yīng)點(diǎn)的像素,將其灰度值設(shè)為0(白色)。算法與平移和旋轉(zhuǎn)類似,在此不在詳述。
3 實(shí)現(xiàn)方法與過程
(1)創(chuàng)建一個(gè)MFC多文檔工程,并設(shè)置滾動(dòng)視圖模式。
(2)在Doc類中聲明一個(gè)HDIB類型的的成員變量m_hDIB,并利用ClassWind類向?qū)镈oc類添加OnOpenDocument和OnSaveDocument兩個(gè)函數(shù),添加代碼,調(diào)用DIB.dll中封裝好的open和save函數(shù),在OnDraw函數(shù)中調(diào)用Draw(pDC,pDoc->m_hDIB),實(shí)現(xiàn)圖像讀取和保存功能。
(3)添加菜單“平移”“旋轉(zhuǎn)”“縮放”,并為菜單添加相應(yīng)的對(duì)話框資源,用以設(shè)置相關(guān)參數(shù)。利用ClassWind類向?qū)楦鱾€(gè)菜單添加消息處理函數(shù),為每個(gè)對(duì)話框添加對(duì)話框類。
(4)在對(duì)話框類中添加相應(yīng)參數(shù)變量并初始化。為每個(gè)菜單消息處理函數(shù)編寫函數(shù)體,使之實(shí)現(xiàn)相應(yīng)功能。
參考文獻(xiàn)
[1]孫家柄.遙感原理與應(yīng)用[M].武漢:武漢大學(xué)出版社,2006.
[2]王育堅(jiān).Visual C++面向?qū)ο缶幊探坛蘙M].北京:清華大學(xué)出版,2006.
[3]賈永紅.數(shù)字圖像處理[M].武漢:武漢大學(xué)出版社,2004.
[4]呂鳳軍.數(shù)字圖像處理編程入門[M].北京:清華大學(xué)出版社,1999.