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彩色图像,滤波时各通道独立处理。

验证方法

准备一张包含噪声的双目图像对(可用原图叠加高斯噪声模拟),运行上述代码。验证标准:

  1. 程序正常结束,输出目录下生成两张滤波后的PNG图像;
  2. 滤波后图像的噪声明显减少,图像整体变平滑;
  3. 图像中的边缘轮廓(如物体边界)仍清晰可辨,未出现严重模糊失真;
  4. 左右视图的滤波参数一致,保证后续立体匹配时左右图像的空间对齐关系不被破坏。
双目图像高斯滤波处理流程 左视图 stereo_left.png 含噪声 右视图 stereo_right.png 含噪声 高斯滤波 cv2.GaussianBlur 核: (5,5) σ = 1.5 滤波后左图 left_gaussian.png 噪声抑制 滤波后右图 right_gaussian.png 噪声抑制 可调参数 核尺寸 / σ 影响平滑程度 验证

判定标准

运行代码后,若输出图像中的颗粒状噪声显著减少,且图像边缘未出现明显振铃或过度模糊,同时左右视图处理参数完全一致,即可判定本案例目标达成。该滤波结果可直接作为后续立体匹配算法的预处理输入。