python版本:python3.5.4 ; opencv-python版本:opencv-python3.4.2.17
使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:https://blog.csdn.net/feilong_csdn/article/details/80186276
本系列前三篇文章链接:
opencv-python快速入门篇【数字图像处理系列一】
基本概念:亮度、对比度、饱和度、锐化、分辨率【数字图像处理系列二】
图像增强:线性、 分段线性、 对数、 反对数、 幂律(伽马)变换、直方图均衡【数字图像处理系列三】
前几篇分享多以数字图像基础知识为中心,本文分享一下在图像处理的项目中经常需要用到的,重要的图像预处理:图像数据集增强。在实际项目中,我们经常会遇到数据集太小,数据量不够等问题,这直接导致了接下来的工作无法进行,本文便来唠一唠如何在拥有一部分图像数据的情况下扩充数据集的方式
一、数据集项目背景
本文数据集使用介绍:数据集是基于英文手写体识别开发,因此本文图片数据集是含手写体英文的图片,标签数据是图片对应的正确的文本txt文件,因此对数据集的拓展包括两方面,一是英文手写体图片的拓展,一是英文手写体图片对应的文本txt文件的拓展,产生新数据集用于神经网络训练。展示个别图片数据如下:
本文最后将提供python实现的图像数据集增强源码,功能:将图像数据集增强做成了开关形式,可以对以下图像数据集增强方式进行自动变换调节,各项之间也可累加:
(1) 旋转,旋转角度可调
(2) 缩放,分辨率可调
(3) 添加噪音,背景噪音程度可调
(4) 图像模糊,模糊程度可调
(5) 图像移动 将图像往x、y方向上按指定的数量移动图像像素
(6) 支持拓展其他新的图像数据集增强方式
二、数据集增强方法
1、图片缩放
图像缩放便是调节图片的分辨率,在【数字图像处理系列二】基本概念:亮度、对比度、饱和度、锐化、分辨率中详细介绍了图片分辨率调节,我们可以通过对图片分辨率做适当的调节,增强图像数据,同时应该增加对应的标签数据,便是图片对应的问题txt文件
利用opencv-python库resize()函数对图片分辨率进行调节,项目部分代码展示如下,可以将图像调节成任意分辨率,但在实际调节过程中,我们应保持在一定范围内,可根据实验反馈效果进行调整:
import re, cv2CODE = 'scale'REGEX = re.compile(r"^" + CODE + "_(?P[.0-9]+)_(?P[.0-9]+)")class Scale: def __init__(self, w_scale, h_scale): self.code = CODE + str(w_scale) + '_' + str(h_scale) self.w_scale = w_scale self.h_scale = h_scale def process(self, img): height, width = img.shape[:2] return cv2.resize(img, (int(self.w_scale*width), int(self.h_scale*height)), interpolation = cv2.INTER_CUBIC) @staticmethod def match_code(code): match = REGEX.match(code) if match: d = match.groupdict() return Scale(float(d['w_scale']), float(d['h_scale']))
运行程序,将图像放大为原来的两倍效果如下:
图像按照给定的角度旋转,这也是增强图像数据集一种常用的方式,使用opencv-python中getRotationMatrix2D()函数和warpAffine()函数,getRotationMatrix2D()函数定义如下:
cv2.getRotationMatrix2D(Point2f center, double angle, double scale)
参数含义:
(1) center:(x_center,y_center) 图像中心像素坐标,也是旋转中心
(2) angle:定义图像旋转的角度
(3) scale :图像缩放因子,一般默认为1,不缩放
cv2.warpAffine()功能是做图像几何变换,函数定义如下:
cv2.warpAffine(img, M, (cols,rows))
参数含义:
(1) img: 待变换的图像
(2) M: 图像几何变换方式,自定义
(3) (cols,rows): 输入图像的大小
核心代码展示:
def process(self, img): height, width = img.shape[:2] M = cv2.getRotationMatrix2D((width/2, height/2), self.angle, 1) return cv2.warpAffine(img, M, (width, height))
运行程序,将图像顺时针旋转两度效果如下:
图像平移指将图像往x、y方向上按指定的数量移动图像像素,也使用cv2.warpAffine()函数,自定义平移的方向和位移大小:
核心代码展示:
def process(self, img): height, width = img.shape[:2] trans_M = np.float32([[1, 0, self.x_trans], [0, 1, self.y_trans]]) return cv2.warpAffine(img, trans_M, (width, height))
运行程序,将图像整体向右和下方向各移动10个像素位置效果如下:
图像模糊也是图像数据集增强的一种方式,图像模糊内容将在图像滤波中详细介绍,模糊技术很多,本文采用最常见的图像高斯模糊,使用的是opencv-python中cv2.GaussianBlur()函数,函数定义如下:
cv2.GaussianBlur(img, kernel, sigma)
参数含义:
(1) img: 待处理图形
(2) kernel: 高斯核,是正奇数,如(5,5)
(3) sigma: 指定x/y方向标准差,控制模糊的程度,数值越大模糊度也高
核心代码展示如下:
def process(self, img): return cv2.GaussianBlur(img, (5,5), self.sigma)
运行程序,将用高斯核为(5,5),标准差=4时效果如下:
为图像添加噪音也是一种图像数据集增强方式,可以添加多种类型噪音,如椒盐噪音、高斯噪音,本例中添加常见的高斯噪音,使用skimage.util.random_noise()函数,定义如下:
skimage.util.random_noise(gray_img, mode, seed=None, clip=True, kwargs)
参数含义:(1) gray_img: 待处理图像灰度图(2) mode: str类型,添加噪音类型(3) seed: int类型,添加噪音随机性(4) clip: 为True时应用剪切,输入和输入大小相同(5) mean:噪音随机分布的均值(6) var:噪音随机分布的方差
核心代码展示:
def process(self, img): return random_noise(img, mode='gaussian', var=self.var)
运行程序,给图片添加方差为0.05效果如下:
源码和训练数据集获取请关注公众号并回复 图像增强源码 获取源码,回复 手写体识别数据集 获取数据集