Matlab中的中值滤波器和伪中值滤波器

3

有人知道为什么伪中位数滤波器比中值滤波器快吗? 我使用了medfilt2.m进行中值滤波,并实现了自己的伪中位数滤波器,其代码如下:

b = strel('square',3);
psmedIm = (0.5*imclose(noisedIm,b)) + (0.5*imopen(noisedIm,b));
其中b是一个正方形的平面结构元素,noisedIm是一张被椒盐噪声污染的图像。 另外我不明白为什么使用伪中值滤波器生成的图像没有去噪。 谢谢!
1个回答

4
关于您的速度查询,我建议您使用伪中位数滤波器,因为它不涉及排序。真正的中位数滤波器需要对元素进行排序并找到中心值,这需要相当长的时间。
您的椒盐噪声没有被消除的原因是因为您始终保持它们的影响,因为您在使用imclose和imopen时始终同时使用结构元素内的最小和最大值。因为您只是将每个像素的权重平均分配了一半,如果有一个白色像素,则来自max函数的0.5因子贡献会将像素值上移,黑色像素则相反。
编辑:这是我做的一个快速演示,可以使您的伪中位数在处理椒盐噪声时更加有效。最大的区别在于它尝试使用打开和关闭图像的“最佳部分”,而不是让它们互相竞争。我认为它非常适合消除您作为示例使用的椒盐噪声。
img = imread('cameraman.tif');
img = imnoise(img, 'salt & pepper', 0.01);

subplot(2,2,1); imshow(img);

b = strel('square', 3);
closed = double(imclose(img, b));
opened = double(imopen(img, b));

subplot(2,2,2); imshow(closed,[]);
subplot(2,2,3); imshow(opened,[]);

img = double(img);
img = img + (closed - img) + (opened - img);

subplot(2,2,4); imshow(img,[]);

编辑: 这是代码运行的结果:

Salt and pepper noise reduction

编辑2: 这是其基本原理(它并不过于数学化,完全基于直觉!)

盐和胡椒噪声作为纯白色和纯黑色像素随机散布存在。想法是“关闭”和“打开”的图像将分别消除其中的一半--白色盐噪声或黑色胡椒噪声--该位置的像素值应通过其中一个操作进行更正。我们只是不知道哪个操作。因此,我们知道“关闭”和“打开”中的其中一个图像在该像素的正确设置上是“正确”的,因为操作应该已经正确地对该像素进行了“中位数”处理。由于“不正确”的那一个在该像素处应该与原始图像具有完全相同的值(白色或黑色),所以减去其值不会影响原始图像。只有“正确”的那个(其差值恰好等于将图像返回到其所谓的正确值所需的量)是正确的,因此我们通过相应的量调整该像素处的图像。因此,将嘈杂的原始图像添加到其中两者之间的差异,可以使得图像的噪声大大减少。


谢谢!我不确定你关于伪中位数滤波器所说的内容,那么我应该怎么做呢?有什么需要我改变的吗? - Glove
@biz 我为你添加了一段代码示例,我认为它比仅对打开和关闭的图像进行线性组合要好,并且应该仍然比纯中值滤波有显着的速度提升。它主要针对椒盐噪声处理。 - aardvarkk
@aaedvarkk,我不知道为什么你的代码没有生成去噪图像,你确定它可行吗?你能否给我一个类似中值滤波器的伪代码呢? - Glove
@biz 代码确实生成了一个去噪图像。我只是不断用处理过的版本替换“img”变量。在运行代码后得到的图中,右下角的图像是“去噪”图像。我认为它在消除椒盐噪声的同时保持了你所采取的“伪中值”方法的准确性。 - aardvarkk
我有一个问题。您的修改与原始修改不同,它通过减去原始(噪声)图像来实现,而不是取开和闭图像之和的一半。这对于椒盐噪声有何好处? - Glove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接