朱式幸福

關於部落格
親子旅遊記錄
加一點點的心得感想
  • 60306

    累積人氣

  • 8

    今日人氣

    0

    訂閱人氣

Qt: 影像處理: 影像旋轉

 
有點難、又不會太難的旋轉
 講到旋轉一定要提到三角函數,
所以我們先來複習一下會用到的三角函數
對於一個直角三角形,三邊邊長分別為a, b, c,如下圖

sin(A) cos(A) 的定義分別為 b/c a/c
三角函數有許多公式,其中
sin(A+B) = sin(A)cos(B)+sin(B)cos(A),
cos(A+B) = cos(A)cos(B)-sin(A)sin(B)
是其中兩個常用的公式。


 


假設座標上有一個點P1,以原點為圓心,逆時針旋轉角度B,成為點P2

現在要利用P1的座標及角度B來求P2的座標。

P1至原點的距離為dP2至原點的距離當然也是d
P2X座標

x2 = dcos(A+B)
= d[cos(A)cos(B)-sin(A)sin(B)]
= d[(x1/d)cos(B) – (y1/d)sin(B)]
= x1cos(B)-y1sin(B)


Y
座標y2 = dsin(A+B)
= d[sin(A)cos(B)+sin(B)cos(A)]
= d[(y1/d)cos(B) + sin(B)(x1/d)]
= y1cos(B)+x1sin(B)

結論: 座標 (x, y) 逆時針旋轉 A 度後
座標變成 (xcos(A)-ysin(A), xsin(A)+ycos(A))

舉例: 座標(5, 1) 逆時針旋轉45度,求新座標?

 

以上是以原點作為圓心來旋轉
可是一般的作法是以影像的中心來旋轉
所以要先求出影像中心點的座標
一般影像的水平座標為 0..width-1
所以中點X軸座標為 x0 = (width-1)/2
同理,中點Y軸座標為 y0 =  (height-1)/2

接下來將影像中心點平移至原點
也就是將影像每個座標(x, y) 變成 (x-x0, y-y0)

接著,一般影像表示法,原點在左上角
越右邊,X的值越大; 越下面,Y的值越大
這種表示法與數學X-Y座標不太一樣
越右邊,X的值越大; 越下面,Y的值越小
Y軸表示法相反

所以影像的逆時針旋轉剛好在X-Y座標是順時針旋轉

另外一個問題是: 影像旋轉後,通常不是矩形了

 




從上圖可以看出
xmax = max{ x1', x2', x3', x4' }
ymax = max{ y1', y2', y3', y4' }
xmin = min{ x1', x2', x3', x4' }
ymin = min{ y1', y2', y3', y4' }
千萬不要以為 xmax 一定是 x3'
這必須取決於旋轉角度的多寡

對於旋轉後的影像點 (x, y) =( xmin .. xmax,  ymin..ymax)
反推回去(順時針旋轉)在原始影像的灰度值
若剛好落在格子點上, 就以該值作為旋轉後的灰度值
若落在非格子點上, 就要使用內插法來求推估了
反推回去的座標若落在原影像範圍內,才需要作去上的動作,
否則就判定它只是背景點,就把它設為白點。


結論
一、求影像的中心點
二、將影像四端點依中心點旋轉,求得新影像的四個端點
三對新影像的每個點,反旋轉再反平移求原座標
四、若原座標落在原影像範圍內,利用內插求影像值;反之將其設為背景值


---- 開始寫程式了---


36-37: 將文字框的度數轉換成弳度。
40-41:求影像中心點座標
43-51:求影像四端點座標,並依中心點位置平移
53-60:將四端點座標旋轉



62-65: 由旋轉後的四端點求新影像的四端點
67:依新的四端點計算新影像的長與寬,並建立新影像
71-72: 將新影像座標點反旋轉再反平移, 求原座標
73-75 若原座標落在原影像範圍外,設為白點
否則依最近鄰居法插補
78-79: 顯示新影像

執行結果



原影像


旋轉30度


旋轉45度


旋轉60度


旋轉190度

--- END ---

 




 

 

 
相簿設定
標籤設定
相簿狀態