如何读取黑白图中黑线间的Sprite/Texture区域并实现数字填色
问题描述
我正尝试读取黑白图片中黑线之间的填充区域,不确定当前方法是否高效,想要实现数字填色效果:为所有区域添加编号,并与原始彩色图片的颜色匹配。
参考图片:


高效实现方案
1. 快速区域分割(基于黑白图)
- 先对黑白图做二值化处理:用OpenCV的
cv2.threshold()把黑线设为背景(黑色),填充区域设为前景(白色),也可以直接反转黑白图让填充区域变成黑色方便后续分析。 - 用连通区域分析识别独立区域:调用
cv2.connectedComponentsWithStats(),这个函数能一次性返回所有独立区域的编号、边界框、面积等信息,是目前最高效的区域识别方式,完全不需要手动遍历像素。- 注意:如果黑线有细微断点,可以先做一次形态学闭运算(
cv2.morphologyEx())补全黑线,避免区域被错误合并。
- 注意:如果黑线有细微断点,可以先做一次形态学闭运算(
2. 精准颜色匹配(对应彩色图)
- 对每个连通区域,取其中心坐标的像素颜色:通过区域的边界框计算中心位置,直接从彩色图中提取该点的RGB值,这种方式速度最快。
- 如果区域内颜色有渐变,可以取区域内所有像素的颜色平均值:用Numpy的切片操作批量提取区域像素,再求均值,比循环单个像素效率高很多。
3. 编号绘制与输出
- 在每个区域的中心位置绘制编号:用
cv2.putText()设置合适的字体大小和颜色(建议用黑色或白色,和区域颜色反差大的),确保编号清晰可见。 - 最终可以生成编号图,同时建立“编号-颜色”的映射表,方便后续填色验证。
核心优化建议
- 全程用OpenCV+Numpy的向量运算,避免Python循环遍历像素,这是提升效率的关键。
- 连通区域分析时,通过面积过滤掉极小的杂点区域,减少无效编号的生成。
内容的提问来源于stack exchange,提问作者sertacdncl
相关产品推荐
相关产品推荐

