图像处理中,"空间域" 指的是图像平面,因此,空间滤波 可定义为:在图像平面内对像素灰度值进行的滤波 

1  空间滤波 

1.1  滤波过程

    如图,Filter 是一个 3x3 滤波核,当它从图像的左上角开始,逐个像素沿水平方向扫描,最后到右下角时,便会产生滤波后的图像

       OpenCV 之 自定义滤波-LMLPHP

   假设输入图像 $f(x, y)$,滤波后的图像为  $g(x, y)$,则其中 $g(2,2)$ 和 $g(4,4)$ 的计算过程如下:

      OpenCV 之 自定义滤波-LMLPHP              OpenCV 之 自定义滤波-LMLPHP

    上图中,以像素 (4,4) 为中心的 3x3 邻域,和滤波核的向量点乘之积,即为 g(4,4) 

      g(4,4) = 240*0.1111 + 183*0.1111 + 0*0.1111 + 250*0.1111 + 12*0.1111 + 87*0.1111 + 255*0.1111 + 1*0.1111 + 94*0.1111

                 = 26.6666 + 20.3333 + 0 + 27.7777 + 1.3333 + 9.6666 + 28.3333 + 0 + 10.4444

                 = 124.55       

1.2  相关和卷积

    空间滤波中,相关和卷积,是容易混淆的概念,定义如下:

     -  相关 (Correlation),和上述的滤波过程一样,即 滤波核 逐行扫描图像,并计算 每个位置像素点积 的过程

     -  卷积 (Convolution),和 "相关" 过程类似,但 滤波核 要 先旋转 180°,然后再执行和 “相关” 一样的操作

           (二维中的旋转 180°,等于滤波核沿一个坐标轴翻转,然后再沿另一个坐标轴翻转)

          OpenCV 之 自定义滤波-LMLPHP

    注意:如果滤波核是对称的,则对图像进行相关和卷积的结果是一致的

2  OpenCV 函数

2.1  filter2D 函数

    在 OpenCV 中,可自定义滤波核,然后通过 filter2D() 来完成图像滤波

 void filter2D(
     InputArray     src,              // 输入图像 
     OutputArray    dst,              // 输出图像(大小和通道数,同 src)
     int            ddepth,           // 输出图像的 depth
     InputArray     kernel,           // 滤波核,准确地说,是相关核
     Point  anchor = Point(-1,-1),    // 锚点位置,滤波核尺寸为奇数时,不用指定,一般取默认值 Point(-1,-1);滤波核尺寸为偶数时,需指定锚点位置
     double             delta = 0,    // optional value added to the filtered pixels before storing them in dst      
     int borderType = BORDER_DEFAULT  // 边界处理方法
 );
08-25 13:29