不均匀光照下液滴边缘检测:寻求适配的背景减除方法
不均匀光照下液滴边缘检测解决方案
针对你提供的液滴图像(存在明显光照不均、背景明暗分布不均的问题),传统背景减法无法有效区分液滴与背景,这里提供两种可行的改进方案:
方案一:光照校正 + 自适应阈值分割
先对图像做光照补偿,消除背景光照不均的影响,再用自适应阈值分割提取液滴区域,最后提取轮廓。
修改后的代码如下:
Frame = cv2.rotate(Frame, cv2.ROTATE_90_CLOCKWISE) # 灰度转换与高斯模糊 GrayFrame = cv2.cvtColor(Frame, cv2.COLOR_BGR2GRAY) GrayFrame = cv2.GaussianBlur(GrayFrame, (5, 5), 0) # 光照校正:生成背景光照图(大核高斯模糊模拟光照分布) background_light = cv2.GaussianBlur(GrayFrame, (101, 101), 0) # 原图除以光照图并缩放,消除光照差异 corrected_frame = cv2.divide(GrayFrame, background_light, scale=255) # 自适应阈值分割(针对局部区域调整阈值) thresh = cv2.adaptiveThreshold(corrected_frame, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 形态学开运算去除噪声 kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1) # 查找外轮廓 cnts, heir = cv2.findContours(cleaned.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 可视化结果 cv2.imshow('校正后图像', corrected_frame) cv2.imshow('阈值分割结果', thresh) cv2.imshow('去噪后图像', cleaned)
方案二:直接使用Canny边缘检测
如果液滴边缘足够清晰,可跳过阈值分割,直接用Canny边缘检测提取边缘后再找轮廓:
Frame = cv2.rotate(Frame, cv2.ROTATE_90_CLOCKWISE) GrayFrame = cv2.cvtColor(Frame, cv2.COLOR_BGR2GRAY) GrayFrame = cv2.GaussianBlur(GrayFrame, (5, 5), 0) # Canny边缘检测(可根据实际图像调整阈值) edges = cv2.Canny(GrayFrame, 30, 150) # 形态学膨胀增强边缘连续性 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) edges = cv2.dilate(edges, kernel, iterations=1) # 查找外轮廓 cnts, heir = cv2.findContours(edges.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cv2.imshow('边缘检测结果', edges)
方案说明
- 方案一通过模拟背景光照分布,消除全局光照不均的影响,让液滴区域对比度更均匀,自适应阈值能精准分割目标;
- 方案二利用Canny边缘检测对局部光照变化的鲁棒性,直接提取液滴边缘,适合边缘清晰的场景。
内容的提问来源于stack exchange,提问作者skilfuel
相关产品推荐
相关产品推荐

