语义分割中经常会遇到图片格式转换的事情,labelme的json转换出来的mask是16位,训练的时候需要的mask一般是8位,如果要做离线数据增强的话,mask也要做增强,那么mask需要转换为24位,增强完毕以后,24位要转换为8位,以下三个脚本记录这些转换。
16位转8位
# _*_ coding: UTF-8 _*_
import os
import cv2
import natsort
import numpy as np
from skimage import io
input_file = "/xxx/" ### 由labelme转换出来的16位的mask文件夹路径
out_file = "/xxx/" ## 8位mask的文件夹路径
img_type = ".png"
dirs = os.listdir(input_file)
for name in natsort.natsorted(dirs):
print (name)
file_name = os.path.join(input_file,name)
print (file_name)
img = io.imread(file_name)
img = img.astype(np.uint8)
print (np.unique(img))
img = cv2.resize(img,(640,640),interpolation =cv2.INTER_LINEAR)
print (np.unique(img))
cv2.imwrite(os.path.join(out_file ,name.replace('mask','NB')),img)
8位转24位
# _*_ coding: UTF-8 _*_
import os
import cv2
import natsort
import numpy as np
from skimage import io
input_file = "/xxx/" ####8位 图片路径
out_file = "/xxx/" #### 24位图片路径
img_type = ".png"
dirs = os.listdir(input_file)
for name in natsort.natsorted(dirs):
print (name)
file_name = os.path.join(input_file,name)
print (file_name)
img=cv2.imread(file_name,0)
img[img==1] = 150 ##转24位的时候 为了将图片像素的差异看得更清楚一些 所以把第1类的值 由 1 转为150
img[img==2] = 250 ##转24位的时候 为了将图片像素的差异看得更清楚一些 所以把第2类的值 由 2转为250
aa = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
cv2.imwrite(os.path.join(out_file ,name),aa)
24位转8位
# _*_ coding: UTF-8 _*_
import os
import cv2
import natsort
import numpy as np
from skimage import io
input_file = "/mnt/xr/" ### 24位图路径
out_file = "/mnt/d/xx/" ## 8位图路径
img_type = ".png"
dirs = os.listdir(input_file)
for name in natsort.natsorted(dirs):
print (name)
file_name = os.path.join(input_file,name)
print (file_name)
img=cv2.imread(file_name)
bgr2gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print (np.unique(bgr2gray))
bgr2gray[bgr2gray==150] = 1
bgr2gray[bgr2gray==250] = 2
print (np.unique(bgr2gray))
cv2.imwrite(os.path.join(out_file ,name),bgr2gray)