几何变换

    科技2022-08-19  102

    文章目录

    一.缩放1.原理2.函数调用 二.翻转三.仿射1.实现图像平移2.旋转3.实现更复杂的仿射 四.透视五.重映射


    一.缩放

    1.原理

    在缩放的过程实际是改变图像的尺寸,那么他们的像素点的位置也就发生了变化,再缩放过程中最核心的两步: (1)找到变化之后的图像的指定位置像素点在原始图像中的位置。 (2)将原始图像中对应位置像素的灰度值赋予新的像素点。若新的像素点在原图像中的位置为整数坐标,此时只需将原图像中的像素值赋予新的像素点。若新像素点在原图像中的位置为非整数坐标,此时需用一些方法近似,即插值。常见方法有最近邻法,双线性插值法,多线性插值法。

    2.函数调用

    在opencv中提供了cv2.resize()函数来实现图像的缩放。 其语法格式如下:

    dst=cv2.resize(src,dsize[,fx[,fy[,interpolation]])

    参数说明: dst:目标图像 src:原始输入图像 dsize:原始图像经过缩放之后的大小 fx:x轴,即列缩放的比例 fy:y轴,即行缩放的比例 interpolation:插值方法,默认为双线性插值 使用注意事项: (1)dsize的第一个参数代表缩放后图像宽度,即列;第二个参数代表缩放后图像的长度,即行。而我们用shape得到的图像大小的第一个值代表行,第二个值代表列。 (2)当dsize为非零时,无论fx,fy参数有无,均按照dsize大小执行;当dsize为0时,则按照fx,fy参数进行缩放。

    import cv2 image=cv2.imread("color_2.png") #缩放 image1=cv2.resize(image,image.shape[:2]) #缩放 row,col=image.shape[:2] image2=cv2.resize(image,(col,row)) #缩放 image3=cv2.resize(image,(0,0),fx=2,fy=0.5) print("image",image.shape) print("image1",image1.shape) print("image2",image2.shape) print("image3",image3.shape)

    运行结果:

    二.翻转

    在opencv中提供了cv2.flip()函数来实现图像的翻转,该函数能实现水平,垂直或两方向同时翻转。 其语法形式:

    dst=cv2.flip(src,flipCode)

    参数说明: dst:目标输出图像 src:原始输入图像 flipCode:翻转类型。 为0时,绕x轴翻转,即竖直翻转; 为正值时,绕y轴翻转; 为负值时,绕x轴翻转; 实例:

    import cv2 image=cv2.imread("color_11.png") #竖直翻转 vertical=cv2.flip(image,0) #水平翻转 horizon=cv2.flip(image,1) #两方向同时翻转 both=cv2.flip(image,-3) cv2.imshow("image",image) cv2.imshow("vertical",vertical) cv2.imshow("horizon",horizon) cv2.imshow("both",both) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    三.仿射

    仿射是指图像可以通过一系列的几何变换实现图像的平移,旋转等多种操作。opencv提供了仿射函数cv2.warpAffine(),其通过一个变换矩阵M来实现变换,变换之后与变换之前两像素点的对应关系为:

    dst(x,y)=src(M11*x+M12*y+M13,M21*x+M22*y+M23)

    函数cv2.warpAffine()的语法格式:

    dst=cv2.warpAffine(src,M,dsize)

    参数说明: dst:目标输出图像 src:原始输入图像 M:仿射变换矩阵,主义元素类型为float dsize:输出目标图像的大小

    1.实现图像平移

    import cv2 import numpy as np image=cv2.imread("color_5.jpg") row,col=image.shape[:2] #将图像向右平移100个像素点 #仿射矩阵 M=np.float32([[1,0,100],[0,1,0]]) after=cv2.warpAffine(image,M,(col,row)) cv2.imshow("image",image) cv2.imshow("after",after) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    2.旋转

    要得到旋转的变换矩阵M,通过计算是比较难得到的,但opencv提供了函数 cv2.getRotationMatrix2D()来得到旋转变换矩阵。 函数语法:

    M=cv2.getRotationMatrix2D(center,angle,scale)

    参数说明: center:旋转中心坐标 angle:旋转角度 scale:大小缩放比例

    如果将图像旋转60度:

    import cv2 import numpy as np image=cv2.imread("color_5.jpg") row,col=image.shape[:2] #得到变换矩阵: M=cv2.getRotationMatrix2D((col/2,row/2),60,1) #仿射 after=cv2.warpAffine(image,M,(col,row)) cv2.imshow("image",image) cv2.imshow("after",after) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果: 在这里插入图片描述

    3.实现更复杂的仿射

    为实现更复杂的仿射,opencv提供了得到任意变换的变换矩阵函数cv2.getAffineTransform()。 函数语法:

    M=cv2.getAffineTransform(src,dst)

    参数说明: src:为原始图像三个点的坐标,以3*2矩阵形式传入; dst:为目标图像对应点的三个坐标; 原理:其以这三个点分别为平行四边形的左上,右上,左下坐标,实现从一个平行四边形到另一个平行四边形的转变。 将图形绕中心顺时针旋转90度,选定初始三点:(width/2,height/2),(width/2,height/2+100),(width/2+100,height/2) 变换后对应三点(width/2,height/2),(width/2+100,height/2),(width/2,height/2-100)

    import cv2 import numpy as np image=cv2.imread("color_5.jpg") height,width=image.shape[:2] p1=np.float32([[width/2,height/2],[width/2,height/2-100],[width/2+100,height/2]]) p2=np.float32([[width/2,height/2],[width/2+100,height/2],[width/2,height/2-100]]) M=cv2.getAffineTransform(p1,p2) #仿射 after=cv2.warpAffine(image,M,(width,height)) cv2.imshow("image",image) cv2.imshow("after",after) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    四.透视

    透视与仿射一样都是通过变换矩阵来实现变换。 opencv提供了仿射函数cv2.warpPespective(),其通过一个变换矩阵M来实现变换,变换之后与变换之前两像素点的对应关系为:

    dst(x,y)=src(M11*x+M12*y+M13,M21*x+M22*y+M23)

    函数cv2.warpPerspective()的语法格式:

    dst=cv2.warpPerspective(src,M,dsize)

    参数说明: dst:目标输出图像 src:原始输入图像 M:仿射变换矩阵,主义元素类型为float dsize:输出目标图像的大小

    opencv提供了得到任意变换的变换矩阵函数cv2.getPespectiveTransform()。 函数语法:

    M=cv2.getPerspectiveTransform(src,dst)

    参数说明: src:为原始图像四个点的坐标,以4*2矩阵形式传入; dst:为目标图像对应点的四个坐标;

    五.重映射

    重映射就是将一幅图像的像素值放置到另一幅图像像素值的指定位置。我们可以借助其来实现一系列的空间几何变换。 opencv中提供了cv2.remap()函数来实现重映射。 其语法格式:

    dst=cv2.remap(src,mapx,mapy,interpolation)

    参数说明: dst:目标输出图像 src:原始输入图像 mapx:x坐标,为与图像同大小的矩阵形式,代表dst中对应位置点在原始图像中的x坐标。 mapy:y坐标,为与图像同大小的矩阵形式,代表dst中对应位置点在原始图像中的y坐标。 interpolation:插值方法 实例: 若将原始坐标的x,y轴对换,即同时绕x,y轴翻转:

    import cv2 import numpy as np image=cv2.imread("color_5.jpg") height,width=image.shape[:2] mapx=np.zeros(image.shape[:2],dtype=np.float32) mapy=np.zeros(image.shape[:2],dtype=np.float32) for i in range(height): for j in range(width): mapx.itemset((i,j),i) mapy.itemset((i,j),j) after=cv2.remap(image,mapx,mapy,cv2.INTER_LINEAR) cv2.imshow("image",image) cv2.imshow("after",after) cv2.waitKey(0) cv2.destroyAllWindows()

    运行结果:

    Processed: 0.017, SQL: 9