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