JPG(92年):使用的一种失真压缩标准方法,24 bit真彩色,内容比GIF丰富,不支持动画、不支持透明色。JPEG的压缩方式通常是破坏性资料压缩(lossy compression),意即在压缩过程中图像的品质会遭受到可见的破坏。一张图片多次上传下载后,图片逐渐会失真。
优点
JPEG在色调及颜色平滑变化的相片或是写实绘画上可以达到它最佳的效果。在这种情况下,它通常比完全无失真方法作得更好,仍然可以产生非常好看的影像
缺点
它并不适合于线条绘图(drawing)和其他文字或图示(iconic)的图形,因为它的压缩方法用在这些图形的型态上,会得到不适当的结果;
PNG(96年):格式是无损数据压缩,PNG格式有8位、24位、32位三种形式,其中8位PNG支持两种不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基础上增加了8位透明通道(32-24=8),因此可展现256级透明程度。
优点
- 支持256色调色板技术以产生小体积文件
- 最高支持48位真彩色图像以及16位灰度图像。
- 支持Alpha通道的半透明特性。
- 支持图像亮度的gamma校正信息。
- 支持存储附加文本信息,以保留图像名称、作者、版权、创作时间、注释等信息。
- 使用无损压缩。
- 渐近显示和流式读写,适合在网络传输中快速显示预览效果后再展示全貌。
- 使用CRC循环冗余编码防止文件出错。
- 最新的PNG标准允许在一个文件内存储多幅图像。
缺点
- 但也有一些软件不能使用适合的预测,而造成过分臃肿的PNG文件。
教训: 根据目的选择合适的图片格式,否则你很难想到BUG竟然出现在保存的图片格式上
代码: 根据cityscapes数据集中json转labelimg
# 生成label图像
folder_label = '/content/data/label/'
folder_img = '/content/data/img/'
folder_path = '/content/data/'
file_list = os.listdir(folder_path)
label_dict = {'flat':0, 'human':1, 'vehicle':2, 'construction':3, 'object':4, 'nature':5, 'sky':6}
color = {'flat':(255,0,0), 'human':(255,128,0), 'vehicle':(255,255,0), 'construction':(0,255,0), 'object':(0,255,255), 'nature':(0,0,255), 'sky':(128,0,255)}
if len(os.listdir('/content/data/img')) <= 20:
for i in tqdm(file_list):
num = 0
name, type_ = os.path.splitext(i)
if type_ == '.json':
file_path = os.path.join(folder_path, i)
file = open(file_path).read()
file = json.loads(file)
imgHeight = file['imgHeight']
imgWidth = file['imgWidth']
# img = np.zeros((imgHeight, imgWidth, 3), np.uint8) # 二十四位彩图
img = np.zeros((imgHeight, imgWidth), np.uint8) # 八位图
img.fill(7)
# print(img.shape)
objects = file['objects']
for j in objects:
label = j['label']
contours = np.array(j['polygon'])
cv2.drawContours(img, [contours], -1,label_dict[str(label)], -1)
save_path = os.path.join(folder_label, str(name) + '.png')
cv2.imwrite(save_path, img)