4. 图像对高斯滤波
任务说明
本案例针对双目相机采集的左右视图,实现高斯滤波去噪处理。输入为同一时刻拍摄的左右两张灰度图像(或彩色图像,处理时按通道独立操作),输出为滤波后的左右图像,要求保留图像边缘结构的同时抑制高斯噪声。滤波核大小与标准差作为可配置参数,便于后续立体匹配前处理环节调用。
实现方案
采用OpenCV库提供的高斯滤波函数,其核心原理是利用二维高斯核与图像做卷积运算。二维高斯核由水平与垂直方向的一维高斯函数乘积构成,标准差σ决定核的权重分布,核尺寸越大、σ越大,平滑效果越强但细节损失也越多。本案例封装一个通用函数,接收左右图像路径、核尺寸与σ,输出滤波结果并保存,同时显示滤波前后的对比信息。
代码实现
import cv2
import numpy as np
import os
def gaussian_filter_stereo(left_path, right_path, ksize=(5,5), sigmaX=1.5, output_dir="output"):
"""
对双目图像对执行高斯滤波去噪
参数:
left_path: 左图像文件路径
right_path: 右图像文件路径
ksize: 高斯核大小,必须为正奇数
sigmaX: X方向标准差,若为0则根据核大小自动计算
output_dir: 输出目录
返回:
(filtered_left, filtered_right): 滤波后的左右图像数组
"""
# 校验核尺寸
if ksize[0] % 2 == 0 or ksize[1] % 2 == 0:
raise ValueError("高斯核尺寸必须为正奇数")
# 读取图像
left_img = cv2.imread(left_path)
right_img = cv2.imread(right_path)
if left_img is None or right_img is None:
raise FileNotFoundError("无法读取图像,请检查路径")
# 应用高斯滤波
filtered_left = cv2.GaussianBlur(left_img, ksize, sigmaX)
filtered_right = cv2.GaussianBlur(right_img, ksize, sigmaX)
# 保存结果
os.makedirs(output_dir, exist_ok=True)
left_name = os.path.splitext(os.path.basename(left_path))[0]
right_name = os.path.splitext(os.path.basename(right_path))[0]
left_out = os.path.join(output_dir, f"{left_name}_gaussian.png")
right_out = os.path.join(output_dir, f"{right_name}_gaussian.png")
cv2.imwrite(left_out, filtered_left)
cv2.imwrite(right_out, filtered_right)
print(f"左图滤波结果已保存: {left_out}")
print(f"右图滤波结果已保存: {right_out}")
return filtered_left, filtered_right
if __name__ == "__main__":
# 示例:处理双目图像对
# 请将以下路径替换为实际图像路径
left_path = "stereo_left.png"
right_path = "stereo_right.png"
# 使用5x5核,标准差1.5进行滤波
filtered_l, filtered_r = gaussian_filter_stereo(
left_path, right_path,
ksize=(5,5), sigmaX=1.5
)
# 可选:显示结果(需图形界面环境)
# cv2.imshow("Filtered Left", filtered_l)
# cv2.imshow("Filtered Right", filtered_r)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
关键参数说明
- 核尺寸(ksize):建议取(3,3)、(5,5)或(7,7)。核越大,去噪越强,但图像越模糊。
- 标准差(sigmaX):一般取1.0~2.0。σ越大,平滑范围越广。若设为0,OpenCV会根据核尺寸自动计算。
- 图像格式:支持8位灰度或BGR彩色图像,滤波时各通道独立处理。
验证方法
准备一张包含噪声的双目图像对(可用原图叠加高斯噪声模拟),运行上述代码。验证标准:
- 程序正常结束,输出目录下生成两张滤波后的PNG图像;
- 滤波后图像的噪声明显减少,图像整体变平滑;
- 图像中的边缘轮廓(如物体边界)仍清晰可辨,未出现严重模糊失真;
- 左右视图的滤波参数一致,保证后续立体匹配时左右图像的空间对齐关系不被破坏。
判定标准
运行代码后,若输出图像中的颗粒状噪声显著减少,且图像边缘未出现明显振铃或过度模糊,同时左右视图处理参数完全一致,即可判定本案例目标达成。该滤波结果可直接作为后续立体匹配算法的预处理输入。