You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不均匀光照下液滴边缘检测:寻求适配的背景减除方法

不均匀光照下液滴边缘检测解决方案

针对你提供的液滴图像(存在明显光照不均、背景明暗分布不均的问题),传统背景减法无法有效区分液滴与背景,这里提供两种可行的改进方案:

方案一:光照校正 + 自适应阈值分割

先对图像做光照补偿,消除背景光照不均的影响,再用自适应阈值分割提取液滴区域,最后提取轮廓。

修改后的代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:25:17