目录
不同种类的噪声
中值滤波器(亦称边缘保留)
中值滤波器-实战
不同种类的噪声
我们两次讨论过高斯平均是合理的。
如果噪声在每个像素中是独立的并且以0为中心。
因此,噪声是由高斯过程产生的。所以有些是积极的,有些是消极的,等等。
现在我们已经谈了他们如何进行过滤。
但是还有其他种类的噪音,我们需要不同种类的过滤。也许不是线性滤波器。
在左边,我们有胡椒图像添加了一点点高斯噪声。
在右边,我们有胡椒图像和椒盐噪声。如图:
不同的辣椒。
问题是你需要在右侧使用什么样的过滤,好吗?
因此,解决这个问题的方法是记住我们关于图像的其他假设。
底层图像是否在像素周围缓慢变化。
这个想法是如果存在某种任意值,这被放在某些地方,就像盐和胡椒噪音一样。
我们怎样才能找到我们应该用这个值来代替这个值来得到更好的图像呢?
现在请记住,当我们进行过滤时,这种模糊,我们实际上是用局部平均值来代替像素值,
它既可以是平均值,也可以是高斯平均值。
当噪音不是很大且趋于0时,这是没问题的。
因此,通过平均,你倾向于平均掉噪音得到正确的pix值,像素值。
但是如果一些完全随机的值被注入到你的图像中,你真的需要做一些不同的事情。
一种有趣的方式,即提出适当的中间值,不是平均值,而是中值。
中值滤波器(亦称边缘保留)
在这里,我将向您展示中值滤波器的图像处理。
在顶部,我们有一大块我们的图像,并注意到在中间是一个像素,可能是不正确的。如图:
因为所有这些其他较低的数字然后是90。
所以问题是,我们应该用什么代替?
如果我们只做常规的过滤,那么我们就可以计算所有的局部平均值,包括90个,并将其固定在那里。
更好的想法是进行中值滤波。
所以我们对所有像素进行排序。如图:
我们拿出中间值27。如图:
我们在这里取而代之,所以现在你看到90完全消失了。如图:
我们的想法是用这个中值替换那个像素。
所以在你完成之前,我们会问一些有关这方面的问题。
首先,什么是好的是我们在图片中的每一个值都是局部存在的。特别是如果它是奇数的话。
如果是内核是偶数的话,那么就是两个像素的平均值,但如果是奇数个像素,中值就是那些值在我周围的像素之一。
我不会引入任何奇怪的值。所以当我有这些奇怪的峰值时,它比较好应对比如椒盐噪音,但是这里有个问题要问你。
它是线性操作吗?对, 不,看中位数不是线性的。
我添加了几个不同的东西。
我把它们总结出来,中位数可以移动,但是中间值会移动。它不会表现得很好。
那么在真实情况下这是什么样的呢?
所以这里我们有胡椒图片。如图:
再次,不同的辣椒。
这里是应用中位数。如果你放大,你会发现这是一个非常清晰的图像。如图:
你可以看到,这是一条扫描线,是整个图像中单行的图。你可以看到所有的椒盐的噪音。如图:
当我用中位数替换它时,我在这里得到一个更好的信号。如图:
这就是为什么中值滤波对椒盐噪声的效果要好得多。
所以我告诉你这个,因为中位数实际上是一个非线性的例子。
它有时也被称为 “边缘保留”。(中值滤波器也称为边缘保留)
这个简单的图纸就显示了原因。如图:
假设我有,我有一个应该是这样的信号,但是有一个峰值添加到那个。如图:
如果我拿中位数,我会得到这个很好的效果。如图:
如果我采取平均值或平均值或模糊。如图:
我倾向于模糊这条清晰的边缘,这就是为什么中值滤波被称为边缘保持。如图:
所以这是一类有用的非线性滤波器,但它们在数学方面的表现稍差。
中值滤波器-实战
让我们应用中值滤波器。
像往常一样,加载图像:
>> pkg load image;
>>
>> img = imread('moon.png');
>> imshow(img);
代码结果如下:
让我们添加一些椒盐噪音。
Octave 和 Matlab 有一些很棒的实用功能,比如imnoise。
传入图像,然后传递所需的噪声类型和参数。(img:这是月亮上,'salt & pepper':这是椒盐噪音。)
>> noisy_img = imnoise(img, 'salt & pepper', 0.02);
>> imshow(noisy_img);
代码运行结果:
这是月亮上的椒盐噪音。
这次我们不会使用imfilter。
请记住,中值滤波是一种非线性技术。
我们使用函数medfilt2,它代表二维中值滤波。
>> median_filtered = medfilt2(noisy_img);
>> imshow(median_filtered);
代码运行:
如您所见,中值滤波器对于消除椒盐噪音非常有效。
发生了一点点模糊,但不是太多。
你可以亲自试试。加油!~
——学会编写自己的代码,才能练出真功夫。