內容遷移來自博主博客:

https://blog.csdn.net/feilong_csdn?

blog.csdn.net

本系列python版本:python2.7.15

本系列opencv-python版本:opencv-python3.4.2.17

本系列使用的開發環境是jupyter notebook,是一個python的互動式開發環境,測試十分方便,並集成了vim操作,安裝教程可參考:windows上jupyter notebook主題背景、字體及擴展插件配置(集成vim環境)

前幾篇分享多以數字圖像基礎知識為中心,本文分享一下在圖像處理的項目中經常需要用到的,重要的圖像預處理: 圖像數據集增強。在實際項目中,我們經常會遇到數據集太小,數據量不夠等問題,這直接導致了接下來的工作無法進行,本文便來嘮一嘮如何在擁有一部分圖像數據的情況下擴充數據集的方式

一、數據集項目背景

本文數據集使用介紹: 數據集是基於英文手寫體識別開發,因此本文圖片數據集是含手寫體英文的圖片,標籤數據是圖片對應的正確的文本txt文件,因此對數據集的拓展包括兩方面,一是英文手寫體圖片的拓展,一是英文手寫體圖片對應的文本txt文件的拓展,產生新數據集用於神經網路訓練。展示個別圖片數據如下:

本文最後將提供python實現的圖像數據集增強源碼,功能:將圖像數據集增強做成了開關形式,可以對以下圖像數據集增強方式進行自動變換調節,各項之間也可累加

1、旋轉,旋轉角度可調

2、縮放,解析度可調

3、添加噪音,背景噪音程度可調

4、圖像模糊,模糊程度可調

5、圖像移動 將圖像往x、y方向上按指定的數量移動圖像像素

6、支持拓展其他新的圖像數據集增強方式

二、數據集增強方法

1、圖片縮放

圖像縮放便是調節圖片的解析度,在

過客:【數字圖像處理系列二】亮度、對比度、飽和度、銳化、解析度?

zhuanlan.zhihu.com
圖標

中詳細介紹了圖片解析度調節,我們可以通過對圖片解析度做適當的調節,增強圖像數據,同時應該增加對應的標籤數據,便是圖片對應的問題txt文件

利用opencv-python庫resize()函數對圖片解析度進行調節,項目部分代碼展示如下,可以將圖像調節成任意解析度,但在實際調節過程中,我們應保持在一定範圍內,可根據實驗反饋效果進行調整:

import re, cv2

CODE = scale
REGEX = re.compile(r"^" + CODE + "_(?P<w_scale>[.0-9]+)_(?P<h_scale>[.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]))

運行程序,將圖像放大為原來的兩倍效果如下:

2、圖片旋轉

圖像按照給定的角度旋轉,這也是增強圖像數據集一種常用的方式,使用opencv-python中getRotationMatrix2D()函數和warpAffine()函數,getRotationMatrix2D()函數定義如下:

cv2.getRotationMatrix2D(Point2f center, double angle, double scale)

參數含義:

  • center: (x_center,y_center) 圖像中心像素坐標,也是旋轉中心
  • angle: 定義圖像旋轉的角度
  • scale : 圖像縮放因子,一般默認為1,不縮放

cv2.warpAffine()功能是做圖像幾何變換,函數定義如下:

cv2.warpAffine(img, M, (cols,rows))

參數含義:

  • 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))

運行程序,將圖像順時針旋轉兩度效果如下:

3、圖片平移

圖像平移指將圖像往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個像素位置效果如下:

4、圖片模糊

圖像模糊也是圖像數據集增強的一種方式,圖像模糊內容將在圖像濾波中詳細介紹,模糊技術很多,本文採用最常見的圖像高斯模糊,使用的是opencv-python中cv2.GaussianBlur()函數,函數定義如下:

cv2.GaussianBlur(img, kernel, sigma)

參數含義:

  • img: 待處理圖形
  • kernel: 高斯核,是正奇數,如(5,5)
  • sigma: 指定x/y方向標準差,控制模糊的程度,數值越大模糊度也高

核心代碼展示如下:

def process(self, img):
return cv2.GaussianBlur(img, (5,5), self.sigma)

運行程序,將用高斯核為(5,5),標準差=4時效果如下:

5、圖片添加噪音

為圖像添加噪音也是一種圖像數據集增強方式,可以添加多種類型噪音,如椒鹽噪音、高斯噪音,本例中添加常見的高斯噪音,使用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)

運行程序,給圖片添加方差為0.05效果如下:

三、源代碼獲取

源碼和訓練數據集獲取請關注小編微信公眾號並回復 圖像增強源碼 獲取源碼,回復手寫體識別數據集 獲取數據集,公眾號【機器學習與TensorFlow實戰】 作者【CHEONG】


推薦閱讀:
相關文章