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];
沒有留言:
張貼留言