You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用extcolors提取图像颜色时如何排除纯白与纯黑颜色

线稿图像有效颜色占比统计方案(排除黑白无效色)

核心处理逻辑

  • 颜色提取完成后直接过滤白色(255,255,255)背景、黑色(0,0,0)线条两类无效颜色
  • 放弃原全图像素作为统计基数,改用所有有效颜色的像素总和作为占比分母,重新计算各颜色权重

依赖安装

先安装所需第三方库:

pip install extcolors pillow

可直接运行的实现代码

import extcolors

def get_line_art_valid_colors(image_path, color_tolerance=12):
    """
    提取线稿类图像的有效填色占比,自动排除黑、白两类无效色
    :param image_path: 线稿图像路径
    :param color_tolerance: 颜色合并容差,存在抗锯齿杂色时可适当调高到15-20
    :return: 有效颜色列表(元素为(RGB值, 占比百分比))、有效颜色总像素数
    """
    # 提取全图所有颜色及对应像素数
    raw_colors, _ = extcolors.extract_from_path(
        image_path,
        tolerance=color_tolerance,
        limit=None
    )

    # 定义需要排除的无效色集合
    INVALID_RGB = {(0, 0, 0), (255, 255, 255)}
    # 过滤得到有效颜色列表
    valid_colors = [color_item for color_item in raw_colors if color_item[0] not in INVALID_RGB]
    # 计算有效颜色的总像素,作为占比计算的新基数
    valid_pixel_total = sum([pixel_cnt for (_, pixel_cnt) in valid_colors])

    # 重新计算各有效颜色的真实占比
    result = []
    for rgb, pixel_cnt in valid_colors:
        ratio = round(pixel_cnt / valid_pixel_total * 100, 2)
        result.append((rgb, ratio))
    
    return result, valid_pixel_total

# 调用示例
if __name__ == "__main__":
    color_result, valid_pixel_count = get_line_art_valid_colors("你的线稿文件路径.png")
    print(f"有效填色总像素基数:{valid_pixel_count}")
    print("各颜色占比:")
    for rgb, ratio in color_result:
        print(f"RGB{rgb}:{ratio}%")

可选扩展:RGB转十六进制色值

如果需要输出网页常用的十六进制色值,可添加如下转换函数,在输出环节调用即可:

def rgb_to_hex(rgb_tuple):
    return "#{:02x}{:02x}{:02x}".format(*rgb_tuple)

效果说明

原默认提取逻辑以全图像素为统计基数,线稿中白色背景占比通常在90%以上,会导致彩色填色的占比被严重压缩,无法反映填色区域的真实构成。以上方案修正统计基数后,占比计算仅针对彩色填色区域,例如原全图占比0.8%的红色、2.4%的蓝色,修正后占比分别为25%、75%,和实际视觉占比一致。

内容的提问来源于stack exchange,提问作者Fernando Moreira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:06:31