【第27天】探讨与改善-增加训练样本(二)

摘要

  1. 作业流程
  2. OpenCV合成新训练集
    2.1 读取中文路径图档
    2.2 显示图档
    2.3 侵蚀图档白色区域
    2.4 图档前处理
    2.5 手写中文字旋转
    2.6 前後景影像叠加,并储存图档
  3. 影像合成示意图
  4. 成果

内容

  1. 作业流程(今日进度为1.4)

  2. 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
    
    • 手写中文字图片(前景):
      • 以my_erode加粗中文字体,
      • 以高斯平滑,减少文字边缘出现锯齿状。
    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. 影像合成示意图:影像处理顺序由左至右,由上而下。

    3.1 前景代表手写中文字;後景代表空白背景。

    3.2 前景、前景旋转

    3.3 前景灰阶、前景二值化

    3.4 前景黑白反转、掩模显示後景

    3.5 掩模显示前景、前後景影像叠加

  4. 成果


小结

下一章,目标是:「分享如何处理资料类别不平衡的问题」。

让我们继续看下去...


参考资料

  1. 2021 年玉山银行中文手写影像辨识竞赛作法分享,以及手写文字图片合成基本教学
  2. [Python+OpenCV] 影像侵蚀 erode 与影像膨胀 dilate

<<:  D3JsDay27What's the tree?Let me see—树状图(tree diagram)

>>:  【Side Project】 (老板)订单清单-未完成餐点提示

前端工程师也能开发全端网页:挑战 30 天用 React 加上 Firebase 打造社群网站|Day5 注册登入页面

连续 30 天不中断每天上传一支教学影片,教你如何用 React 加上 Firebase 打造社群...

把md档变成Medium文章

订阅patreon即可看到更多文章 https://www.patreon.com/wade3c ...

{DAY 20} Pandas 学习笔记part.6

前言 这篇文章会进行到更多的资料操作 将会处理 Indexing Values 在标签值的处理很重...

[Day 1] 主角总是最後登场的 (前端篇)

其实只是拖延症点到满等的我,说是主角其实只是拖延症发作 有看过某些YT频道的应该有听过这段话 什麽样...

什麽是战略分析 (Strategic Analysis)?如何使用工具进行此操作

您是否希望提高您的竞争地位? 应对外部威胁?识别新的机会或风险? 扩大您在新市场的影响力? 战略分...