🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
涉及函数cv2.getPerspectiveTransform,cv2.warpAffine和cv2.warpPersperctive 1.扩展缩放 只是改变图像的尺寸大小,cv2.resize()可以实现这个功能。在缩放时推荐cv2.INTER_AREA,在拓展时推荐cv2.INTER_CUBIC(慢)和cv2.INTER_LINEAR。默认情况下所有改变图像尺寸大小的操作使用的是插值法都是cv2.INTER_LINEAR。 ~~~ import cv2 img = cv2.imread('45.jpg') #下面的None本应该是输出图像的尺寸,但是因为后面我们设置了缩放因子,所以,这里为None 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) while(1): cv2.imshow('res',res) cv2.imshow('img',img) if cv2.waitKey(1)&0xFF == 27: break cv2.destroyAllWindows() ~~~ 2.平移 如果想要沿(x,y)方向移动,移动的距离为(tx,ty)可以以下面方式构建移动矩阵。 ![](https://box.kancloud.cn/672d6f21d834dec1c01b95bb4c1405e1_220x112.jpg) 可以使用Numpy数组构建矩阵,数据类型是np.float32,然后传给函数cv2.warpAffine() 函数cv2.warpAffine() 的第三个参数的是输出图像的大小,它的格式 应该是图像的(宽,高)。应该记住的是图像的宽对应的是列数,高对应的是行数。 3.旋转 对一个图像旋转角度θ,需要使用下面的旋转矩阵。 ![](https://box.kancloud.cn/d205eb3a4cc64fb22e4bfe94fd6e075e_296x99.jpg) 但OpenCVC允许在任意地方进行旋转,所以矩阵应该为 ![](https://box.kancloud.cn/a47cf87f929111a30484c962471de587_467x116.jpg) 其中α = scale · cos θ 为构建旋转矩阵,OpenCV提供了一个函数cv2.getRotationMatrix2D。 ~~~ import cv2 img = cv2.imread('45.jpg',0) rows,cols=img.shape #这里的第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子 #可以通过设置旋转中心,缩放因子以及窗口大小来防止旋转后超出边界的问题。 M=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6) #第三个参数是输出图像的尺寸中心 dst=cv2.warpAffine(img,M,(2*cols,2*rows)) while(1): cv2.imshow('img',dst) if cv2.waitKey(1)==27: break cv2.destroyAllWindows() ~~~ 4.仿射变换 在仿射变换中,原图中所有平行线在结果图像中同样平行。为创建这个矩阵,需要从原图像中找到三个点以及他们在输出图像中的位置,然后cv2.getAffineTransForm()会创建一个2X3的矩阵。最后这个矩阵会被传给函数cv2.warpAffine() ~~~ import cv2 import numpy as np from matplotlib import pyplot as plt img=cv2.imread(''draw.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(121,plt.imshow(img),plt.title('output')) plt.show() ~~~ 5.透视变换 对于视角变换,我们需要一个3x3变换矩阵。在变换前后直线还是直线。需要在原图上找到4个点,以及他们在输出图上对应的位置,这四个点中任意三个都不能共线,可以有函数cv2.getPerspectiveTransform()构建,然后这个矩阵传给函数cv2.warpPerspective() ~~~ import cv2 import numpy as np from matplotlib import pyplot as plt 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(121,plt.imshow(img),plt.title('Output')) plt.show() ~~~