准备:含有众多json文件的文件夹
使用:代码中json_folder处写json文件夹地址(‘/’符号注意保留),png_folder处写png文件夹地址。
效果:json_folder文件夹包含批量生成的json文件夹,内部少了label.png图片,png_folder文件夹包含命名/改完像素(指改成单通道灰度图,像素值只有255和0)的png文件。
import os
import shutil
import numpy as np
import cv2
from PIL import Image
#json文件展开(转换)
json_folder = '/'
json_name = os.listdir(json_folder)
os.system("activate labelme")
for i in range(len(json_name)):
if(os.path.splitext(json_name[i])[1] == ".json"):
json_path = json_folder + json_name[i]
os.system("labelme_json_to_dataset " + json_path)
#json到png的批量命名/转移
png_folder= ''
os.makedirs(png_folder,exist_ok=True)
i = 1
for name in json_name:
if os.path.isdir(json_folder + name):
if i < 10: # 0-9
newname = "00" + str(i) + '.png'
elif i > 9 and i < 100: # 10-100
newname = "0" + str(i) + '.png'
elif i > 99 and i < 1000: # 100-1000
newname = str(i) + '.png'
i += 1
os.chdir(json_folder + name)
old_name = 'label.png'
os.rename(old_name, newname)
shutil.move(json_folder + name + "/" + newname, png_folder)
#改像素值
png_name = os.listdir(png_folder)
for name in png_name:
data_source = cv2.imread(png_folder +'/'+ name)
data = np.array(data_source)
img_path = png_folder + '/' + name
for i in range(data[:, :, 0].shape[0]):
for j in range(data[:, :, 0].shape[1]):
if data[:, :, 2][i][j] > 0 :
data[:, :, 2][i][j] = 255 #Red
data[:, :, 1][i][j] = 255 #Green
data[:, :, 0][i][j] = 255 #Blue
cv2.imwrite(img_path , data)
png = Image.open(img_path).convert('L').save(img_path)
我在做论文复现将其他数据集应用到该篇论文时,数据集缺少了分割时使用的真值图。所以使用labelme做好真值标签生成json文件,还需要将其转换成代码能够使用的png格式真值图,其中遇到的一些功能问题做了整合(我只是知识的缝合怪,参考博文在文末)。
labelme生成的json文件需要激活生成文件夹,内含四个文档。
四个文档中png格式的图片对我们是有用的,所以将每个json文件夹里的png提取到一个文件夹,完成转换。
由于是做分割的测试任务,用到原图和真值图的逐像素对比,需要两图一一对应。所以对图像命名也有相应规范,便于后续代码里sorted函数做排序,代码采用如下的命名格式(eg:000,010,200)。
经上述操作得到的是红色的真值图,需要将其转换为单通道的灰度图。这里使用逐通道修改像素值再转换为灰度图的方式,逻辑上复杂了一点,但也提供了不同通道修改像素值的思路。
img_path处写要看的图片地址,放大查看像素值,发现是单通道的灰度图则成,注意cv2.imread里的cv2.IMREAD_UNCHANGED要放置,否则灰度图也会被查看为RGB图。
import cv2
img_path = ''
img = cv2.imread(img_path,cv2.IMREAD_UNCHANGED)
cv2.imshow('photo',img)
key = cv2.waitKey(0)
1.批量转换/迁移
用python3脚本把labelme的json格式文件转png/xml格式文件_pyyniffler的博客-CSDN博客_json转png脚本
2.改像素值
python-修改图像的尺寸和RGB三个通道的像素值(opencv)_哗啦呼啦嘿的博客-CSDN博客_python修改图像像素大小
对文件夹下所有灰度图片进行像素值的修改_神晟的光辉的博客-CSDN博客