- 可以了解一下正常的翻轉和平移。“線性變換”+“平移”
- 空間變換中的仿射變換對應着五種變換,平移,縮放,旋轉,翻轉,錯切。而這五種變化由原圖像轉變到變換圖像的過程,可以用仿射變換矩陣進行描述。而這個變換過程可以用一個3*3的矩陣與原圖進行相乘得到。
- 仿射變換(Affine Transformation)其實是另外兩種簡單變換的疊加:一個是線性變換,一個是平移變換
- 共線性:若幾個點變換前在一條線上,則仿射變換後仍然在一條線上
- 共線比例不變性:變換前一條線上兩條線段的比例,在變換後比例不變
- 平行性:若兩條線變換前平行,則變換後仍然平行。
矩陣顯示
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM2UDN4gTO1YmMlBzYkBjNzYzX0UjM0YTMxAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
具體公式(可以看成線性變換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)
- 示例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)
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)