本週我們要討論的主題是 § 2-6 簡介用於數位影像處理的數學工具, 這些數學工具真的很好用, 我們下學期的 互動視訊遊戲製作 這門課, 就會用到這些工具來撰寫程式。
第三個作業: 請完成類似 Photoshop 或 PhotoImpact 的 Histogram 顯示功能。
2009年10月30日 星期五
2009年10月23日 星期五
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];
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日 星期五
訂閱:
文章 (Atom)