内容来自OpenCV-Python Tutorials 自己翻译整理
目标 移动、旋转、仿射变换等等 cv2.getPerspectiveTransform函数
变换 opencv中有cv2.warpAffine函数和 cv2.warpPerspective函数。上述函数可以实现所有类型的变换cv2.warpAffin参数是2*3的变换矩阵,cv2.warpPerspective函数是3*3的变换矩阵
放缩 放缩仅仅改变图像尺寸。opencv提供的函数cv2.resize()可以实现此功能。图片的尺寸可以手动指定,或者指定缩放因子。可以不同的插值运算方法。在缩放时推荐的插值运算方法是 cv2.INTER_AREA,在扩展时推荐使用v2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下改变图像大小的操作使用插值方法是cv2.INTER_LINEAR,可以使用任意一种方法改变图像尺寸。
import cv2 import numpy as np
img = cv2.imread('3.jpg') #None为图像尺寸时,fx和fy参数是缩放因子 res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) cv2.imshow('q',res)
#两倍放大 height, width = img.shape[:2] res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC) cv2.imshow('p',res) cv2.waitKey(0)
平移就是移动对象位置。如果你知道移动方向(x,y),移动距离是(tx,ty),可以创建如下矩阵。

可以将矩阵放进numpy的数组当中,存为np.float32类型,并将其传入cv2.warpAffine() 函数当中。下面例子移动了(100,50)。
img = cv2.imread('3.jpg',0) M = np.float32([[1,0,100],[0,1,50]]) dst = cv2.warpAffine(img,M,(cols,rows))
第三个参数是输出图像的大小,(宽,高),分别对应列数和行数 在opencv中可以在任意位置旋转,所以矩阵如下  pencv提供了cv2.getRotationMatrix2D函数来实现旋转矩阵 img = cv2.imread('6.jpg',0) M=cv2.getRotationMatrix2D((cols/2,rows/2),90,1) dst = cv2.warpAffine(img,M,(cols,rows)) 仿射变换中,图中的平行线变换后依然平行。创建仿射变换矩阵需要在图像中找三个点和这三个点在输出图像的位置。使用cv2.getAffineTransform函数创建仿射变换矩阵,矩阵2*3,矩阵会被传递给cv2.warpAffine函数 from matplotlib import pyplot as plt img = cv2.imread('7.jpg') 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')
透视变换 透视变换需要3*3的矩阵,透视变换后直线还是直线,建立透视矩阵需要在图像上找4个点和在输出图像上的对应位置,四个点任意三个不能共线cv2.getPerspectiveTransform() 构建矩阵,并将矩阵传递到函数cv2.warpPerspective
from matplotlib import pyplot as plt img = cv2.imread('7.jpg') 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')
产生近大远小的效果 |
|