使用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
相关产品推荐
相关产品推荐

