盒式过滤器的平滑内核大小

Smoothing kernel size for box filter

对于 OpenCV 中的框滤波器,平滑内核大小可以通过 cv2.boxFilter() 中的 ksize 参数定义。我想知道ksize到底是X、Y正方向还是原点附近的尺寸?

在上图中 - ksize 应该是 (1, 1),正确吗?还是应该是 (0.5, 1)?例如,对于宽度为 5 的两个方向,ksize 应该是 (5, 5) 还是 (10, 5)?对于上述情况,我希望正负 X 方向的宽度均为 5,而 y 方向的高度均为 5。我认为 y 无论如何都应该为 5,因为盒式过滤器的负 y 并没有多大意义。

通过测试boxFilter的脉冲响应很容易发现。设 x 为 9x9 图像

>>> x
array([[0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.]])

然后 运行 boxFilter with ksize=(5,5) 作为 cv2.boxFilter(x, 6, (5,5)) 产生

array([[0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
       [0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
       [0.  , 0.  , 0.04, 0.04, 0.04, 0.04, 0.04, 0.  , 0.  ],
       [0.  , 0.  , 0.04, 0.04, 0.04, 0.04, 0.04, 0.  , 0.  ],
       [0.  , 0.  , 0.04, 0.04, 0.04, 0.04, 0.04, 0.  , 0.  ],
       [0.  , 0.  , 0.04, 0.04, 0.04, 0.04, 0.04, 0.  , 0.  ],
       [0.  , 0.  , 0.04, 0.04, 0.04, 0.04, 0.04, 0.  , 0.  ],
       [0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ],
       [0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  , 0.  ]])

就像Cris说的,ksize是box的全宽和全高,filter是居中的