opencv boxFilter或blur如何处理图像borading?

时间:2017-07-27 10:03:04

标签: opencv

我试图实现我的个人模糊过滤器,但是我对登上图像时cv2.blur的详细实现感到困惑。在我的代码中,我将图像中的那些像素视为0,这在CNN中执行填充操作。但是,似乎OpenCV做了不同的操作。这是我的实施:

def _blur2D(I, r):
    """
    Helper method of blur2D
    """
    (rows, cols) = I.shape
    ret = np.zeros_like(I, dtype=np.float32)

    I_cum = np.cumsum(I, axis=0)
    ret[0:r+1, :] = I_cum[r:2*r+1, :]
    ret[r+1:rows-r, :] = I_cum[2*r+1:rows, :] - I_cum[0:rows-2*r-1, :]
    ret[rows-r:rows, :] = np.tile(I_cum[rows-1, :], (r, 1)) - \
                          I_cum[rows-2*r-1:rows-r-1, :]

    I_cum = np.cumsum(ret, axis=1)
    ret[:, 0:r+1] = I_cum[:, r:2*r+1]
    ret[:, r+1:cols-r] = I_cum[:, 2*r+1:cols] - I_cum[:, 0:cols-2*r-1]
    ret[:, cols-r:cols] = np.tile(I_cum[:, cols-1], (r, 1)).T - \
                          I_cum[:, cols-2*r-1:cols-r-1]

    return ret


def blur2D(I, r):
    """
    This method should perform like cv2.blur().

    Parameters
    ----------
    I: NDArray of 2D
    r: float, radius of blur filter

    Returns
    -------
    Blurred output of I.
    """
    eye = np.ones_like(I, dtype=np.float32)
    N = _blur2D(eye, r)
    ret = _blur2D(I, r)
    return ret / N

给定矩阵I的输入:

[[  1.   2.   3.   4.   5.   6.   7.]
 [  8.   9.  10.  11.  12.  13.  14.]
 [ 15.  16.  17.  18.  19.  20.  21.]
 [ 22.  23.  24.  25.  26.  27.  28.]
 [ 29.  30.  31.  32.  33.  34.  35.]
 [ 36.  37.  38.  39.  40.  41.  42.]
 [ 43.  44.  45.  46.  47.  48.  49.]]

blur2D(I, r=1)提供输出(radius=1kernel size = (3, 3)时):

[[  5.    5.5   6.5   7.5   8.5   9.5  10. ]
 [  8.5   9.   10.   11.   12.   13.   13.5]
 [ 15.5  16.   17.   18.   19.   20.   20.5]
 [ 22.5  23.   24.   25.   26.   27.   27.5]
 [ 29.5  30.   31.   32.   33.   34.   34.5]
 [ 36.5  37.   38.   39.   40.   41.   41.5]
 [ 40.   40.5  41.5  42.5  43.5  44.5  45. ]]

cv2.blur(I, (3,3))给出输出:

[[  6.33333349   6.66666651   7.66666651   8.66666698   9.66666698   10.66666698  11.        ]
 [  8.66666698   9.          10.          11.          12.          13.   13.33333302]
 [ 15.66666698  16.          17.          18.          19.          20.   20.33333397]
 [ 22.66666603  23.          24.          25.          26.          27.   27.33333397]
 [ 29.66666603  30.          31.          32.          33.          34.   34.33333206]
 [ 36.66666794  37.          38.          39.          40.          41.   41.33333206]
 [ 39.          39.33333206  40.33333206  41.33333206  42.33333206   43.33333206  43.66666794]]

cv2.blur如何运作?非常感谢你能抽出时间解释一下。 PS:我曾尝试阅读opencv的源代码,但由于我的C ++知识不足而无法理解它。

0 个答案:

没有答案