1. 焊缝图像采集与预处理
任务目标
本案例面向视觉引导焊接系统,完成焊缝图像的采集方案设计,并实现灰度化、滤波与增强预处理流程,为后续焊缝特征提取与定位提供高质量输入图像。
环境与依赖
- Python 3.8+,OpenCV 4.5+,NumPy 1.20+
- 图像采集:USB工业相机(如海康威视MV-CA013-20UC),通过OpenCV VideoCapture调用
- 若暂无相机,可使用本地焊缝图像文件验证预处理流程
图像采集方案
采用工业相机配合LED条形光源,以低角度(约15°~30°)照射焊缝区域,减少反光与弧光干扰。相机光轴与焊缝法线夹角控制在5°以内,采集分辨率设为1280×960,帧率30fps。曝光时间根据环境光自动调整,建议初始值5000μs,增益不超过12dB以避免噪声放大。
预处理流程与关键代码
预处理流程为:灰度化 → 中值滤波 → 直方图均衡化 → 伽马校正。灰度化将三通道图像转为单通道,降低计算量;中值滤波在去噪同时保留焊缝边缘锐度;直方图均衡化增强对比度;伽马校正补偿低灰度区域细节,使焊缝坡口与母材边界更清晰。
import cv2
import numpy as np
def capture_frame(camera_id=0, width=1280, height=960):
"""从工业相机采集一帧图像,返回BGR格式"""
cap = cv2.VideoCapture(camera_id)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
ret, frame = cap.read()
cap.release()
if not ret:
raise RuntimeError("相机采集失败,请检查连接")
return frame
def preprocess_weld_image(bgr_img, gamma=1.5):
"""
焊缝图像预处理主流程
输入: BGR图像
输出: 增强后的单通道灰度图
"""
# 1. 灰度化
gray = cv2.cvtColor(bgr_img, cv2.COLOR_BGR2GRAY)
# 2. 中值滤波去噪(核大小5,保留边缘)
denoised = cv2.medianBlur(gray, 5)
# 3. 直方图均衡化增强对比度
equalized = cv2.equalizeHist(denoised)
# 4. 伽马校正提升暗部细节
look_up_table = np.array([
((i / 255.0) ** (1.0 / gamma)) * 255 for i in range(256)
]).astype("uint8")
enhanced = cv2.LUT(equalized, look_up_table)
return enhanced
if __name__ == "__main__":
# 方式一:从相机实时采集
# frame = capture_frame(0)
# 方式二:从本地文件读取(验证用)
frame = cv2.imread("weld_seam.jpg")
if frame is None:
raise FileNotFoundError("未找到weld_seam.jpg,请放置焊缝图像")
result = preprocess_weld_image(frame)
# 保存结果用于对比
cv2.imwrite("weld_preprocessed.jpg", result)
print("预处理完成,结果已保存为 weld_preprocessed.jpg")
运行与验证
- 安装依赖:
pip install opencv-python numpy - 将一张焊缝原始图像命名为
weld_seam.jpg放在脚本同目录 - 运行脚本:
python weld_preprocess.py - 观察输出文件
weld_preprocessed.jpg,与原图对比
通过判定标准:预处理后图像中焊缝坡口边缘与母材背景的灰度差异明显增大,焊缝区域纹理细节(如坡口边界线)肉眼可辨,且无明显椒盐噪声残留。若使用相机实时采集,程序能正常读取一帧图像并完成上述处理,即视为采集与预处理链路打通。
常见问题
- 图像过暗或过曝:调整相机曝光时间(建议2000~10000μs范围)或光源亮度,确保焊缝区域灰度均值在100~180之间。
- 滤波后边缘模糊:中值滤波核从5降至3,或改用双边滤波(cv2.bilateralFilter)在去噪同时保护边缘。
- 弧光干扰严重:在相机镜头前加装窄带滤光片(中心波长与光源一致),并在软件中增加ROI裁剪,仅保留焊缝附近区域。