2009年10月16日星期五

Week 05: 影像如何旋轉? (2)

1. 兩角和與差的三角函数公式

 sin(θ1+θ2) = sinθ1 cosθ2 + cosθ1 sinθ2
 sin(θ1-θ2) = sinθ1 cosθ2 - cosθ1 sinθ2
 cos(θ1+θ2) = cosθ1 cosθ2 - sinθ1 sinθ2
 cos(θ1-θ2) = cosθ1 cosθ2 + sinθ1 sinθ2

 要推導出旋轉座標轉換公式, 必須用到上述的公式。

2. 影像旋轉演算法
 輸入: 原始影像 imOriginal[][]
 輸出: 旋轉後影像 imRotation[][]

 a. 根據原始影像的大小(高與寬), 計算旋轉後影像的大小。
  以對角線長度當作旋轉後影像之大小。
  int iImageHeight; //原始影像的高
  int iImageWidth; //原始影像的寬
  int iImageDiagonal; //原始影像的對角長度, 旋轉後影像的高與寬
  iImageDiagonal = ceil(sqrt(iImageHeight*iImageHeight+iImageWidth+iImageWidth));

 b. 動態宣告大小為 iImageDiagonal * iImageDiagonal 的二維陣列
 
 c. 計算兩張影像的旋轉中心之座標
  int iOriginalCenterI,iOriginalCenterJ;
  int iRotationalCenterI,iRotationalCenterJ;

  iOriginalCenterI = iImageHeight / 2;
  iOriginalCenterJ = iImageWidth / 2;

 d. 針對旋轉後影像的每一個像素的座標, 分別計算原始影像的對應像素之座標
  int iNewI, iNewsJ; //旋轉後影像, 像素 (i, j) 相對於旋轉中心的座標
  iNewJ = j - iNewOriginX;
  iNewI = i - iNewOriginY;
  
  // 使用旋轉公式, 計算出旋轉前的相對座標
  iOldJ = iNewI * dCosAngle - iNewJ * dSinAngle;
  iOldI = iNewI * dSinAngle + iNewJ * dCosAngle;

  // 還原出影像陣列的座標
  iOldJ = iOldJ + iOldOriginY;
  iOldI = iOldI + iOldOriginX;
 
  // 開始搬移影像內容 
  ucRotationalMatrixR[i][j] = ucMatrixR[iOldI][iOldJ];
  ucRotationalMatrixG[i][j] = ucMatrixG[iOldI][iOldJ];
  ucRotationalMatrixB[i][j] = ucMatrixB[iOldI][iOldJ];
 

沒有留言:

張貼留言