opencv官方文档:https://docs.opencv.org/3.4.1/da/d6e/tutorial_py_geometric_transformations.html
可以指定缩放系数,也可以手动指定缩放大小。使用不同的插值方法。优选的插值方法是cv2.INTER_AREA、cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下,使用的插值方法是cv2.INTER_LINEAR,用于所有调整大小的目的。
import cv2
import numpy as np
img = cv2.imread('messi5.jpg')
# 按比例缩放
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
# 按具体宽高进行缩放
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
import cv2
import numpy as np
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
# 绕中心点,无缩放逆时针旋转90度
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了二维图形的“平直性”(直线经过变换之后依然是直线)和“平行性”(二维图形之间的相对位置关系保持不变,平行线依然是平行线,且直线上点的位置顺序不变)。任意的仿射变换都能表示为乘以一个矩阵(线性变换),再加上一个向量 (平移) 的形式。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
import cv2
import numpy as np
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
point = np.matrix(M)*np.matrix([50, 200, 1]).T # [[100.][250.]]
x = new_point[0]
y = new_point[0]
print(x, y) # [[100.]] [[250.]]
透视变换是将图片投影到一个新的视平面,也称作投影映射。它是二维(x,y)到三维(X,Y,Z),再到另一个二维(x’,y’)空间的映射。相对于仿射变换,它提供了更大的灵活性,将一个四边形区域映射到另一个四边形区域(不一定是平行四边形)。它不止是线性变换.但也是通过矩阵乘法实现的,使用的是一个3x3的矩阵,矩阵的前两行与仿射矩阵相同(m11,m12,m13,m21,m22,m23),也实现了线性变换和平移,第三行用于实现透视变换;
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('sudoku.png')
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
import cv2
import numpy as np
pts1 = np.float32([[0, 0], [10, 0], [0, 5], [10, 5]])
pts2 = np.float32([[0, 0], [10, 1], [0, 5], [10, 4]])
M = cv2.getPerspectiveTransform(pts1, pts2)
tx, ty, tz = np.matrix(M)*np.matrix([10, 0, 1]).T
x = tx/tz
y = ty/tz
print(x, y) # [[10.]] [[1.]]