Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Opencv MedianBlur实际上是如何工作的?_Python_Opencv_Image Processing_Signal Processing - Fatal编程技术网

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

Python Opencv MedianBlur实际上是如何工作的?,python,opencv,image-processing,signal-processing,Python,Opencv,Image Processing,Signal Processing,我一直在处理一个灰度图像,它有大量的椒盐噪声,我知道MedianBlur非常有用。因此,我使用了Opencv的Python版本(cv2.medianBlur())。它起作用了,但没有按我想要的方式起作用。因此,我在寻找它所使用的实际算法,并得到以下解释: 如果内核大小(k)为5,则对于每5个(行计数)x5(列计数)方形窗口,该窗口的中心像素将替换为其中所有元素的中值。例如,考虑这个窗口: [[11, 4, 17, 1, 5], [ 6, 14, 0, 12, 1

我一直在处理一个灰度图像,它有大量的椒盐噪声,我知道MedianBlur非常有用。因此,我使用了Opencv的Python版本(
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。这是正确的吗?如果是,那么前两行会发生什么情况,因为前两行中不能有任何窗口的中心元素?根据我的观察(比较原始图像和处理后的图像),前两行也会发生变化。

根据文档,它在内部使用
BORDER\u 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]]
从文件:

中值滤波器使用#边界#内部复制来处理 边框像素,请参见#边框类型


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

他们没有太多关于BORDER\u REPLICATE的文档。据我所知,如果你有一行,abcdefh,其中“a”和“h”是边界像素,那么它将像aaaaa | abcdefgh | hhhhhh一样填充该行。但它如何在二维窗口中工作呢?如果我有一个像[[13,16,18],[16,17,19],[20,17,18]]这样的2D窗口,我必须使它成为5x5,它将如何工作?同样,如果你有
ab
它在2D中变成
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],[20,17,18,18]。
好的,让我重新表述我的意见:如果我有输入图像的前5行和前5列,我必须对它应用中值模糊来改变第一个像素值[0,0],它会怎么样?给出前5行和前5列:[[13,16,18,23,14],[16,17,19,16],[20,17,18,19,16],[21,14,13,13,13],[16,13,14,14,14]]谢谢@ilke444的解释和Cris,你也是。