opencv学习-几何变换

仿射变换

平移

(1)(x^y^1)=(10tx01ty001)(xy1)\begin{pmatrix} \hat{x} \\ \hat{y} \\ 1\end{pmatrix}=\begin{pmatrix}1&0&t_x\\0&1&t_y\\0&0&1\end{pmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}\tag{1}⎝⎛​x^y^​1​⎠⎞​=⎝⎛​100​010​tx​ty​1​⎠⎞​⎝⎛​xy1​⎠⎞​(1)
tx&gt;0t_x&gt;0tx​>0,向x轴正方向移动;若tx&lt;0t_x&lt;0tx​<0,向x轴负方向移动。

放大和缩小

  • (x,y)(x,y)(x,y)以(0,0)为中心缩放变换后的坐标为(x^,y^)(\hat{x},\hat{y})(x^,y^​),则(x^,y^)=(sxx,xyy)(\hat{x},\hat{y})=(s_x*x,x_y*y)(x^,y^​)=(sx​∗x,xy​∗y).
    通常令sx=sys_x=s_ysx​=sy​,即等比例缩放。
    (2)(x^y^1)=(sx000sy0001)(xy1)\begin{pmatrix} \hat{x} \\ \hat{y} \\ 1\end{pmatrix}=\begin{pmatrix}s_x&amp;0&amp;0\\0&amp;s_y&amp;0\\0&amp;0&amp;1\end{pmatrix}\begin{pmatrix}x\\y\\1\end{pmatrix}\tag{2}⎝⎛​x^y^​1​⎠⎞​=⎝⎛​sx​00​0sy​0​001​⎠⎞​⎝⎛​xy1​⎠⎞​(2)
  • 若以任意一点(x0,y0)(x_0,y_0)(x0​,y0​),则(x^,y^)=(x0+sx(xx0),y0+sy(yy0))(\hat{x},\hat{y})=(x_0+s_x(x-x_0),y_0+s_y(y-y_0))(x^,y^​)=(x0​+sx​(x−x0​),y0​+sy​(y−y0​)).
    (3)(x^y^1)=(10x001y0001)(sx000sy0001)(10x001y0001)(xy1)\begin{pmatrix} \hat{x} \\ \hat{y} \\ 1\end{pmatrix}=\begin{pmatrix}1&amp;0&amp;x_0\\0&amp;1&amp;y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}s_x&amp;0&amp;0\\0&amp;s_y&amp;0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}1&amp;0&amp;-x_0\\0&amp;1&amp;-y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}x\\y\\1\end{pmatrix}\tag{3}⎝⎛​x^y^​1​⎠⎞​=⎝⎛​100​010​x0​y0​1​⎠⎞​⎝⎛​sx​00​0sy​0​001​⎠⎞​⎝⎛​100​010​−x0​−y0​1​⎠⎞​⎝⎛​xy1​⎠⎞​(3)
    平移矩阵和缩放矩阵相乘

旋转

逆时针旋转α\alphaα
(4)(x^y^1)=(10x001y0001)(cosαsinα0sinαcosα0001)(10x001y0001)(xy1)\begin{pmatrix} \hat{x} \\ \hat{y}\\1\end{pmatrix}=\begin{pmatrix}1&amp;0&amp;x_0\\0&amp;1&amp;y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}cos\alpha&amp;sin\alpha&amp;0\\-sin\alpha&amp;cos\alpha&amp;0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}1&amp;0&amp;-x_0\\0&amp;1&amp;-y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}x\\y\\1\end{pmatrix}\tag{4}⎝⎛​x^y^​1​⎠⎞​=⎝⎛​100​010​x0​y0​1​⎠⎞​⎝⎛​cosα−sinα0​sinαcosα0​001​⎠⎞​⎝⎛​100​010​−x0​−y0​1​⎠⎞​⎝⎛​xy1​⎠⎞​(4)
顺时针旋转α\alphaα
(5)(x^y^1)=(10x001y0001)(cosαsinα0sinαcosα0001)(10x001y0001)(xy1)\begin{pmatrix} \hat{x} \\ \hat{y}\\1\end{pmatrix}=\begin{pmatrix}1&amp;0&amp;x_0\\0&amp;1&amp;y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}cos\alpha&amp;-sin\alpha&amp;0\\sin\alpha&amp;cos\alpha&amp;0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}1&amp;0&amp;-x_0\\0&amp;1&amp;-y_0\\0&amp;0&amp;1\end{pmatrix} \begin{pmatrix}x\\y\\1\end{pmatrix}\tag{5}⎝⎛​x^y^​1​⎠⎞​=⎝⎛​100​010​x0​y0​1​⎠⎞​⎝⎛​cosαsinα0​−sinαcosα0​001​⎠⎞​⎝⎛​100​010​−x0​−y0​1​⎠⎞​⎝⎛​xy1​⎠⎞​(5)

计算仿射矩阵A

  • 方程法
    cv2.getAffineTransform(src,dst)
import cv2
import numpy as np
src = np.array([[0,0],[200,0],[0,200]],np.float32);
dst = np.array([[0,0],[100,0],[0,100]],np.float32);
A = cv2.getAffineTransform(src,dst)
  • 矩阵法
    先平移后缩放
import numpy as np
s = np.array([[0.5,0,0],[0,0.5,0],[0,0,1]]); #缩放矩阵
t = np.array([[1,0,100],[0,1,200],[0,0,1]]); #平移矩阵
A=np.dot(t,s)
  • 对于等比例缩放和旋转
    cv2.getRotationMatrix2D(center,angle,scale)
    center 为变换中心的坐标 ,scale为等比例缩放的系数 ,angle为逆时针旋转的角度
    如:以(40,50)为中心逆时针旋转30度,缩小0.5倍
import cv2
A=cv2.getRotationMatrix2D((40,50),30,0.5)
上一篇:java对象的序列化与反序列化


下一篇:opencv学习 - 图像平滑