基于亮度差异的边缘检测与筛选:液体弓形波图像分析需求
液体弓形波轮廓自动化分析方案
针对你用高速相机拍摄的液体弓形波图像,要解决Canny检测出现的顶部光照伪边缘、小边缘干扰问题,同时提取轮廓像素坐标,可按以下步骤实现:
1. 消除光照不均,解决顶部伪边缘
顶部伪边缘来自光照亮度渐变,先做光照校正:
- 生成光照背景模板:对灰度原图做大核高斯模糊(比如
21x21,核大小根据图像尺寸调整),得到仅保留光照缓慢变化的背景图 - 图像归一化校正:将原图与背景图做除法运算(先归一化到0-1范围),再转回0-255,抵消光照衰减:
import cv2 import numpy as np gray = cv2.cvtColor(original_img, cv2.COLOR_BGR2GRAY) # 生成光照背景 bg = cv2.GaussianBlur(gray, (21,21), 0) # 校正光照不均 corrected = cv2.divide(gray, bg, scale=255)
2. 优化边缘检测,过滤小噪点
先做二值化减少干扰,再结合形态学操作清理边缘:
- Otsu自动阈值二值化:把液体区域和背景初步分离,减少非目标边缘:
_, binary = cv2.threshold(corrected, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
- Canny边缘检测:调整高低阈值(低阈值建议设为高阈值的1/3),比如:
edges = cv2.Canny(binary, 40, 120)
- 形态学清理:用闭运算填补边缘小缺口,开运算去除小噪点:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) edges_clean = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel) edges_clean = cv2.morphologyEx(edges_clean, cv2.MORPH_OPEN, kernel)
3. 筛选主边缘,去除小边缘干扰
通过轮廓面积筛选出弓形波的主轮廓:
- 提取所有外部轮廓:
contours, _ = cv2.findContours(edges_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- 保留面积最大的轮廓(即弓形波主轮廓):
# 过滤掉面积过小的轮廓,只保留最大的主轮廓 main_contour = max(contours, key=cv2.contourArea)
如果图像中存在多个较大轮廓,可结合轮廓的外接矩形宽高比进一步筛选,弓形波轮廓通常有特定的宽高比例
4. 提取轮廓像素坐标
将主轮廓转换为(x,y)像素坐标列表,可保存为文件供后续分析:
# 转换为像素坐标列表 pixel_coords = [tuple(point[0]) for point in main_contour] # 保存为CSV文件 import csv with open('wave_contour_coords.csv', 'w', newline='') as f: writer = csv.writer(f) writer.writerow(['x', 'y']) writer.writerows(pixel_coords)
额外优化建议
- 若光照不均情况复杂,可尝试CLAHE局部对比度增强,进一步弱化伪边缘:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) corrected_clahe = clahe.apply(gray)
- 批量处理时,可将上述步骤封装为函数,遍历图像文件夹自动完成所有分析
内容的提问来源于stack exchange,提问作者Celotos
相关产品推荐
相关产品推荐

