仿射变换与透视变换的区别和共同点

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/

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