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

基于亮度差异的边缘检测与筛选:液体弓形波图像分析需求

液体弓形波轮廓自动化分析方案

针对你用高速相机拍摄的液体弓形波图像,要解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 08:47:39