低对比度16位灰度图像条纹提取及相邻条纹间距测算咨询
条纹提取与测量方案优化
核心需求
- 从16位灰度样本中提取条纹特征,输出效果匹配预设参考结果
- 后续完成两个测量需求:
- 统计右侧条纹的总数量
- 计算每根左侧条纹末端到相邻右侧条纹末端的距离
现有实现代码
import numpy as np import cv2 from matplotlib import pyplot as plt gray = cv2.imread('input_file.png',cv2.IMREAD_UNCHANGED) sobelY = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3) sobelY2 = cv2.Sobel(sobelY, cv2.CV_32F, 0, 1, ksize=3) sobelY2[sobelY2<0]=0 mask = np.where(sobelY2==0,0,1) sobelY2 = cv2.normalize(sobelY2, dst=None, alpha=0, beta=65535, norm_type=cv2.NORM_MINMAX).astype(np.uint16) clahe=cv2.createCLAHE(clipLimit=6, tileGridSize=(8,8)) sobelY2_clahe = clahe.apply(sobelY2) sobelY2_clahe = clahe.apply(sobelY2_clahe) result = np.where(mask!=0,sobelY2_clahe,0) fig = plt.figure(figsize=(10, 10)) ax = plt.subplot(121) plt.imshow(gray, cmap='gray') ax = plt.subplot(122) plt.imshow(result, cmap='gray') plt.show()
现有逻辑说明
- 图像读取:输入为16位灰度图,读取时保留原始格式避免精度损失
- 特征提取:采用Y方向二阶Sobel算子突出条纹边缘特征
- 对比度增强:连续两次使用CLAHE算法做局部对比度均衡
- 背景过滤:生成掩码将背景像素值置为0
- 现状:二阶Sobel输出已可呈现基础条纹特征,但与预期效果存在差距,需兼容更高难度的测试样本
优化方案
边缘提取环节优化
- 边缘检测前先对原图做5x5高斯模糊,过滤背景噪声,减少后续误识别的细碎边缘
- 可将二阶Sobel替换为
cv2.Laplacian()算子,对竖直方向条纹的边缘响应更均匀,参数可调性更强 - 增加非极大值抑制步骤,将加粗的条纹边缘细化为单像素宽度,降低后续末端定位和距离计算的误差
对比度处理环节优化
- 取消两次连续CLAHE操作,仅保留单次CLAHE,将
clipLimit下调至2~3,tileGridSize调整为(16,16),避免局部对比度过度增强引入噪声 - 可替换CLAHE为灰度拉伸+自适应阈值分割组合,先将Sobel输出的灰度范围拉伸到0~65535,再用OTSU阈值过滤低响应的背景噪声,稳定性优于反复调用CLAHE
后处理环节优化
- 拿到边缘图后,使用竖直方向的形态学核(如(7,1)矩形核)做开运算,过滤横向噪声点,保留连续的竖直条纹
- 对二值化后的条纹做连通域分析,过滤面积小于设定阈值的小连通域,直接剔除误识别的噪点
测量环节优化
- 条纹提取完成后,对图像右半区域做竖直方向像素投影,统计峰值数量即可得到右侧条纹总数
- 对每根条纹逐列扫描得到上下端点坐标,直接计算相邻左右条纹端点的欧氏距离即可完成测量需求
内容的提问来源于stack exchange,提问作者Xinlong Wang
相关产品推荐
相关产品推荐

