labelme的使用
打开labelme
- 在anaconda prompt中输入
labelme
- labelme打开界面
利用labelme获得json文件
- 打开目录文件
- 利用labelme标注
- 先绘制多边形在标注标签
然后保存这样就会得到我们的json文件
- 先绘制多边形在标注标签
json文件的操作
numpy_24">json文件转numpy文件
下面这个代码可以将json文件转换为numpy文件
python">import numpy as np
import cv2
import os
import jsondef json_to_mask(img_path, json_path, mask_value=1):"""生成掩码"""img = cv2.imread(img_path) #读取图片if img is None:raise FileNotFoundError(f"图片读取失败: {img_path}")h, w = img.shape[:2] #切片操作获取图片的高度和宽度mask = np.zeros((h, w), dtype=np.uint8)with open(json_path, 'r', encoding='utf-8') as f:data = json.load(f)for shape in data.get('shapes', []):points = np.array(shape['points'], dtype=np.int32)cv2.fillPoly(mask, [points], color=mask_value)return maskdef process_directory(json_folder_path,image_folder_path, mask_root, mask_value):os.makedirs(mask_root,exist_ok=True)for files in os.listdir(json_folder_path):if files.endswith('.json'):json_path = os.path.join(json_folder_path,files)for files in os.listdir(image_folder_path):if files.endswith('.jpg'):image_path = os.path.join(image_folder_path,files)base_name = os.path.splitext(files)[0]mask_path = os.path.join(mask_root, f"{base_name}.npy")mask = json_to_mask(image_path,json_path,mask_value)np.save(mask_path,mask)
利用process_directory函数可以批量转换json文件为numpy文件
输入是json文件夹路径,图片文件夹路径,输出文件夹路径,掩码标签
不过要注意的是json文件和图片文件的名字要对应上
json文件转图片
python">import os
import numpy as np
import matplotlib.pyplot as plt# 定义包含 .npy 文件的文件夹路径
folder_path = "./numpy"
# 定义保存图像的文件夹路径
output_folder = "./images"# 如果输出文件夹不存在,则创建它
if not os.path.exists(output_folder):os.makedirs(output_folder)# 遍历文件夹中的所有文件
for filename in os.listdir(folder_path):if filename.endswith('.npy'):# 构建完整的文件路径file_path = os.path.join(folder_path, filename)# 从 .npy 文件中加载 numpy 矩阵matrix = np.load(file_path)# 显示矩阵对应的图像(可根据需要选择是否显示)plt.imshow(matrix, cmap='gray')# 关闭坐标轴plt.axis('off')# 构建输出图像的文件名output_filename = os.path.splitext(filename)[0] + '.png'output_path = os.path.join(output_folder, output_filename)# 保存图像plt.imsave(output_path, matrix, cmap='gray')# 关闭当前图像窗口,避免内存占用plt.close()print("批量处理完成!")
如果需要用这个代码的话需要改变folder_path和output_folder为你自己的文件夹路径