在深度学习等计算机视觉的一些应用领域,通常我们拿到的数据集很少或者数据千篇一律了,图像数据缺乏多样性和代表性,此时我们考虑需要对图像进行一定的旋转,平移,仿射变换等来对图像进行增强操作,以此来增加数据的多样性,进而可以训练出更好的网络模型。
import numpy as np
import cv2 as cv
def imageShift(image):
#图像平移矩阵M
M1=np.float32([[1,0,20],[0,1,20]])
row,col=image.shape[:2]
print(image.shape)
dst=cv.warpAffine(image,M1,(row,col))
cv.namedWindow("src",0)
cv.imshow("src",image)
cv.namedWindow("dst",0)
cv.imshow("dst",dst)
src=cv.imread(r'F:\OutputResult\SrcImage\saber7.jpg')
imagePers(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数参数说明:
warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
第一个参数:src即输入待变换的图像。
第二个参数:M即变换矩阵,需要为2乘以3形式(即两行三列)的转换矩阵。Opencv中对图像的变换操作都可以当作矩阵进行内部运算。
第三个参数:dsize即变换后的图像的大小(包括填充区域)
可选择参数:flags参数标志内插方法的组合标志扭曲反转图,这意味着M是反转变换。
borderMode:参数边界模式像素外推方法(请参见边界类型);当BORDER_TRANSPARENT,表示目标图像中对应于源图像中的“离群值”不会被函数修改。
borderValue参数:borderValue值,用于常量边框;默认情况下为0。以(R,G,B)形式进行填充显示。
程序运行结果:
import numpy as np
import cv2 as cv
def imageZoom(image):
#图像缩放
# 插值:interpolation
#直接规定缩放大小,这个时候就不需要缩放因子
#height,width = img.shape[:2]
#res2 = cv2.resize(img,(2*width,2*height),interpolation=cv2.INTER_CUBIC)
# None本应该是放图像大小的位置的,后面设置了缩放比例,所以就不要了
dst=cv.resize(image,None,fx=2,fy=2,interpolation=cv.INTER_CUBIC)
print("原图像形状:",src.shape)
print("缩放后形状:",dst.shape)
cv.namedWindow("src",0)
cv.imshow("src",image)
cv.namedWindow("dst",0)
cv.imshow("dst",dst)
src=cv.imread(r'F:\OutputResult\SrcImage\saber7.jpg')
imagePers(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数一:src输入图像
参数二:dsize输出图像尺寸
可选参数:fx,fy即对原图像的宽和高分别变为原来的几倍。如果上面的本应该是放图像大小的位置的为None,后面设置了缩放比例,则以该参数进行缩放。否则按照dsize设定的尺寸进行缩放。
interpolation:表示缩放图像进行的插值方式。常见的又最近邻插值,二次插值,立方插值等。
程序运行结果:
缩小: 原图像形状: (800, 899, 3) 缩放后形状: (240, 270, 3)
放大: 原图像形状: (800, 899, 3) 缩放后形状: (1600, 1798, 3)
import cv2 as cv
import numpy as np
def imageRotate(image):
#图像旋转操作
row,col=image.shape[:2]
print(image.shape)
#getRotationMatrix2D(),这个函数需要三个参数,
#旋转中心,旋转角度(逆时针),旋转后图像的缩放比例,比如下例为1:
M=cv.getRotationMatrix2D((col/2,row/2),45,1)
#第一个参数为输入图像,第二个参数为仿射变换矩阵,第三个参数为变换后大小,第四个参数为边界外填充颜色
dst=cv.warpAffine(image,M,(row,col),borderValue=(255,255,255))
cv.namedWindow("src",0)
cv.imshow("src",image)
cv.namedWindow("dst",0)
cv.imshow("dst",dst)
函数说明:
cv.getRotationMatrix2D(center, angle, scale)
参数一:旋转中心
参数二:旋转角度,逆时针,若要顺时针则加上负号即可。
参数三:缩放后图像的大小比例。
运行结果:
图像的仿射变换,我的理解是类似类似与正方形到平行四边形的变换。(改变图像形状,但未改变图像中平行线)
同样需要一个变换矩阵M。变换矩阵不容易给出,因此opencv中给出了求解M的函数。需要预先给定三个变换前后的位置对应点,作为参数传入。
import cv2 as cv
import numpy as np
def imageAffine(image):
#图像仿射变换
#图像的旋转加拉伸,类似与正方形到平行四边形的变换
#同样需要一个变换矩阵M。变换矩阵不容易给出,因此opencv中给出了求解M的函数
#M=cv2.getAffineTransform(pos1,pos2)需要给出三个变换前后的位置对应点
row,col=image.shape[:2]
pos1=np.float32([[50,50],[300,50],[50,200]])
pos2=np.float32([[10,100],[200,50],[100,250]])
M=cv.getAffineTransform(pos1,pos2)
dst=cv.warpAffine(image,M,(row,col))
cv.namedWindow("src",0)
cv.imshow("src",image)
cv.namedWindow("dst",0)
cv.imshow("dst",dst)
src=cv.imread(r'F:\OutputResult\SrcImage\saber7.jpg')
imagePers(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
cv.getAffineTransform(src, dst),Opencv中用于求解图像变换前后的对应矩阵M的函数。需要给出三个变换前后的位置对应点的坐标。
求出M后作为参数传入cv.warpAffine(image,M,(row,col))。即可求出指定的对应仿射变换后的图像。
import cv2 as cv
import numpy as np
def imagePers(image):
#图像透射需要3*3矩阵,通过函数M = cv2.getPerspectiveTransform(pts1,pts2),
#其中pts需要变换前后的4个点对应位置。
#最后通过透射函数warpPerspective进行变换
row,col=image.shape[:2]
pos1=np.float32([[56,65],[238,52],[28,237],[239,240]])
pos2=np.float32([[0,0],[200,0],[0,200],[200,200]])
M=cv.getPerspectiveTransform(pos1,pos2)
dst=cv.warpPerspective(image,M,(row,col))
cv.namedWindow("src",0)
cv.imshow("src",image)
cv.namedWindow("dst",0)
cv.imshow("dst",dst)
src=cv.imread(r'F:\OutputResult\SrcImage\saber7.jpg')
imagePers(src)
cv.waitKey(0)
cv.destroyAllWindows()
函数说明:
同样Opencv中给出了求解投射变换矩阵M的函数:
cv.getPerspectiveTransform(src, dst),需要给出四个变换前后的位置对应点的坐标。然后将求解出来的变换矩阵M带入函数cv.warpAffine(image,M,(row,col))。即可求出指定的对应投射变换后的图像。(改变图像形状,并且改变图像中的平行线)
运行结果: