我试图实现我的个人模糊过滤器,但是我对登上图像时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=1
,kernel 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 ++知识不足而无法理解它。