python - Opencv MedianBlur实际如何工作?

标签 python opencv image-processing signal-processing

我一直在处理带有大量盐和胡椒噪声的灰度图像,并且知道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。这是否正确?如果是,那么由于前两行中没有任何元素是ANY窗口的中心元素,因此前2行会发生什么情况?根据我的观察(比较原始图像和经过处理的图像),前两行也发生了变化。

最佳答案

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

关于python - Opencv MedianBlur实际如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61183379/

相关文章:

c++ - 在最小的 linux 嵌入式系统上基于 OpenCV 的程序优化

algorithm - 如何判断图片是否需要旋转

Python server.sendmail() 返回 {}。电子邮件未发送

python - cross_val_score 和 cross_val_predict 的区别

android - 在 Android 的 ImageView 中选择图像区域

c - OpenCV中像素邻域差异的高效算法

android - 在 Android 中使覆盖图像在触摸时透明?

image-processing - 图像处理(主要是opencv)索引约定

python - 有没有一种方法可以在不重写整个代码的情况下将完整的Python(psychopy)程序实现到neurobs演示中?

python - odoo - 从 many2one 领域获取值(value)