使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

1.使用labelme进行标注

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

这里使用两张图片进行标注,需要注意以下几点:

1.图片的名称需要时英文字母命名;

2.标注目标的命名为类别.

标注完成直接将对应的json文件保存到两张图片所在的文件夹

2.代码

import json
import numpy as np
from labelme import utils
import cv2
import os

def create_file(file):

    if not os.path.exists(file):
        os.mkdir(file)

def cv_show(name,img):

    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

def from_mask_extract_ROI(img,mask):

    y = np.where(mask==1)[0]
    x = np.where(mask==1)[1]
    lu_y = min(y)
    ld_y = max(y)
    ru_x = min(x)
    rd_x = max(x)
    mask_ROI = mask[lu_y:ld_y+1,ru_x:rd_x+1]
    ROI = img[lu_y:ld_y+1,ru_x:rd_x+1]
    mask = np.ones_like(ROI)
    for i in range(mask.shape[2]):
        mask[:,:,i] = mask_ROI
    masked_ROI = mask*ROI
    channel_reverse = np.ones_like(masked_ROI)
    for i in range(channel_reverse.shape[2]):
        channel_reverse[:,:,-1-i] = masked_ROI[:,:,i]
    return channel_reverse

def from_json_extract_ROI_based_label(file):
    file_list = os.listdir(file)

    json_file = []
    for idx, value in enumerate(file_list):
        if value.split('.')[-1] == 'json':
            json_name = os.path.join(file, value)
            json_file.append(json_name)
    for idx, value in enumerate(json_file):
        json_name = value
        data = json.load(open(json_name))
        img = utils.img_b64_to_arr(data['imageData'])
        lbl, lbl_name = utils.labelme_shapes_to_label(img.shape, data['shapes'])

        mask = []
        for i in range(1, len(lbl_name)):
            mask.append((lbl == i).astype(np.uint8))
        mask = np.transpose(np.asarray(mask, np.uint8), [1, 2, 0])

        keys = []
        values = []
        for value, key in enumerate(lbl_name):
            key = key.split('.')[0]
            keys.append(key)
            values.append(value)
        labels = []
        for i in range(1, len(values)):
            labels.append(keys[i])

        for i in range(mask.shape[2]):
            a = mask[:, :, i]
            masked_ROI_ChannelRevrse = from_mask_extract_ROI(img=img,mask=a)
            save_file = str(labels[i])
            create_file(save_file)
            save_ROI = './' + save_file + '/' + json_name.split('/')[-1].split('.json')[0] + '.' + str(i) + '.jpg'
            cv2.imwrite(save_ROI, masked_ROI_ChannelRevrse)

from_json_extract_ROI_based_label(file='./test/')

运行代码需要注意以下几点:

1.将包含图片和json文件的文件夹与代码文件应处于同一级目录,我的目录如下图:

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

3.运行代码结果

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

需要注意以下几点:

1.标注过程如果采用多边形,则保存的对应的图片会以其外接矩形保存,多边形外的区域像素值为0;

2.抠图过程无法对覆盖形式的标注进行抠图

参考博客:labelme把绘制的区域抠出来_herr_kun的博客-CSDN博客_labelme 抠图1、标注图:2、效果图:3、代码# –– coding: utf-8 –-“””Created on Fri Jan 18 20:28:58 2019@author: Herr-kun”””import jsonimport matplotlib.pyplot as pltimport numpy as npfrom labelme import u…使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地https://blog.csdn.net/herr_kun/article/details/86547081 ;

Original: https://blog.csdn.net/qq_48355075/article/details/122805677
Author: FT_M
Title: 使用labelme以任意形状标注多个目标后将目标逐一抠图并保存到本地

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/532497/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球