【问题标题】:How does Opencv MedianBlur actually work?Opencv MedianBlur 是如何工作的?
【发布时间】:2020-04-13 07:36:28
【问题描述】:

我一直在处理具有大量椒盐噪声的灰度图像,并开始知道 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)替换。这是正确的吗?如果是,前两行会发生什么,因为前两行中不能有任何窗口的中心元素?根据我的观察(比较原始图像和处理后的图像),前两行也发生了变化。

【问题讨论】:

    标签: python opencv image-processing signal-processing


    【解决方案1】:

    根据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]]
    

    【讨论】:

    • 他们没有太多关于 BORDER_REPLICATE 的文档。据我了解,如果您有一行 abcdefh,其中“a”和“h”是边框像素,那么它将像 aaaaaa|abcdefgh|hhhhhh 一样填充行。但它如何适用于二维窗口?如果我有一个像 [[13, 16, 18], [16, 17, 19], [20, 17, 18]] 这样的 2D 窗口,并且我必须将其设为 5x5,它将如何工作?
    • 同样,如果你有ab,它在二维中变成aabb,a|ab|b,aabb。将边框扩展到左/右/上/下。
    • [[13, 16, 18], [16, 17, 19], [20, 17, 18]] 变为 [[13, 13, 16, 18, 18], [13, 13, 16, 18, 18], [16, 16, 17, 19, 19], [20, 20, 17, 18, 18], [20, 20, 17, 18, 18]]
    • 好的,让我重新表述我的评论:如果我有输入图像的前 5 行和前 5 列,我必须对其应用中值模糊来更改第一个像素值 [0 ,0],它会怎么样?给定前 5 行和前 5 列:[[13, 16, 18, 23, 14], [16, 17, 19, 19, 16], [20, 17, 18, 19, 16], [21, 14, 13, 13, 13], [16, 13, 14, 14, 14]]
    • 谢谢@ilke444 的解释和克里斯,你也是。
    【解决方案2】:

    来自文档:

    中值滤波器在内部使用#BORDER_REPLICATE 来应对 边框像素,请参阅#BorderTypes

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 2012-12-08
        相关资源
        最近更新 更多