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

编程入门 行业动态 更新时间:2024-10-13 00:35:46

使用labelme以任意形状标注多个<a href=https://www.elefans.com/category/jswz/34/1770031.html style=目标后将目标逐一抠图并保存到本地"/>

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

1.使用labelme进行标注

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

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

        2.标注目标的命名为类别.<序号>。例如,如果有两个圆形,需要分别标注为:circle.1、circle.2(你也可以以其他形式,但我的代码是按照类别.<序号>编写的,如果你按照自己的方式命名,需要更改代码),这样后面才能逐一抠出,如果统标为circle则无法逐一抠出 。

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

2.代码

import json
import numpy as np
from labelme import utils
import cv2
import osdef 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_ROImasked_ROI = mask*ROIchannel_reverse = np.ones_like(masked_ROI)for i in range(channel_reverse.shape[2]):channel_reverse[:,:,-1-i] = masked_ROI[:,:,i]return channel_reversedef 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 = valuedata = 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文件的文件夹与代码文件应处于同一级目录,我的目录如下图:

 3.运行代码结果

         需要注意以下几点:

        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以任意形状标注多个目标后将目标逐一抠图并保存到本地

本文发布于:2024-02-07 03:02:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1752464.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:目标   多个   后将   形状   并保存

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!