顯示具有 rotation 標籤的文章。 顯示所有文章
顯示具有 rotation 標籤的文章。 顯示所有文章

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];
 

2009年10月9日 星期五

Week 04: 影像如何旋轉? (1)



課堂討論主題:
1. 影像旋轉的演算法
 a. 什麼是演算法?
 b. 要解決的問題是什麼?
 c. 影像旋轉演算法的輸入是什麼?
 d. 影像旋轉演算法的輸出是什麼?
 e. 維基百科上的 旋轉 條目
 
本課程第二個作業: 影像旋轉