01
介绍
图像增广(image augmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训练样本可以降低模型对某些属性的依赖,从而提高模型的泛化能力。
目前常用的图像增广技术有如下几种:
- 镜像变换
- 旋转
- 缩放
- 裁剪
- 平移
- 亮度修改
- 添加噪声
- 剪切
- 变换颜色
在图像增广过程中可以使用其中一种手段进行扩充,也可以使用其中的几种方法进行组合使用,由于概念比较简单,容易理解,所以接下来就边实现,边详细阐述理论知识。
02
几何变换
首先以水平镜像为例,假设在原图中像素的坐标为
,在镜像变换之后的图像中的坐标为,原图像坐标和镜像变换后的坐标之间的关系式:
其w为图像的宽度。
那么两张图像的关系就是:
它的逆变换就是
从原图到水平镜像的变换矩阵就是:
同理,可知,垂直镜像变换的关系式为:
其h为图像高度。
通过上述可以知道,平移变换的数学矩阵为:
其d_x、d_y分别是像素在水平和垂直方向移动的距离。
同理可以推广到旋转变换上,加上原像素的坐标为,该像素点相对于原点的角度alpha,假设有一个半径r的圆,那么原像素的坐标可以表示为:
加上旋转后的像素坐标为,旋转角度theta,那么可以表示为:
通过展开、化简可得,
把上述公式写成数学矩阵形式为:
因此旋转变换的矩阵为:
其他的几何变换方式和上述提到的核心思想大同小异,因此,就不再详细展开,感兴趣的可以在网上搜集一下,或者看一下数字图像处理相关的书籍,关注这些内容的讲解有很多。
03
编程实践
编程实践过程中主要用到opencv、numpy和skimage。
读取图像:
1# 1. 读取图像
2img = cv2.imread("./data/000023.jpg")
3cv2.imshow("Origin", img)
4cv2.waitKey()
初始化一个矩阵,用于存储转化后的图像,
generate_img = np.zeros(img.shape)
1.水平镜像
遍历图像的像素,用前文提到的数学关系式进行像素的转化,
for i in range(h): for j in range(w): generate_img[i, w - 1 - j] = img[i, j] cv2.imshow("Ver", generate_img.astype(np.uint8)) cv2.waitKey()
备注:初始化的图像数据类型是numpy.float64,用opencv显示时无法正常显示,因此在显示时需要用astype(np.uint8)把图像转化成numpy.uint8数据格式。