旋轉是圖像處理的常用技巧。今天介紹一下旋轉,平移以及尺度放縮的基本原理。
點的旋轉
給定一個點P(x,y),以及一個角度θ,求逆時針旋轉θ之後新的點座標P′的位置。
我們用極座標表示P
x=Rcosϕ
y=Rsinϕ
逆時針旋轉theta之後,
x′=Rcos(θ+ϕ);y′=Rsin(θ+ϕ)
把cos和sin拆開。
x′=R(cosθcosϕ−sinθsinϕ)=xcosθ−ysinθ
y′=R(sinθcosϕ+cosθsinϕ)=xsinθ+ycosθ
然後寫成矩陣形式
[x′y′]=[cosθsinθ−sinθcosθ][xy]
齊次座標
圖像的仿射變換是要在齊次座標系下進行的。齊次座標能把旋轉,縮放以及平移都用相同大小的矩陣表示,而且他們的組合是線性且可逆的。
範式如下:
[x′,y′,1]T=A[x,y,1]T
-
旋轉矩陣
A=⎣⎡cosθsinθ0−sinθcosθ0001⎦⎤
-
平移矩陣
A=⎣⎡100010txty1⎦⎤
-
縮放矩陣
A=⎣⎡sx000sy0001⎦⎤
使用這些矩陣,我們就能獲得每個座標在仿射變換之後的位置。
如果我們想讓一張圖片圍繞中心旋轉。我們應該把中心點移到原點座標上,然後旋轉,然後在平移回去。
OpenCV中的仿射API
- cv2.getRotationMatrix2D(center, angle, scale)
- cv2.warpAffine(image, A, (width, height))
第一個函數用來獲得仿射矩陣。你可以設置這個三個自由度。angle用角度值(不是弧度制)
第二個函數是做仿射變換。其中A就是仿射矩陣。
另外numpy中有角度轉弧度的函數 np.radians 以及弧度轉角度的函數 np.rad2deg