天天看点

OpenCV(python)从入门到精通——仿射变换

  • 可以理解一下常规的翻转和平移。“线性变换”+“平移”
  • 空间变换中的仿射变换对应着五种变换,平移,缩放,旋转,翻转,错切。而这五种变化由原图像转变到变换图像的过程,可以用仿射变换矩阵进行描述。而这个变换过程可以用一个3*3的矩阵与原图进行相乘得到。
  • 仿射变换(Affine Transformation)其实是另外两种简单变换的叠加:一个是线性变换,一个是平移变换
  • 共线性:若几个点变换前在一条线上,则仿射变换后仍然在一条线上
  • 共线比例不变性:变换前一条线上两条线段的比例,在变换后比例不变
  • 平行性:若两条线变换前平行,则变换后仍然平行。

矩阵显示

OpenCV(python)从入门到精通——仿射变换

具体公式(可以看成线性变换R和平移变换T的叠加):

其中变换量,角度经过变换后具体的公式为:

仿射变换基本公式:

平移变换矩阵为:

其中控制平移的参数,向上向下平移参数

反射变换

控制矩阵的正负可以按照对应的坐标轴进行变换。具体如上图。

仿射变换,变化

import cv2
import numpy as np

src = cv2.imread("./images/1.jpg")

rows,cols,channel = src.shape


M = np.float32([[1,0,50],[0,1,50]])

# M = cv2.getRotationMatrix2D((cols/2,rows/2),angle=45,scale=0.7)
dst = cv2.warpAffine(src,M=M,dsize=(cols,rows))
cv2.imshow("src",src)

cv2.imshow("dst",dst)
cv2.waitKey(0)      
OpenCV(python)从入门到精通——仿射变换
  • 示例2:
import cv2
import numpy as np

src = cv2.imread("./images/1.jpg")

rows,cols,channel = src.shape


# M = np.float32([[0.5,0,0],[0,0.5,0]])
# M = np.float32([[0.5,0,0],[0,0.5,0]])
M = np.float32([[-0.5,0,cols//2],[0,0.5,0]])

# M = cv2.getRotationMatrix2D((cols/2,rows/2),angle=45,scale=0.7)
dst = cv2.warpAffine(src,M=M,dsize=(cols,rows))
cv2.imshow("src",src)

cv2.imshow("dst",dst)
cv2.waitKey(0)      
OpenCV(python)从入门到精通——仿射变换
import cv2
import numpy as np
src = cv2.imread("./images/1.jpg")
rows,cols,channel = src.shape
# M = np.float32([[0.5,0,0],[0,0.5,0]])
# M = np.float32([[0.5,0,0],[0,0.5,0]])
# M = np.float32([[-0.5,0,cols//2],[0,0.5,0]])
M = np.float32([[1,0.5,0],[0,1,0]])

# M = cv2.getRotationMatrix2D((cols/2,rows/2),angle=45,scale=0.7)
dst = cv2.warpAffine(src,M=M,dsize=(cols,rows))
cv2.imshow("src",src)
cv2.imshow("dst",dst)
cv2.waitKey(0)      
import cv2
import numpy as np

src = cv2.imread("./images/1.jpg")

rows,cols,channel = src.shape


# M = np.float32([[0.5,0,0],[0,0.5,0]])
# M = np.float32([[0.5,0,0],[0,0.5,0]])
# M = np.float32([[-0.5,0,cols//2],[0,0.5,0]])

# M = np.float32([[1,0.5,0],[0.5,1,0]])

M = cv2.getRotationMatrix2D((cols/2,rows/2),angle=45,scale=0.7)

dst = cv2.warpAffine(src,M=M,dsize=(cols,rows))
cv2.imshow("src",src)

cv2.imshow("dst",dst)
cv2.waitKey(0)      

继续阅读