作業題目 :
利用nearest 和 bilinear兩人種演算法實做image 的 scale 和image rotate 的implement
使用ide:vs2013
語言:c++.net
實做時間:約8小時
語言:c++.net
實做時間:約8小時
=========================================================
點選file->open
選擇Lena.bmp 點選確認
預設為nearest
=========================================================
敘述演算法實做:
Nearnest:
由於不會剛好對準某一點,所以這個演算法是找最接近的某一點, 我使用的方法是用
x=(int)x+0.5
y=(int) y+0.5
時間複雜度為O(n^2)
方法簡單 但是不準確 放大看可以發現邊邊上有小鋸齒狀態
Bilinear:
跟上面一種演算法相同
不過這次對應到的點 取四周最靠近的4個點做內插,得到的圖較第一種準確
時間複雜度為O(16n^2)
高中數學都有學過旋轉的公式為
X'=X *COSQ - Y*SINQ
Y'=X*SINQ+ Y*COSQ
但是如果用這個方法算過去的話 ,因為會對應到非整數的部分,所以會讓圖錯誤
所以要逆向操作
利用反矩陣的概念我們可以用新的座標推得舊的座標
即
X= X' *COSQ +Y'*SINQ
X= X' *COSQ +Y'*SINQ
Y= X'*(-SINQ) +Y'*COSQ
如此就可以得知原本的座標
有一個重要的地方
我剛開始在寫兩層for迴圈時用x=0 ,y=0開始算
把旋轉的軸心放在了(0,0)的位置了 造成debug的困難
就這個例子 應該吧旋轉軸心放在圖的中心點 我設定為
Width/2 和height/2的位置 ,用此點旋轉才可以得到正確的圖
這裡mapping 回去使用NN的方式
這裡mapping 回去使用NN的方式
=========================================================
Conclusion:
學習了.net視窗使用和pixel處理的概念
學習使用nearest 和Bilinear演算法的概念與實做上的問題
學習到圖片旋轉和軸心的處理問題
複習反矩陣的運算和cos sin ,徑度和角度轉換的使用
NN寫法相對比較快速,但準確較低
Bilinear寫法相對較慢,但準確率較高
NN寫法相對比較快速,但準確較低
Bilinear寫法相對較慢,但準確率較高
沒有留言:
張貼留言