作業流程(今日進度為1.4)
OpenCV合成新訓練集
2.1 讀取中文路徑圖檔(圖片讀取為BGR)
import cv2
import numpy as np
import random
def cv_imread(filePath):
cv_img = cv2.imdecode(np.fromfile(filePath, dtype=np.uint8), -1)
return cv_img
2.2 顯示圖檔:用於觀察影像處理的過程。
def show_img(name, img):
cv2.namedWindow(name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(name, 160, 160)
cv2.imshow(name, img)
cv2.waitKey()
2.3 侵蝕圖檔白色區域:用於加粗手寫中文字。
def my_erode(img):
kernel = np.ones((3, 3), np.uint8)
new_img = cv2.erode(img, kernel, iterations=1)
return new_img
2.4 圖檔前處理
def back(filePath, target_size):
img = cv_imread(filePath)
img = cv2.resize(img, target_size)
return img
def font(filePath, target_size):
img = cv_imread(filePath)
img = cv2.resize(img, target_size)
# 字體加粗
img = my_erode(img)
# 取高斯平滑
img = cv2.GaussianBlur(img, (3, 3), 0)
show_img('img2', img)
return img
2.5 手寫中文字旋轉:前景旋轉正負10度。
def rotation(img, target_size, clockwise, scale):
# 旋轉中心
center = (target_size[0] // 2, target_size[1] // 2)
# 旋轉角度
angle = random.randint(clockwise[0], clockwise[1])
# 圖檔旋轉
M = cv2.getRotationMatrix2D(center, angle, scale)
img = cv2.warpAffine(img, M, target_size, borderValue=(255, 255, 255))
show_img('img2_rotaion', img)
return img
2.6 前後景影像疊加,並儲存圖檔
def font_and_back(img1, img2):
# 在空白背景上定義初始ROI位置
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
# 手寫中文字轉換成灰階圖
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
show_img('img2gray', img2gray)
# 將灰度值二值化,得到ROI區域掩模
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
show_img('mask', mask)
# ROI掩模區域黑白反轉
mask_inv = cv2.bitwise_not(mask)
show_img('mask_inv', mask_inv)
# ROI掩模顯示空白背景
img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
show_img('img1_bg', img1_bg)
# ROI掩模顯示手寫中文字
img2_fg = cv2.bitwise_and(img2, img2, mask=mask_inv)
show_img('img2_fg', img2_fg)
# 空白背景與手寫中文字影像疊加
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
show_img('res', img1)
return img1
if __name__ == '__main__':
target_size = (80, 80)
img1 = back('./8_辰.jpg', target_size)
img2 = font('./丁_47.png', target_size)
img2_rotaion = rotation(img2, target_size, (-10, 10), 1)
result = font_and_back(img1, img2)
# 儲存新樣本
cv2.imencode('.jpg', result)[1].tofile('./丁_n_1.jpg')
print("成功儲存圖片")
影像合成示意圖:影像處理順序由左至右,由上而下。
3.1 前景代表手寫中文字;後景代表空白背景。
3.2 前景、前景旋轉
3.3 前景灰階、前景二值化
3.4 前景黑白反轉、掩模顯示後景
3.5 掩模顯示前景、前後景影像疊加
成果
下一章,目標是:「分享如何處理資料類別不平衡的問題」。
讓我們繼續看下去...