学习资源《机器学习实践指南 案例应用解析》


原理

三维计算机图形学中的一种重要的变换是透视投影。与平行投影沿着平行线将物体投影到图像平面不同,透视投影是指从投影中心这一点发出的直线将物体投影到图像平面上。这就意味着距离投影中心越远的投影越小,距离越近的投影越大。
详细的定义可参考​​​百度百科​​。


透视投影实例

WarpPerspective

OpenCV提供了WarpPerspective函数,可对图像进行透视变换:

cv2.warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst

主要参数说明:

  • map_matrix: 3x3变换矩阵
  • flags:插值方法和以下开关选项的组合,有以下两种:
    – CV_WARP_FILL_OUTLIERS 填充所有缩小图像的像素。如果部分像素落在输入图像的边界外,那么它们的值设定为fillval。
    – CV_WARP_INVERSE_MAP:指定matrix是输出图像到输入图像的反变换,因此可以直接用来做像素插值。否则,函数从map_matrix得到反变换。
  • fillval:用来填充边界外面的值。

GetPerspectiveTransform

以四边形的4个点计算透射变换:

cv2.getPerspectiveTransform(src,dst) -> retval
  • src:输入IDR的四边形顶点坐标
  • dst:输出的相应的四边形顶点坐标

透视变换矩阵计算实例

# -*- coding: utf-8 -*-
import cv2
import numpy as np
fn="test.jpg"
img = cv2.imread(fn)
cv2.imshow('source', img)
w=img.shape[1]
h=img.shape[0]

# 得到透射变换矩阵
src = np.array([[0,0],[w-1,0],[w-1,h-1],[0,h-1]],dtype = np.float32)
dst = np.array([[w*0.08,h*0.01],[w*0.8,h*0.25],[w*0.8,h*0.9],[w*0.05,h*0.8]],dtype = np.float32)
transform_matrix = cv2.getPerspectiveTransform(src,dst)
print(transform_matrix)

# 透射变换完成变形
newimg = cv2.warpPerspective(img,transform_matrix,(w,h))
cv2.imshow('preview',newimg)
cv2.waitKey()
cv2.destroyAllWindows()

结果:
图像基础12 透视投影与透视变换_机器学习