利用labelme生成Mask

0. 背景

        最近网络训练的数据为了排除图像周边的干扰,使得网络只关注划定的周界区域,因此需要得到训练图像的Mask,然后对原始图像进行预处理。

1. 使用labelme生成关键点的json文件

labelme的安装地址:Release v4.5.9 · wkentaro/labelme (github.com)

十分建议在win10下安装labelme.exe文件

 下图为labelme绘制区域的示意图,保存之后可以得到一个json文件,文件内容中包含了绘制点的坐标信息。

2. 生成Mask文件

 通过读取json文件,获取关键点信息,从而得到周界区域,生成Mask。

import json
import numpy as np
import cv2
# read json file
with open("./data/region.json", "r") as f:
    data = f.read()

# convert str to json objs
data = json.loads(data)

# get the points 
points = data["shapes"][0]["points"]
points = np.array(points, dtype=np.int32)   # tips: points location must be int32

# read image to get shape
image = cv2.imread("./data/region.jpg")

# create a blank image
mask = np.zeros_like(image, dtype=np.uint8)

# fill the contour with 255
cv2.fillPoly(mask, [points], (255, 255, 255))

# save the mask 
cv2.imwrite("mask.png", mask)

 运行代码,得到Mask文件,如下图所示。

利用labelme生成Mask_第1张图片

3. 对图像进行预处理

该阶段基于mask文件对原始图像进行填充处理,减少训练干扰以及训练难度。

import cv2
import os
import numpy as np
# 原始图像路径
srcRoot = "XXXX"
# 生成图像路径
dstRoot = "XXXXXXXXXX"
# 生成图像名前缀
prefix = "XXXXXXXXX"
# mask图像路径
maskPath = "mask.png"

def getPerimeter(srcRoot, dstRoot, prefix, maskPath, start=0):
    maskImg = cv2.imread(maskPath)

    region = maskImg == 0
    img_paths = os.listdir(srcRoot)

    for path in img_paths:
        srcImg = cv2.imread(os.path.join(srcRoot, path))

        srcImg[region] = 0
        name = prefix + "0" * (6 - len(str(start))) + str(start) + ".jpg"
        cv2.imwrite(os.path.join(dstRoot, name), srcImg)

        start += 1

# 生成周界图像
getPerimeter(srcRoot, dstRoot, prefix, maskPath, 0)

得到的输出结果如下图所示:

利用labelme生成Mask_第2张图片 

 预处理完毕!

你可能感兴趣的:(#,opencv,深度学习,labelme,mask)