json文件转png图片(批量转换/图片命名/迁移/改像素值)【tips】

 一.代码

准备:含有众多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格式真值图,其中遇到的一些功能问题做了整合(我只是知识的缝合怪,参考博文在文末)。

1.json文件激活

labelme生成的json文件需要激活生成文件夹,内含四个文档。

2.转换/命名/迁移

四个文档中png格式的图片对我们是有用的,所以将每个json文件夹里的png提取到一个文件夹,完成转换。

由于是做分割的测试任务,用到原图和真值图的逐像素对比,需要两图一一对应。所以对图像命名也有相应规范,便于后续代码里sorted函数做排序,代码采用如下的命名格式(eg:000,010,200)。

3.修改像素值

经上述操作得到的是红色的真值图,需要将其转换为单通道的灰度图。这里使用逐通道修改像素值再转换为灰度图的方式,逻辑上复杂了一点,但也提供了不同通道修改像素值的思路。

4.检查

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博客

你可能感兴趣的:(tips,python,pytorch)