文章目录
- org.openpnp.vision.pipeline.stages.ThresholdAdaptive
- 功能
- 参数
- 例子
- 效果
- END
org.openpnp.vision.pipeline.stages.ThresholdAdaptive
功能
ThresholdAdaptive 是 OpenPnP 视觉管道中的一个自适应阈值二值化阶段,用于处理光照不均的图像。与固定阈值 Threshold 不同,它根据每个像素邻域的局部特性动态计算阈值,从而更好地分离前景和背景。
局部阈值计算:对每个像素,以其为中心的 blockSize × blockSize 邻域内计算均值或加权高斯和,减去常数 cParm 得到该像素的阈值。
二值化输出:将像素值与局部阈值比较,大于阈值的设为 255(白色),否则为 0(黑色),可选的 invert 参数反转黑白。
两种自适应方法:
Mean:邻域均值法。
Gaussian:邻域加权高斯和法(对中心像素权重更高)。
参数
| 参数名 | 数据类型 | 默认值 | 功能描述 |
|---|---|---|---|
adaptiveMethod | AdaptiveMethod | Mean | 自适应阈值算法。可选值:Mean(邻域均值)、Gaussian(邻域加权高斯和)。 |
invert | boolean | false | 是否反转二值化结果。false:前景为白色(255),背景为黑色(0);true:前景为黑色,背景为白色。 |
blockSize | int | 127 | 计算阈值所用的像素邻域尺寸。必须是奇数且 ≥ 3。实际值会被调整为不小于3的奇数。 |
cParm | int | 80 | 从计算出的局部均值或加权均值中减去的常数。可为负值,用于调整阈值灵敏度。 |
例子
importcv2importnumpy as np def generate_color_rects_image(output_path):"""生成彩色背景图像,包含多个不同尺寸、颜色、角度的旋转矩形(无网格线)""" width, height=800,600img=np.full((height, width,3),(240,240,240),dtype=np.uint8)# 浅灰色背景# 定义矩形列表:(中心x,中心y, 宽w,高h, 角度, 颜色BGR, 标签)rects=[(200,150,80,50,30,(0,0,255),"R1"),# 红色,80x50(600,150,60,40, -20,(0,255,0),"R2"),# 绿色,60x40(200,400,100,70,15,(255,0,0),"R3"),# 蓝色,100x70(600,400,90,60, -45,(0,255,255),"R4"),# 黄色,90x60(400,300,120,80,0,(255,255,0),"R5"),# 青色,120x80(太大)(150,80,30,20,60,(255,0,255),"R6"),# 紫色,30x20(太小)]for(cx, cy, w, h, angle, color, label)inrects: rect=((cx, cy),(w, h), angle)box=cv2.boxPoints(rect)box=np.array(box,dtype=np.int32)overlay=img.copy()cv2.fillPoly(overlay,[box], color)cv2.addWeighted(overlay,0.6, img,0.4,0, img)cv2.drawContours(img,[box],0,(0,0,0),2)cv2.putText(img, label,(cx-20, cy-10), cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,0),1)print(f"{label}: 宽={w}, 高={h}, 角度={angle}")cv2.imwrite(output_path, img)print(f"已生成彩色测试图像: {output_path}")if__name__=="__main__":generate_color_rects_image("color_rects_test.png")<cv-pipeline><stages><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="loadImage"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\color_rects_test.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="toGray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ThresholdAdaptive"name="adaptiveBin"enabled="true"adaptive-method="Mean"invert="false"block-size="11"c-parm="50"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageWrite"name="saveResult"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\adaptive_result.png"/></stages></cv-pipeline>效果
blockSize和cParm都不能太大,否则前后背景剥离的效果不好。
通过调整blockSize和cParm,可以得到非常干净的黑白线图。
可以看到,使用ThresholdAdaptive比Threshold要更自由。