如何去除带浅条纹图像的暗区:cv2.threshold处理效果不佳求解决方案
可行处理方案
你之前用全局阈值效果不佳的核心原因是图像存在局部明暗差异,固定的阈值无法同时适配所有区域的浅条纹与暗区灰度差,可以参考以下几种处理思路:
- 自适应阈值替换全局阈值
针对局部灰度特性独立计算每个邻域的分割阈值,更适配这类存在明暗不均的图像场景,参考代码:th = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 2)
其中15为邻域计算块的大小,2为阈值校正偏移量,可根据实际输出效果微调这两个参数。如果需要保留条纹的灰度信息而不是输出二值图,把阈值类型替换为你之前用的THRESH_TOZERO即可。 - 背景差分消除暗区干扰
先通过大核高斯模糊提取不含条纹的背景明暗层,再用背景与原图做差分抵消暗区的整体灰度偏移,之后再做阈值分割就能轻松分离浅条纹:# 核尺寸需要大于条纹宽度,保证模糊后条纹被抹平仅保留背景明暗 background = cv2.GaussianBlur(gray, (51,51), 0) # 差分提取前景条纹信息 diff = cv2.subtract(background, gray) # 简单阈值分割得到最终结果,同样可替换阈值类型适配灰度保留需求 _, res = cv2.threshold(diff, 10, 255, cv2.THRESH_BINARY) - 形态学后处理优化结果
上述两种方法得到初步分割结果后,可以用小核的形态学开闭运算去除零散噪点,补全条纹的微小断裂处,参考代码:res = cv2.morphologyEx(res, cv2.MORPH_OPEN, np.ones((2,2), np.uint8))
内容的提问来源于stack exchange,提问作者Xinlong Wang
相关产品推荐
相关产品推荐

