天天看點

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)      

繼續閱讀