去噪

在数字图像中往往存在各种类型的噪声。产生噪声的途径可以有几种,与生成图像的方法有关。例如:[大谦MATLAB,dqmatlab点com]

如果图像是用照片扫描得到的,则胶卷上的灰尘是噪声源。胶卷被损坏、在扫描操作中都可以产生噪声;

如果图像直接来源于数字设备,则获取数据的设备可以产生噪声;

图像数据的电子传输可以产生噪声。

MATLAB图像处理工具箱中提供了多个不同的方法来删除和减少图像中的噪声。不同方法对于不同类型的噪声具有更好的效果。可用的方法包括:

线性滤波;

中值滤波;

自适应滤波。

为了模拟上面列出的噪声效果,MATLAB图像处理工具箱中提供了imnoise函数,利用它可以在图像上添加不同类型的噪声。在后面的例子会用到该函数。

线性滤波和中值滤波

可以用线性滤波来删除特定类型的噪声(某些滤波器,如均值滤波器或高斯滤波器比较适用)例如,均值滤波器对于从照片上删除灰尘噪声比较有用。因为当将每个像素的值设置为它邻域内像素值的均值时,灰尘引起的局部变化也就减小了。

中值滤波与均值滤波的相似之处在于,每个像素的值由输入图像中对应像素邻域内的像素值确定。不同的是,均值滤波是根据输入图像中对应像素邻域内的像素值的均值确定输出图像中对应像素的值,而中值滤波是根据中值来确定的。中值对异常值的敏感性比均值小,所以,中值滤波器可以在不减小图像对比度的情况下剔除这些异常值。medfilt2函数实现了中值滤波。

分别用均值滤波器和medfilt2函数删除图像中的食盐和胡椒粉状噪声。

这种类型的噪声由设置为黑色或白色的随机像素点组成。在这两种情况下,用于滤波的邻域大小都是33。

(1)读入并显示图像。

code.matlab
>> I=imread('eight.tif');
>> imshow(I)

生成图5-3所示的图像。

(2)添加噪声。

code.matlab
>> J=imnoise(I,'salt & pepper',0.02);
>> figure, imshow(J)

生成图5-4所示的图像。

Document Image Document Image

图5-3 载入图像 图5-4 添加噪声

(3)用均值滤波器对有噪声的图像进行滤波,然后显示处理结果。

code.matlab
>> K=filter2(fspecial('average',3),J)/255;
>> figure, imshow(K)

生成图5-5所示的图像。

(4)现在用中值滤波器对有噪声的图像进行滤波并显示处理结果。

code.matlab
>> L=medfilt2(J,[3 3]);
>> figure, imshow(L)

生成图5-6所示的图像。比较图5-5和图5-6可以看出,后者的处理结果更好,图像中的对象边界更清晰。

Document Image Document Image

图5-5 均值滤波后的效果 图5-6 中值滤波效果

自适应滤波

wiener2函数采用Wiener滤波器(一种线性滤波器)根据图像的局部变异进行自适应滤波。对于变异大的地方,wiener2函数能进行比较小的平滑;对于变异小的地方,wiener2函数能进行比较大的平滑。

使用这种方法常常会获得比线性滤波更好的效果。自适应滤波器比线性滤波器更可取,它可以保留图像的边界和其他高频部分。另外,使用自适应滤波器没有设计任务,使用wiener2函数可以进行所有的前期计算并实现滤波器。但是,wiener2函数确实要比线性滤波器花费更多时间。当噪声是常数幂值附加噪声(如高斯噪声)时,wiener2函数得到的效果得最好。

将wiener2函数应用于一幅添加了高斯噪声的土星图像。

code.matlab
>> RGB=imread('saturn.png');
>> I=rgb2gray(RGB);
>> J=imnoise(I,'gaussian',0,0.005);
>> K=wiener2(J,[5 5]);
>> imshow(J)
>> figure, imshow(K)

生成图5-7所示的图像。

Document Image Document Image

(a) (b)

图5-7 对有高斯噪声的土星图像进行滤波