图像的变换通常用于数据预处理部分,例如缩放旋转等常见的图像变换方法;在一些深度学习框架内部都分装了图像变换的方法,对训练集做统一的图像变换操作;
函数原型:
resize(src,dsize,[fx,fy,interpolation])
插值算法有以下几种:
1、INTER_NEAREST:最近邻插值,速度快,效果差;
2、INTER_LINEAR:双线性插值,基于原图的四个点;(默认插值方法)
3、INTER_CUBIC:三次插值,基于原图16个点,效果好但耗时大;
4、INTER_AREA:效果最好,速度也最慢;
图像翻转不等同于旋转,类似于一些视频的拍摄,拍摄后实际是左右颠倒的,通过图像翻转可进行还原;
函数原型:
filp(img,filpCode):filpCode等于0(上下翻转)、大于0(左右翻转)、小于0(上下+左右翻转)
代码案例:
cv2.filp(img, 0) # 上下翻转
cv2.filp(img, 1) # 左右翻转
cv2.filp(img, -1) # 上下左右翻转
函数原型:
rotate(img,rotateCode)
首先介绍一下放射变换,简单来说就是图像旋转、缩放、平移的总称;
函数原型:
warpAffine(src,M,dsize,flags,mode,value)
实际上平移矩阵就是一个2x2的单位矩阵加上一个2x1的平移向量,也就是2x3的矩阵;
代码案例:
img = cv2.imread('img.jpg')
h,w,c = img.shape
M = np.float32([[1, 0, 500], [0, 1, 0]]) # x方向平移500个像素点
new = cv2.warpAffine(img, M, (w, h))
cv2.imshow('new', new)
cv2.waitKey(0)
获取变换矩阵M的两种方法:
1、getRotationMatrix2D(center,angle,scale)
代码案例:
M = cv2.getRotationMatrix2D((100,100), 30, 1.0)
new = cv2.warpAffine(img, M, (w, h))
2、getAffineTransform(src[],dst[])
定义:通过点对应找到变换矩阵,一般三个点就可以;
拓展:这里可以联想到TPS算法,也是通过对应点进行变换的一种方法,二者可能有想通之处;
代码案例:
src = np.float32([[100, 200], [300, 400], [500, 700]])
dst = np.float32([[300, 400], [800, 500], [900, 800]])
cM = cv2.getAffineTransform(src, dst)
new = cv2.warpAffine(img, M, (w, h))
这里用一个具体案例来介绍,例如拍照搜题的软件,当拍摄整页时会有一种书本和桌面组合的样子,经过透视变换后能更好的将想要的信息放在图像中;
仿射变换函数原型:
warpPerspective(img,M,dsize,…)
获取变换矩阵函数原型:
getPerspective(src,dst):和getAffineTransform函数比较类似,不同的是需要四个坐标点(图形四个角);
代码案例:
paper = cv2.imread('paper.png')
src = np.float32([[100,1100], [2100, 1100], [0, 4000], [2500, 3900]])
dst = np.float32([[0, 0], [2300, 0], [0, 3000], [2300, 3000]])
M = cv2.getPerspectiveTransform(src, dst)
new = cv2.warpPerspective(paper, M, (2300, 3000))
paper = cv2.resize(paper, (460, 600))
new = cv2.resize(new, (460, 600))
cv2.imshow('org', paper)
cv2.imshow('new', new)
cv2.waitKey(0)
图像的变换在解决一些小问题上十分有效,特别是变换矩阵的获取,本质上变换矩阵就是一个滤波器,通过该滤波器改变了图像中一些点的像素值;像仿射变换、透视变换,都是十分常用的方法,用于图像的前处理部分;