本系列python版本:python2.7.15
本系列opencv-python版本:opencv-python3.4.2.17
本系列使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:windows上jupyter notebook主题背景、字体及扩展插件配置(集成vim环境)
前几篇分享多以数字图像基础知识为中心,本文分享一下在图像处理的项目中经常需要用到的,重要的图像预处理: 图像数据集增强。在实际项目中,我们经常会遇到数据集太小,数据量不够等问题,这直接导致了接下来的工作无法进行,本文便来唠一唠如何在拥有一部分图像数据的情况下扩充数据集的方式
本文数据集使用介绍: 数据集是基于英文手写体识别开发,因此本文图片数据集是含手写体英文的图片,标签数据是图片对应的正确的文本txt文件,因此对数据集的拓展包括两方面,一是英文手写体图片的拓展,一是英文手写体图片对应的文本txt文件的拓展,产生新数据集用于神经网络训练。展示个别图片数据如下:
本文最后将提供python实现的图像数据集增强源码,功能:将图像数据集增强做成了开关形式,可以对以下图像数据集增强方式进行自动变换调节,各项之间也可累加:
图像缩放便是调节图片的分辨率,在【数字图像处理系列二】基本概念:亮度、对比度、饱和度、锐化、分辨率中详细介绍了图片分辨率调节,我们可以通过对图片分辨率做适当的调节,增强图像数据,同时应该增加对应的标签数据,便是图片对应的问题txt文件
利用opencv-python库resize()函数对图片分辨率进行调节,项目部分代码展示如下,可以将图像调节成任意分辨率,但在实际调节过程中,我们应保持在一定范围内,可根据实验反馈效果进行调整:
import re, cv2
CODE = '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)
参数含义:
cv2.warpAffine()功能是做图像几何变换,函数定义如下:
cv2.warpAffine(img, M, (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)
参数含义:
核心代码展示如下:
def process(self, img):
return cv2.GaussianBlur(img, (5,5), self.sigma)
为图像添加噪音也是一种图像数据集增强方式,可以添加多种类型噪音,如椒盐噪音、高斯噪音,本例中添加常见的高斯噪音,使用skimage.util.random_noise()函数,定义如下:
skimage.util.random_noise(gray_img, mode, seed=None, clip=True, kwargs)
参数含义:
gray_img: 待处理图像灰度图
mode: str类型,添加噪音类型
seed: int类型,添加噪音随机性
clip: 为True时应用剪切,输入和输入大小相同
mean:噪音随机分布的均值
var:噪音随机分布的方差
核心代码展示:
def process(self, img):
return random_noise(img, mode='gaussian', var=self.var)
源码和训练数据集获取请关注小编微信公众号并回复 图像增强源码 获取源码,回复手写体识别数据集 获取数据集,公众号: