數字圖像處理編成入門——第二章圖象的幾何變換

2.1 平移

初始座標爲(x0,y0)的點經過平移(tx,ty)(以向右,向下爲正方向)後,座標變爲(x1,y1)。這兩點之間的關係是x1=x0+tx y1=y0+ty

其矩陣表示爲:

 

 

其逆矩陣表示爲:

 

逆運算在計算平移後的RGB值有幫助。通過結果點,利用逆運算計算原點RGB值。

 

1.    灰度圖是指只含亮度信息,不含色彩信息的圖象,就象我們平時看到的黑白照片:亮度由暗到明,變化是連續的。可以通過RGB各項都相同的256色調色板來表示,例如:(000)是全黑色,(255255255)是全白色,中間的是灰色。

2.    YUV——Y分量的物理含義就是亮度,UV分量代表了色差信號。這種表示方法有兩個優點:1Y分量包含所有亮度信息,只用Y分量就能完全能夠表示出一幅灰度圖來。當同時考慮UV分量時,就能夠表示出彩色信息來。可以方便的實現灰度和彩色圖之間切換2)在對圖像壓縮時,可以着重考慮Y分量的值。

 

平移的算法實現:

1.    創建對話框,獲取偏移量值:xOffsetyOffset

2.    計算新圖像所需的緩衝區大小並分配局部內存空間。

3.    定義兩個指針lpImgDatalpTempImgData分別指向原和新文件的內存。

4.    初始化lpTempImgData指向的緩衝區。

5.    計算平移前和平移後最左上角和最右下角的座標,從而得出平移後的圖像高。

6.    找出平移前和平移後圖像數據最左邊的地址(見下面的代碼提示,這個表達式想蠻久纔想通的,爲了怕以後忘記,還自己做了個flash,不錯!學了flash第一次做出自己東西的感覺真好!),按行進行復制。

lpPtr=(char*)lpImgData+(BufSize-LineBytes-(i+SrcY0)*LineBytes)+SrcX0;

lpTempPtr=(char*)lpTempImgData+(BufSize-LineBytes-(i+DstY0)*LineBytes)+DstX0;

1.    釋放原來的位圖句柄

2.    產生新的位圖,將平移後的圖象存成文件,釋放資源和內存。

 

bmp圖像數據存儲順序是從下至上,從左至右。

 

 

 

 

1.2 旋轉

1.定義  旋轉通常是以中心爲原點進行,這裏討論旋轉後圖像擴大的情況。將一個點順時針旋轉a角後的座標變換公式,如圖2.10所示,r爲該點到原點的距離,在旋轉過程中,r保持不變;brx軸之間的夾角。

 

2.10   旋轉示意圖

旋轉前:x0=rcosby0=rsinb

旋轉a角度後:

x1=rcos(b-a)=rcosbcosa+rsinbsina=x0cosa+y0sina

y1=rsin(b-a)=rsinbcosa-rcosbsina=-x0sina+y0cosa

 

2.      座標系轉換:以左上角爲原點座標系 和以中心點爲原點座標系 之間的轉換矩陣爲:其中設圖象的寬爲w,高爲h

 

 

3.      變換步驟:

1)將座標系o’變成o

2)將該點順時針旋轉a角;

3)將座標系o變回o’,這樣,我們就得到了變換矩陣,是上面三個矩陣的級聯。

逆變換爲

 

 

1.3 鏡象

鏡象(mirror)分水平鏡象和垂直鏡象兩種。設原圖寬爲w,高爲h,變換後,圖的寬和高不變。

水平鏡象的變化矩陣爲:

 

垂直鏡象的變化矩陣爲:

 

2.4 轉置

  轉置(transpose)是指將xy座標對換,轉置後圖的寬高對換了。

 

2.5  縮放

  假設放大因子爲ratio(爲了避免新圖過大或過小,我們在程序中限制0.25ratio4)

  第二章終於結束了,雖然沒有代碼實現,但看了書上的代碼,都能看懂!希望快點能找到顯示位圖的代碼錯誤,這樣我纔可以實現接下來的代碼嘛!也怪自己,太要面子了,不會可以問咯!就是死要面子,不過這樣也好,別人告訴我的,終究不如自己發現的。現在在看《深入淺出MFC》,講機制原理性的比較多,要的就是這方面的。加油~ 誓要把那個錯誤揪出來... ...

 已解決:Q1:執行結果,只對圖片的左半邊作用?

A1:原來是圖片的問題,我原來用的是QQ截圖產生的BMP圖片,後來無意中嘗試轉爲256色圖,後來就可以用了。幾何變換沒有問題了。不過還不知道QQ截圖到底爲什麼不行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章