python计算图片中的各颜色的百分比,并绘制图例

计算图片中各种颜色的百分比

def cal_percent(image):
    '''计算图像各颜色百分比'''

    rgb = {}
    name = ade20k_labels.ade20K_color2lable #这个是颜色列表,自行创建一个即可
    for row in range(image.shape[0]):
        for col in range(image.shape[1]):
            if (name[tuple(image[row, col])] not in rgb) or (row == 0 and col == 0):
                rgb[name[tuple(image[row, col])]] = [1, tuple(image[row, col])] 
            else:
                rgb[name[tuple(image[row, col])]][0] = rgb[name[tuple(image[row, col])]][0] + 1

    num  = 0            
    for k in rgb:
        num = num + 1
        rgb[k][0] = str('{:.4f}%'.format(rgb[k][0] / 9600))
        #rgb[k][0] = rgb[k][0] / 9600
    
    print(rgb)
    return rgb, num

创建图例,并进行拼接

def write_image(img, write_contents, text_size=10):
    '''在图片中写上文字'''

    #设置字体(从windows/font中查找自己所需要的字体)
    fontpath = 'font/simsun.ttc'#(宋体)
    font = ImageFont.truetype(fontpath, text_size) #设置字体为ImageDeaw.draw()服务
    if type(img) is np.ndarray:
        image = Image.fromarray(img) #array转换成Image(反过来则使用np.array())
    else:
        image = img
    draw = ImageDraw.Draw(image)
    #绘制文字信息
    draw.text((0,0), write_contents, font=font, fill=(0, 0, 0))

    return img

def create_rectangle(shape, color, text, text_size=10):
    '''创建正方形'''

    rectangle = Image.new('RGB', shape, color)
    rectangle = write_image(rectangle, text, text_size)
    return rectangle

def legend(image, text_size=10):
    ''' 创建图例 '''

    #计算图像的各颜色百分比
    shape = np.array(image).shape
    h = int(shape[1] / 10)
    print(shape)

    rgb, num = cal_percent(np.asarray(image))
    print(num)
    img = Image.new('RGB', (shape[1], int(num / 10 + 1) * 60), (96, 96, 96)) #第二个参数为(height,width)
    img2 = Image.new('RGB', (shape[1], int(num / 10 + 1) * 60 + shape[0]), (255, 255, 255))
    print(img2) 

    #绘制图例
    for i, k in enumerate(rgb):
        if i % 10 == 0:
            count1 = 0
        else:
            count1 = count1 + 1
        text = k + '(' + rgb[k][0] + ')'
        rectangle = create_rectangle((h - 20, 30), rgb[k][1], text, text_size)
        coordination = (count1 * h, 30 + int(i / 10) * 60) #第二个参数为(height,width)
        img.paste(rectangle, coordination)
    
    img2.paste(image, (0, 0))
    img2.paste(img, (0, shape[0]))
    return img2

代码调用

image = Image.open('此处填写打开文件的路径')
image = legend(image)
imageio.imsave('此处填写保存文件的路径', image)

效果图展示

原始图片:在这里插入图片描述

添加图例后的图片:
在这里插入图片描述


版权声明:本文为wuduo294原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。