
在自己的新建的虚拟环境中,安装以下包
1. pip install labelme
2. pip install pyqt5
3. pip install pillow==4.0.0
二、示例步骤演示
2.点击save,进行保存
1.opencv-python读取图片和lableme标注的json文件并显示mask
import cv2
import numpy as np
import json
json_path = './1.json' # json文件的路径
img_path = './1.jpg' # 图片的路径
labelme_json = json.load(open(json_path, encoding='utf-8')) # 读取json文件
img = cv2.imread(img_path) # 读取图片
# (2160, 3840, 3) 图片的高为2160, 宽为3840
mask = np.zeros((2160, 3840, 1), dtype=np.uint8)
mask2 = np.zeros((2160, 3840, 3), dtype=np.uint8)
points = labelme_json['shapes'][0]['points'] # 拿出第一个物体的坐标
points = np.array(points) # 转化成ndarray
points = points.reshape(-1, 1, 2) # : (18, 1, 2)
points = points.astype(np.int32) # 把坐标点的类型由float64转化为int32
cv2.fillConvexPoly(mask, points, (255,)) # 单个多边形填充,
cv2.fillConvexPoly(mask2, points, (255, 255, 255))
# 显示mask
cv2.namedWindow("mask", 2) # WINDOW_NORMAL参数可以手动改变窗口的大小
cv2.imshow('mask', mask)
cv2.waitKey(0)
# new_image = cv2.bitwise_and(img, mask)
new_image = cv2.bitwise_and(img, mask2) # 对图像(灰度图像或彩色图像)每个像素值进行二进制“与” *** 作
# new_image[mask2==255] = 100
# 显示mask区域图像
cv2.namedWindow("new_image", 2)
cv2.imshow('new_image', new_image)
cv2.waitKey(0)
2.画 mask( json文件由 labelme 标注 )
3.将使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果(参考这个,这个相当于是用labelme中的命令进行可视化)
使用labelme标注的json文件可视化,源图像与标签图像叠加,用于查看标注效果
# 1.单文件json格式标签转为png格式
'''
直接cmd终端运行:
labelme_json_to_dataset 文件名.json
可得到一个文件夹,有4个文件
img.png,源文件图像
label.png,标签图像
label_names.txt,标签中的各个类别的名称
label_viz.png,源文件与标签融合文件
注:JPG是有损压缩,而PNG是无损压缩,png图像会大于jpg图像。
'''
import os
import shutil
# 2.批量json格式标签转为png格式
# os模块多次调用CMD命令,os.popen() 或 os.system()
# 多次调用labelme_json_to_dataset,为每个json生成一个目录文件(包含4个文件)
def json2png(json_folder, root_folder):
# 获取文件夹内的文件名
FileNameList = os.listdir(json_folder)
print(FileNameList)
# 激活labelme环境
os.system("activate labelme")
for i in range(len(FileNameList)):
# 判断当前文件是否为json文件
x = os.path.splitext(FileNameList[i])
if (x[1] == ".json"):
json_file = os.path.join(json_folder, FileNameList[i])
out_file = os.path.join(root_folder, x[0] + '_json')
# 将该json文件转为png
# 用法:labelme_json_to_dataset [-h] [-o OUT] json_file
os.system("labelme_json_to_dataset " + ' -o ' + out_file + ' ' + json_file)
# 3.将文件批量转化成标准格式(即,所有原图像一个文件夹,所有label一个文件夹,所有可视化图像一个文件夹)
def file_split(folder):
root_folder, Paste_PNG_folder, Paste_label_folder, Paste_label_viz_folder = folder[0], folder[1], folder[2], folder[
3]
# 获取文件夹内的文件名
PathNameList = os.listdir(root_folder)
print(PathNameList)
NewFileName = 1
for i in range(len(PathNameList)):
# 判断当前文件是否为json文件
x_folder = os.path.splitext(PathNameList[i])[0]
print(x_folder)
img_file = os.path.join(root_folder, x_folder)
print(img_file)
FileNameList = os.listdir(img_file)
# print(FileNameList)
# 复制img.png文件
PNG_file = os.path.join(img_file, "img.png")
new_PNG_file = Paste_PNG_folder + "\" + str(NewFileName) + ".png"
shutil.copyfile(PNG_file, new_PNG_file)
# 复制label.png文件
label_file = os.path.join(img_file, "label.png")
new_label_file = Paste_label_folder + "\" + str(NewFileName) + ".png"
shutil.copyfile(label_file, new_label_file)
# 复制label_viz.png文件
label_viz_file = os.path.join(img_file, "label_viz.png")
new_label_viz_file = Paste_label_viz_folder + "\" + str(NewFileName) + ".png"
shutil.copyfile(label_viz_file, new_label_viz_file)
# 文件序列名+1
NewFileName = NewFileName + 1
if __name__ == '__main__':
json_folder = "./"
# 保存中间生成文件的文件夹, 每个子目录下有4个文件:img.png,label.png,label_names.txt,label_viz.png
root_folder = "./spore"
# 保存最终生成文件的文件夹,原图像、label、label_viz
Paste_PNG_folder = "./img1"
Paste_label_folder = "./label1"
Paste_label_viz_folder = "./label_viz"
folder = [root_folder, Paste_PNG_folder, Paste_label_folder, Paste_label_viz_folder]
for folder_x in folder:
if not os.path.exists(folder_x):
os.makedirs(folder_x)
# 用json生成png
json2png(json_folder, root_folder)
# 文件分开
file_split(folder)
4.自己想实现的功能,直接从打标签生成的json文件中,读取坐标点的信息,然后根据坐标点的信息,进行多边形的绘制。
自己实现的代码:
import json
import cv2
from matplotlib import pyplot as plt
from matplotlib.cbook import pts_to_midstep
import numpy as np
print(cv2.__version__)
label_json = json.load(open('1.json', encoding='utf-8'))
value = label_json['shapes']
length = len(value)
img = cv2.imread(r'1.jpg')
fig = img.copy()
all = []
for i in range(length):
points = value[i]['points']
pts = np.array(points, dtype=np.int)
# print(type(new_points))
# pts = pts.reshape((-1, 1, 2))
# print(pts)
all.append(pts)
# print(fig.shape)
# print(sum(fig - img))
# print(sum(fig - img).shape)
# print(sum(sum(fig - img)))
# cv2.polylines(fig, [pts], isClosed=True, color=(255, 125, 125), thickness=5)
# print(sum(sum(fig - img)))
cv2.polylines(fig, all, isClosed=True, color=(255, 125, 125), thickness=5)
cv2.namedWindow('image', 2)
cv2.imshow('image', fig)
cv2.waitKey(0)
要注意dtype的类型要转化成np.int,cv2.polylines()第二个参数的形式[pts]。
import json
import cv2
import numpy as np
print(cv2.__version__)
label_json = json.load(open('1.json', encoding='utf-8'))
# print(label_json)
# print(label_json.keys())
value = label_json['shapes']
# print(value)
# print(len(value))
length = len(value)
# print(length)
for i in range(length):
points = value[i]['points']
# print(points)
# print(type(points))
pts = np.array(points, dtype=np.int)
# print(type(new_points))
# pts = pts.reshape((-1, 1, 2))
# print(pts)
img = cv2.imread(r'1.jpg')
fig = img.copy()
# print(fig.shape)
print(sum(fig - img))
print(sum(fig - img).shape)
print(sum(sum(fig-img)))
cv2.polylines(fig, [pts], isClosed=True, color=(255, 125, 125), thickness=5)
print(sum(sum(fig-img)))
cv2.namedWindow('image', 2)
cv2.imshow('image', fig)
cv2.waitKey(0)
break
# 此处只画了一个目标
# cv2.fillPoly()的使用注意事项同cv2.polylines
import json
import cv2
from matplotlib import pyplot as plt
import numpy as np
label_json = json.load(open('./1.json', encoding='utf-8'))
value = label_json['shapes']
length = len(value)
for i in range(length):
points = value[i]['points']
new_points = np.array(points, dtype=np.int)
# print(type(new_points))
# print(new_points)
img = cv2.imread('./1.jpg')
cv2.fillPoly(img, [new_points], (2, 255, 255))
cv2.namedWindow("draw_0", 2)
cv2.imshow("draw_0", img) # 显示画过矩形框的图片
cv2.waitKey(0)
cv2.destroyWindow("draw_0")
break
5.[详细教程]新版labelme标注后的json文件,提取不同的标签后批量注入到新的背景中作为人工数据集
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)