就您的速度查询而言,我建议您的伪中值过滤器更快,因为它不涉及排序。真正的中值过滤器需要您对元素进行排序并找到中心值,这需要相当长的时间。
你的椒盐噪声没有被去除的原因是你总是保持它们的效果,因为当你使用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,[]);
编辑:这是运行代码的结果:
编辑 2:这是基本理论(它不是过于数学化,完全基于直觉!)
椒盐噪声以随机分散的纯白色和纯黑色像素形式存在。这个想法是,“关闭”和“打开”图像将分别消除 一个 的一半——无论是白盐噪声还是黑胡椒噪声——并且该位置的像素值应该是由其中一项操作纠正。我们只是不知道是哪一个。所以我们知道“关闭”和“打开”图像中的一个对于该像素是“正确的”,因为该操作应该有效地正确“中值”该像素。由于“不正确”的像素在该像素(白色或黑色)处应具有与原始图像完全相同的值,因此减去其值不会影响原始图像。只有“正确”的那个(其差异在于将图像返回到其所谓的正确值所需的确切数量)是正确的,因此我们将该像素处的图像调整相应的数量。因此,获取嘈杂的原始图像并将两者都添加到其中,我们可以得到一些减少了很多噪声的东西。