如何使用OpenCV将线条分割的三区域JPG图像转为0/1/2值分割图
三区域像素值批量统一转换最简实现方案
你手里已经有对应标注文件的前提下,用Python+OpenCV写个轻量脚本批量处理是最省事的,不需要手动逐张调整,几十上百张图几秒就能跑完。
操作流程
- 先装运行依赖,命令行执行
pip install opencv-python numpy即可 - 核心逻辑是通过连通域检测自动识别被线条分割开的3个独立区域,按顺序给对应区域像素赋值0、1、2,不需要手动圈选区域
- 处理后的结果务必存为PNG格式,别存回JPG——JPG的有损压缩会篡改边缘像素值,没法保证区域内像素值完全统一
可直接运行的批量处理代码
import cv2 import numpy as np import os # 改成你自己的文件路径 annotation_folder = "标注文件所在文件夹路径" result_folder = "处理结果输出文件夹路径" os.makedirs(result_folder, exist_ok=True) for file_name in os.listdir(annotation_folder): if not file_name.lower().endswith(".jpg"): continue # 以灰度模式读取标注图 annot_img = cv2.imread(os.path.join(annotation_folder, file_name), 0) # 提取分割线条、做连通域识别,自动拆分3个独立区域 line_mask = (annot_img > 127).astype(np.uint8) region_count, region_label = cv2.connectedComponents(1 - line_mask) # 生成结果图,三个区域依次赋值0、1、2 output = np.zeros_like(region_label, dtype=np.uint8) current_val = 0 for label_id in range(1, region_count): if current_val >= 3: break output[region_label == label_id] = current_val current_val += 1 # 存为PNG格式避免像素值被压缩篡改 save_name = file_name.replace(".jpg", ".png") cv2.imwrite(os.path.join(result_folder, save_name), output)
如果你的标注文件里三个区域本身就是区分度很高的不同纯色,还能把连通域检测步骤删掉,直接按灰度值做映射赋值,处理速度会更快。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

