变换
opencv 提供了两个转换函数,cv2.warpAffine 和 cv2.warpPerspective,您可以使用它们进行各种转换。
缩放
缩放就是调整图像的大小。opencv为此提供了一个函数 cv2.resize()。可以手动指定图像的大小,也可以指定比例因子。使用不同的插值方法。最好的插值方法是 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)
#OR
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
平移
平移是物体位置的移动。假设(x,y)方向的偏移量为(),您可以创建转换矩阵 M,如下所示:
您可以放入一个 np.float32 类型的 numpy 数组中,并将其传递到cv2.warpAffine() 函数中。如需转换(100,50),请参见以下示例:
import cv2
import numpy as np
img = cv2.imread('1.png', 1)
rows, cols, channel = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img, M, (cols,rows))
cv2.imshow('1', img)
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.warpaffine() 函数的第三个参数是输出图像的大小,其形式应为(宽度、高度)。记住 宽度=列数,高度=行数。
旋转
在opencv中提供了 cv2.getRotationMatrix2D() 函数获得变换矩阵。第一参数指定旋转圆点;第二个参数指定旋转角度;第三个参数指定缩放比例。看如下例子:
import cv2
import numpy as np
img = cv2.imread('lena.jpg', 1)
rows,cols,channel = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/3),90,0.4)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
放射变换
仿射变换是一种二维坐标到二维坐标之间的线性变换,并保持二维图形的“平直性”。转换前平行的线,在转换后依然平行。
为了找到变换矩阵,我们需要从输入图像中取三个点及其在输出图像中的对应位置。然后 cv2.getAffineTransform 将创建一个2x3矩阵,该矩阵将传递给 cv2.warpAffine。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('1.png', 1)
rows,cols,channel = 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()
透视变换
透视变换需要3×3的变换矩阵,直线在变换后还是保持直线。为了构造变换矩阵,你需要输入图像的4个点和对应的要输出图像的4个点;要求这4个点其中3个点不共线。使用cv2.getPerspectiveTransform函数构造透视变换矩阵。代码:
img = cv2.imread('sudokusmall.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()