實作圖像縮放有3種演算法:
(1) Nearest Neighbor Interpolation 最近相鄰內插法
(2) Bilinear Interpolation 雙線性內插法
(3) Bicubic Interpolation 雙立方內插法
Nearest Neighbor Interpolation 最近相鄰內插法
計算出縮放後的點的位置,選擇離他最近的點,去代表他的值。
Bilinear Interpolation 雙線性內插法
先利用tx、c01、c11算出b,b=(1-tx)*c11+(tx)*c01
再利用tx、c00、c10算出a,a=(1-tx)*c10+(tx)*c00
利用a、b,算出最後的值,c=a*(1-ty)+b*(ty)
c代表縮放後的點的值。
(3) Bicubic Interpolation 雙立方內插法
取鄰近16個點,藉由這些點算出縮放後點的值。

F = p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])))
16個點p[4][4],與鄰近的點的差為a與b,先將p[0]到p[4]個別的四個點與a利用上面的公式算出4個新的值q[4],再用q[4]與b利用上面公式算出最後的值。
最後的值代表縮放後點的值。
圖像的旋轉
將(x0,y0)轉到(x1,y1),使用乘以一個matrix的方式。

ratation matrix
x1= x0 * cos(theta) - y0 * sin(theta)
y1= x0 * sin(theta) + y0 * cos(theta)
則造成aliasing現象,因為不是每個x1,y1都能對應到x0,y0。

所以使用inverse rotation matrix
x0 = x1 * cos(theta) + y1 * sin(theta)
y0 = -x1 * sin (theta) + y1 * cos(theta)
便可正確旋轉圖形。參考資料:
http://www.scratchapixel.com/lessons/3d-advanced-lessons/interpolation/bilinear-interpolation/
http://wiki.blender.org/index.php/User:Damiles
http://www.paulinternet.nl/?page=bicubic (bicubic interpolation詳細算法)
http://jakie720313.pixnet.net/blog/post/98462356-%E6%9C%80%E8%BF%91%E7%9B%B8%E9%84%B0%E5%85%A7%E6%8F%92%E6%B3%95(nearest-neighbor-interpolation)
圖形旋轉:
http://www.datagenetics.com/blog/august32013/index.html
http://edisonx.pixnet.net/blog/post/91099352-%5Bimage%5D-%E5%BD%B1%E5%83%8F%E8%99%95%E7%90%86%E5%B8%B8%E8%A6%8B%E5%B9%BE%E4%BD%95%E9%81%8B%E7%AE%97
沒有留言:
張貼留言