灰度图读取_语义分割网络预测图调色板上色

1、简单的图像知识

灰度图像:每个像素占8位,像素值0-255

伪彩色图像:每个像素占8位,像素值0-255

真彩色图像:每个像素占24位,由RGB三通道的分量组成,每个通道分量占8位

为什么灰度图像和伪彩色图像像素都占8位,灰度图像没有颜色而伪彩色图像有颜色呢?因为灰度图像和伪彩色图像都对应一个索引表,这个索引表又叫调色板。图像的像素值就是索引。

灰度图读取_语义分割网络预测图调色板上色_第1张图片

上图是灰度图像的索引表,索引表不同的像素值对应的RGB值就是该像素的颜色,灰度图像的索引表中的RGB值都与像素值相同。同理,只要修改这些RGB数值,就可以显示伪彩色图像了。注意调色板的索引从0-255,因此,调色板的每个索引对应的RGB值都要进行设置。

2、Demo

在语义分割网络最后的预测图中,像素值取值范围一般为0-类别数。在上色过程中,就是自己新建一个索引表,让不同的像素值显示出不同的颜色。

import cv2
import os
import numpy as np
from PIL import Image

def colorful(img,save_path):
'''
img:需要上色的图片
save_path:存储路径
'''
    img = Image.fromarray(img) #将图像从numpy的数据格式转为PIL中的图像格式
    palette=[]
    for i in range(256):
        palette.extend((i,i,i))
    palette[:3*21]=np.array([[0, 0, 0],
                                [128, 0, 0],
                                [0, 128, 0],
                                [128, 128, 0],
                                [0, 0, 128],
                                [128, 0, 128],
                                [0, 128, 128],
                                [128, 128, 128],
                                [64, 0, 0],
                                [192, 0, 0],
                                [64, 128, 0],
                                [192, 128, 0],
                                [64, 0, 128],
                                [192, 0, 128],
                                [64, 128, 128],
                                [192, 128, 128],
                                [0, 64, 0],
                                [128, 64, 0],
                                [0, 192, 0],
                                [128, 192, 0],
                                [0, 64, 128]
                             ], dtype='uint8').flatten()
 
    img.putpalette(palette)
    img.save(save_path)

img = cv2.imread('/Users/yelinzong/Desktop/outdir/2008_000006.png',cv2.IMREAD_GRAYSCALE)
colorful(img, '/Users/yelinzong/Desktop/outcolordir/2008_000006.png')

注意:

上面的调色板只设置了0-21索引的RGB值,其余索引RGB设置为对应的索引值,因为这个代码主要用于对Pascal Voc数据集进行上色,该数据集只有21类,因此输出的预测图像素值最大只有21。

2008_000006.png是一张网络输出的预测图,像素值在0-21之间,没有进行上色。

利用opencv读取的图像格式为numpy.ndarray,像素值的格式为uint8

cv2.IMREAD_GRAYSCALE以单通道灰度图读取图像

上色注意:

(1)图像中像素值的格式必须为uint8,且为单通道。如果不是uint8进行格式强制转换。

效果图:

灰度图读取_语义分割网络预测图调色板上色_第2张图片

灰度图读取_语义分割网络预测图调色板上色_第3张图片

图片下载地址:

https://github.com/Mr-QingYe/Image/blob/master/2008_000006.png?raw=true

参考文献:

VOC2012 数据集 保存成彩色 调色盘 P模式 PIL Image​blog.csdn.net
灰度图读取_语义分割网络预测图调色板上色_第4张图片

你可能感兴趣的:(灰度图读取)