作业流程(今日进度为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 掩模显示前景、前後景影像叠加
成果
下一章,目标是:「分享如何处理资料类别不平衡的问题」。
让我们继续看下去...
<<: D3JsDay27What's the tree?Let me see—树状图(tree diagram)
>>: 【Side Project】 (老板)订单清单-未完成餐点提示
连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...
订阅patreon即可看到更多文章 https://www.patreon.com/wade3c ...
前言 这篇文章会进行到更多的资料操作 将会处理 Indexing Values 在标签值的处理很重...
其实只是拖延症点到满等的我,说是主角其实只是拖延症发作 有看过某些YT频道的应该有听过这段话 什麽样...
您是否希望提高您的竞争地位? 应对外部威胁?识别新的机会或风险? 扩大您在新市场的影响力? 战略分...