Opencv MedianBlur实际上是如何工作的?

2024-09-19 20:58:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在处理一个灰度图像,它有大量的椒盐噪声,我知道MedianBlur非常有用。所以我使用了Python版本的Opencv(cv2.medianBlur())。它起作用了,但没有按我想要的方式起作用。因此,我在寻找它所使用的实际算法,并得到以下解释:

如果内核大小(k)为5,则对于每5个(行计数)x5(列计数)方形窗口,该窗口的中心像素将替换为其中所有元素的中值。例如,考虑这个窗口:

      [[11,  4, 17,  1,  5],
       [ 6, 14,  0, 12, 16],
       [24, 19, 13, 18, 23],
       [ 7, 11, 11, 10,  5],
       [10, 13, 23,  3,  0]] 

在这里,中心元素13将被所有这些元素的中间值替换,即11。这是正确的吗?如果是,那么前两行会发生什么情况,因为前两行中不能有任何窗口的中心元素?根据我的观察(比较原始图像和处理后的图像),前两行也发生了变化


Tags: 图像版本算法元素方式中心cv2噪声
3条回答

这里,函数cv2.medianBlur()计算内核窗口下所有像素的中值,并用该中值替换中心像素。这在消除椒盐噪声方面非常有效。值得注意的一件有趣的事情是,在高斯和盒滤波器中,中心元素的滤波值可能是原始图像中不存在的值。然而,在中值滤波中并非如此,因为中心元素总是被图像中的某个像素值替换。这样可以有效地降低噪音。内核大小必须是正奇数整数

根据^{}文档,它在内部使用BORDER_REPLICATE来处理边界像素

BORDER_REPLICATE 
Python: cv.BORDER_REPLICATE

aaaaaa|abcdefgh|hhhhhhh 

因此,它重复边界像素,直到所有像素都是窗口的中间像素

编辑:要应用大小为5x5的内核,第一个像素应位于图像的第三行和第三列。这意味着将边界复制两个像素。因此,您的图像在内部变成:

  [[11, 11, 11,  4, 17,  1,  5,  5,  5],
   [11, 11, 11,  4, 17,  1,  5,  5,  5],
   [11, 11, 11,  4, 17,  1,  5,  5,  5],
   [ 6,  6,  6, 14,  0, 12, 16, 16, 16],
   [24, 24, 24, 19, 13, 18, 23, 23, 23],
   [ 7,  7,  7, 11, 11, 10,  5,  5,  5],
   [10, 10, 10, 13, 23,  3,  0,  0,  0],
   [10, 10, 10, 13, 23,  3,  0,  0,  0],
   [10, 10, 10, 13, 23,  3,  0,  0,  0]]

从文件:

The median filter uses #BORDER_REPLICATE internally to cope with border pixels, see #BorderTypes

相关问题 更多 >