Opencv 中值模糊实际上是如何工作的?
How does Opencv MedianBlur actually work?
我一直在处理具有大量椒盐噪声的灰度图像,并了解到 MedianBlur 非常有用。所以我使用了Python版本的Opencv(cv2.medianBlur()
)。它起作用了,但没有按照我想要的方式起作用。所以我在寻找它所使用的实际算法并得到以下解释:
如果内核大小 (k) 为 5,则对于每 5(行数)x5(列数)平方 window,此 window 的中心像素将被替换通过其中所有元素的中值。因此,例如,考虑这个 window:
[[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。这是正确的吗?如果是,前 2 行会发生什么,因为前两行中不能有任何元素 window 的中心元素?根据我的观察(比较原始图像和处理后的图像),前两行也发生了变化。
根据 medianBlur()
文档,它在内部使用 BORDER_REPLICATE
来处理边框像素。
BORDER_REPLICATE
Python: cv.BORDER_REPLICATE
aaaaaa|abcdefgh|hhhhhhh
所以它重复边界像素,直到所有像素都是 window 的中间像素。
编辑:要应用大小为 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
这里,函数 cv2.medianBlur() 计算内核 window 下所有像素的中值,并将中心像素替换为该中值。这对于去除椒盐噪声非常有效。需要注意的一件有趣的事情是,在高斯和盒式过滤器中,中心元素的过滤值可能是原始图像中可能不存在的值。然而,在中值滤波中情况并非如此,因为中心元素总是被图像中的某个像素值替换。这有效地降低了噪声。内核大小必须是正奇数。
我一直在处理具有大量椒盐噪声的灰度图像,并了解到 MedianBlur 非常有用。所以我使用了Python版本的Opencv(cv2.medianBlur()
)。它起作用了,但没有按照我想要的方式起作用。所以我在寻找它所使用的实际算法并得到以下解释:
如果内核大小 (k) 为 5,则对于每 5(行数)x5(列数)平方 window,此 window 的中心像素将被替换通过其中所有元素的中值。因此,例如,考虑这个 window:
[[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。这是正确的吗?如果是,前 2 行会发生什么,因为前两行中不能有任何元素 window 的中心元素?根据我的观察(比较原始图像和处理后的图像),前两行也发生了变化。
根据 medianBlur()
文档,它在内部使用 BORDER_REPLICATE
来处理边框像素。
BORDER_REPLICATE
Python: cv.BORDER_REPLICATE
aaaaaa|abcdefgh|hhhhhhh
所以它重复边界像素,直到所有像素都是 window 的中间像素。
编辑:要应用大小为 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
这里,函数 cv2.medianBlur() 计算内核 window 下所有像素的中值,并将中心像素替换为该中值。这对于去除椒盐噪声非常有效。需要注意的一件有趣的事情是,在高斯和盒式过滤器中,中心元素的过滤值可能是原始图像中可能不存在的值。然而,在中值滤波中情况并非如此,因为中心元素总是被图像中的某个像素值替换。这有效地降低了噪声。内核大小必须是正奇数。