医学图像大部分是用3D Slicer来标注肺结节。但是由于有一批dcm转换出来的jpg格式图像,为了操作方便采用了labelme对图像进行标注。记录一下labelme批量转换json文件的方法。
一、批量转换json文件
首先我们可以知道,labelme转换json图像的方法为:
1、激活labelme环境
2、labelme_json_to_dataset.exe 转换单个json文件
因此在系统命令中,只要可以使用这两个命令,遍历所有的json文件,等于可以将所有的json文件转换为png格式的图像。
则有:
1、激活labelme环境:
os.system("activate labelme")
2、系统中调用转换命令:
os.system("labelme_json_to_dataset.exe %s" % (file))
3、遍历所的json文件,整个转换代码如下:
import os
import glob
json_file1 = 'C:/Users/User/Desktop/new_result/src' # 获取json文件一级地址
json_file2_list = os.listdir(json_file1) # 获取json文件二级地址列表
os.system("activate labelme") # 在os中激活labelme环境
for i in range(len(json_file2_list)): # 开始遍历所有的二级地址下的json文件
json_file1 = json_file2_list[i]
json_file_dir = json_file1 + '/' + json_file1 # 获取二级地址的json文件夹名
json_file = glob.glob(os.path.join(json_file_dir, "*.json")) # 获取所有的json文件
for file in json_file: # 遍历json文件
print(file)
os.system("labelme_json_to_dataset.exe %s" % (file)) # 转换json文件
说明:使用labelme是需要在conda下创建labelme环境的,因此将labelme环境下的python.exe编辑器导入pycharm,等于在labelme环境下进行编辑。使用labelme环境下的python编辑器运行上图的转换代码就可以了。对应的变量按照自己的需要进行更改。
二、批量提取出label文件
生成的json文件夹和json文件在同一个文件夹下,因此需要提取json文件夹下的label。
遍历所有的json文件夹 ,获取json文件夹下的label文件。代码如下:
import os
import cv2
def read_file(file_dir, save_file_dir):
'''
读取文件夹下的json文件夹,bmp文件,并进行分类
:param file_dir: json文件的一级文件夹
:param save_file_dir: 保存的文件夹地址
:return:
'''
file2_list = os.listdir(file_dir) # 获取二级文件夹名称列表
for i in range(len(file2_list)):
file2_dir = file_dir + '/' + file2_list[i]
save_file2_dir = save_file_dir + '/' + file2_list[i] # 创建保存label文件的二级地址
if not os.path.exists(save_file2_dir):
os.mkdir(save_file2_dir)
file3_list = os.listdir(file2_dir)
for j in range(len(file3_list)):
file3_name = file2_dir + '/' + file3_list[j]
if os.path.isdir(file3_name): # 因为json文件和生成的json文件夹在同一个文件夹下判断3级文件名为文件夹还是文件
# print('it is a dir')
name = file3_list[j].split('_') # 对json文件名进行分隔操作,获取文件名的序列号
num = name[0]
label_name = file3_name + '/label.png'
label = cv2.imread(label_name)
new_label_name = save_file2_dir + '/' + str(num) + '.bmp'
print(new_label_name)
cv2.imwrite(new_label_name, label)
def main():
file_dir = 'C:/Users/User/Desktop/new_result/src' # json文件夹的一级地址
save_file_dir = 'C:/Users/User/Desktop/new_result/label' # 保存label文件的一级地址
read_file(file_dir, save_file_dir)
if __name__ == '__main__':
main()