1.仿射變換和透視變換都是一種線性變換, 仿射變換可以看做是透視變換的一種特例.變換矩陣爲:
其中
是一個旋轉矩陣。此矩陣定義將要執行的變換的類型:縮放,旋轉等。
是平移參數。它只是移動點。
爲透視參數, 如果是單應變換, 這兩個參數爲0
變換公式爲:
透視變換表明當觀察者的觀察點發生變化時物體的透視變換。此轉換允許造成透視形變。
仿射變換用於縮放,傾斜和旋轉。
由此可以看出兩者的區別:
矩陣上, 參數量,一個爲8, 一個爲6(c1, c2)爲0, 導致兩者不同的屬性
- 透視變換不保持平行性,長度以及角度。但它仍然保留了共線性和發生率。
- 由於仿射變換是投影變換的特例,它所以具有相同的屬性。然而,與投影變換不同,它保留了平行性。
投影變換可以表示爲任意四邊形(即四點系統)到另一個四邊形的變換。仿射變換是三角形的變換。由於矩陣的最後一行爲零,因此三個點就足夠了。下圖說明了差異。
參考: https://www.graphicsmill.com/docs/gm5/Transformations.htm
2.函數實現:
img = cv2.imread('dog.jpg')
rows,cols,_ = img.shape
points1 = np.float32([[50,50],[200,50],[50,200]])
points2 = np.float32([[10,100],[200,50],[100,250]])
matrix = cv2.getAffineTransform(points1,points2)
output = cv2.warpAffine(img,matrix,(cols,rows))
cv2.imshow('input',img)
cv2.imshow('output',output)
##################### 對圖像進行變換(四點得到一個變換矩陣)
# 進行透視變換
# 可以先用四個點來確定一個3*3的變換矩陣(cv2.getPerspectiveTransform)
# 然後通過cv2.warpPerspective和上述矩陣對圖像進行變換
img = cv2.imread('cat.jpg')
rows,cols,_ = img.shape
points1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
points2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
matrix = cv2.getPerspectiveTransform(points1,points2)
# 將四個點組成的平面轉換成另四個點組成的一個平面
output = cv2.warpPerspective(img, matrix, (cols, rows))
# 通過warpPerspective函數來進行變換
參考:https://blog.csdn.net/qq_27261889/article/details/80720359
3. 關於單應變換和透視變換
單應變換 對應homo矩陣, 表明一個平面到另一個平面的映射關係
單應變換推導:https://www.cnblogs.com/ml-cv/p/5871052.html
# Calculate Homography
h, status
=
cv2.findHomography(pts_src, pts_dst)
# Warp source image to destination based on homography
im_out
=
cv2.warpPerspective(im_src, h, (im_dst.shape[
1
],im_dst.shape[
0
]))
https://www.learnopencv.com/homography-examples-using-opencv-python-c/