仿射變換與透視變換的區別和共同點

1.仿射變換和透視變換都是一種線性變換, 仿射變換可以看做是透視變換的一種特例.變換矩陣爲:

Transformation matrix

其中

 

Linear transformation matrix

是一個旋轉矩陣。此矩陣定義將要執行的變換的類型:縮放,旋轉等。

 

翻譯矢量

是平移參數。它只是移動點。

 

投影向量

爲透視參數, 如果是單應變換, 這兩個參數爲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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章