【Opencv3+Python3入门(6)图像数据增强平移旋转仿射变换】

版权声明:本文为博主原创文章,转载时须注明出处 https://blog.csdn.net/KID_yuan/article/details/89495467

在深度学习等计算机视觉的一些应用领域,通常我们拿到的数据集很少或者数据千篇一律了,图像数据缺乏多样性和代表性,此时我们考虑需要对图像进行一定的旋转,平移,仿射变换等来对图像进行增强操作,以此来增加数据的多样性,进而可以训练出更好的网络模型。

图像平移:

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(),这个函数需要三个参数,旋转中心,旋转角度(逆时针),旋转后图像的缩放比例,比如下例:
    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))。即可求出指定的对应投射变换后的图像。

运行结果:

猜你喜欢

转载自blog.csdn.net/KID_yuan/article/details/89495467