旋转是图像处理的常用技巧。今天介绍一下旋转,平移以及尺度放缩的基本原理。
点的旋转
给定一个点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