我一直在处理一个灰度图像,它有很多盐和胡椒的噪音,并逐渐认识到MedianBlur是非常有用的。所以我使用了(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。这是正确的吗?如果是,前2行会发生什么情况,因为前两行中不可能有元素作为任何窗口的中心元素?根据我的观察(比较原始图像和处理图像),前两行也会发生变化。
发布于 2020-04-13 07:47:30
根据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]]发布于 2020-04-13 07:47:46
来自文件:
中值滤波器在内部使用#BORDER_REPLICATE来处理边框像素,参见#BorderTypes
发布于 2021-01-14 14:41:11
这里,函数cv2.medianBlur()计算内核窗口下所有像素的中值,中心像素被替换为这个中值。这是非常有效的消除盐和胡椒噪音。值得注意的是,在高斯滤波器和盒滤波器中,中心元素的滤波值可以是原始图像中可能不存在的值。然而,中值滤波的情况并非如此,因为中心元素总是被图像中的某个像素值所取代。这有效地降低了噪音。内核大小必须是正数整数。
https://stackoverflow.com/questions/61183379
复制相似问题