小白学习图像处理4——噪声模型与图像平滑(matlab实现)

一、图像的噪声模型

  由于受到环境、设备和人为因素的影响,数字图像在成像过程中容易携带各种噪声,下面用matlab模拟各种图像的噪声。
在matlab中,我们使用imnoise函数给图像添加噪声,调用的方式如下:
在这里插入图片描述

1、高斯噪声

先看看高斯噪声的分布:

I = 0.5*ones(256, 256, 'double');
J = imnoise(I, 'gaussian', 0, 0.01);
K = imnoise(I, 'gaussian', 0, 0.03);
figure
subplot(221), imshow(J);
subplot(222), imhist(J);
subplot(223), imshow(K);
subplot(224), imhist(K);

我们通过生成一个白图,叠加均值为0.5,方差分别为0.01和0.03的噪声,观察灰度图:
在这里插入图片描述
下面我们使用 imnoise 函数对一幅图像添加高斯噪声:

I = imread('lena_color_512.tif');
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.01);	% 高斯噪声 均值m=0, 方差var=0.01
figure
subplot(121), imshow(I)
subplot(122), imshow(J)

对原图(左)加噪后,得到的新图像(右)出现了模糊,图片所有区域都出现了模糊
在这里插入图片描述


2、椒盐噪声

使用 imnoise 函数添加椒盐噪声代码如下:

I = imread('lena_color_512.tif');
I = im2double(rgb2gray(I));
J = imnoise(I, 'salt & pepper', 0.05);	% 椒盐噪声,强度density=0.05
figure
subplot(121), imshow(I)
subplot(122), imshow(J)

对原图(左)加噪后,得到的新图像(右)包含了些许黑白点,黑点是椒噪声,白点是盐噪声
在这里插入图片描述


3、乘性噪声

使用 imnoise 函数添加乘性噪声代码如下:

I = imread('lena_color_512.tif');
I = im2double(rgb2gray(I));
J = imnoise(I, 'speckle');  % J = I+n*I, n默均值m=0, 方差var=0.04
K = imnoise(I, 'speckle', 0.1);	% 设置方差var=0.1
figure
subplot(131), imshow(I)
subplot(132), imshow(J)
subplot(133), imshow(K)

对原图(左)加噪后,得到的新图像(右)中,有的地方变量,有的地方变暗,且变化程度不同
在这里插入图片描述


4、均匀噪声

使用 imnoise 函数添加均匀噪声代码如下:

I = imread('lena_color_512.tif');
I = im2double(rgb2gray(I));
a = 0.1;
b = 0.3;
noise = a + (b-a)*rand(size(I));
J = noise + I;
figure
subplot(121), imshow(I);
subplot(122), imshow(J);

对原图(左)加噪后,得到的新图像(右)变量了,可以看到密密麻麻的小白点,这是因为叠加了均匀分布的噪声。
在这里插入图片描述


二、图像的空间域滤波

  噪声由于具有冲击性,含噪声的像素点灰度值会发生突变,对于上面提到的噪声,大部分是可以通过空间域滤波处理的,空间域滤波就是直接基于像素点和邻域对图像进行滤波处理,从而滤除噪声使图像平滑。

1、空间域滤波

fspecial 函数

h = fspecial(type, options)
h = fspecial('average', 3)

fspecial 函数的作用是生成一个滤波器(filtering)或者称之为模板、掩膜,第二行代码就是生成一个均匀分布的3x3的矩阵,矩阵每个元素都是 1/9,一般来说,模板越大,滤波效果越好,相应的图像模糊程度也越大,详细用法如下:
在这里插入图片描述


imfilter 函数
该函数的作用是让图像A通过滤波器h,相当于一次二维卷积 conv2

imfilter(A, h)

2、均值滤波

  拿灰度图像来说,均值滤波的原理就是计算某个像素点及其领域的灰度值期望,用灰度值的均值作为该像素点的灰度值,均值滤波对 高斯噪声 效果好。
代码很简单:

I = imread('lena_color_512.tif');
I = im2double(rgb2gray(I));
J = imnoise(I, 'gaussian', 0, 0.01);
h = fspecial('average', 3);
K = imfilter(J, h);
% K = conv2(J, h, 'same');
figure
subplot(121), imshow(J)
subplot(122), imshow(K)

这样,我们得到降噪后的图像:
在这里插入图片描述
  在中值滤波之前,我们可以先对图像取一个对数函数,再进行滤波,接着用指数函数还原,效果会好一些

I = imread('cameraman.tif');
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.01);
h = fspecial('average', 3);
K1 = imfilter(J, h);
K2 = exp(imfilter(log(J), h));
figure
subplot(121), imshow(K1)
subplot(122), imshow(K2)

在这里插入图片描述
好吧,这个差别确实不是很明显 ( ̄▽ ̄)"


3、中值滤波

  中值滤波的就是将一个像素点及其邻域的灰度值从大到小排序后,选择中位数作为该像素点的值,在matlab中我们使用 medfilt2 来实现二维中值滤波,调用方法如下:

J = medfilt2(I,[m n])

其中[m, n]表示计算中值区域的大小,默认为 3x3
图像的中值滤波对去除 椒盐噪声 效果明显,如果一次中值滤波效果不够好,可以重复几次:

I = imread('lena_color_512.tif');
I = im2double(I);
J = imnoise(I, 'salt & pepper', 0.1);
K = zeros(size(I), 'double');
K(:, :, 1) = medfilt2(J(:, :, 1), [3, 3]);
K(:, :, 2) = medfilt2(J(:, :, 2), [3, 3]);
K(:, :, 3) = medfilt2(J(:, :, 3), [3, 3]);
figure
subplot(121), imshow(J)
subplot(122), imshow(K)

效果很不错~
在这里插入图片描述


4、顺序统计滤波

  顺序统计滤波有点像中值滤波,只不过在对区域灰度值排序后,顺序统计滤波可以选择哪个数作为目标灰度值,在matlab中我们使用 ordfilt2 来实现二维中值滤波,调用方法如下:

B = ordfilt2(A, order, domain);

  含义为:在A图像中每个像素点附近取一个区域domain,将区域内的像素点灰度值从大到小排序,选择第order个值作为目标像素点的值,存放在图像B中
  对图像进行顺序统计滤波的代码如下(这里选择中间哪个数作为目标灰度):

I = imread('cameraman.tif');
I = im2double(I);
J = imnoise(I, 'salt & pepper', 0.1);
domain = [0 1 1 0; 1 1 1 1; 1 1 1 1; 0 1 1 0];
K = ordfilt2(J, 6, domain);
figure
subplot(121), imshow(J)
subplot(122), imshow(K)

在这里插入图片描述
通过 ordfilt2 函数也可以实现最大值、最小值滤波,只要更改参数order就可以了


5、维纳自适应滤波

  维纳自适应滤波对 高斯噪声 有效,调用方法为:

B = wiener2(A, [m, n]);

下面我们对camaraman图进行维纳滤波:

I = imread('cameraman.tif');
I = im2double(I);
J = imnoise(I, 'gaussian', 0, 0.01);
K = zeros(size(I), 'double');
K = wiener2(J, [5, 5]);
figure
subplot(121), imshow(J)
subplot(122), imshow(K)

效果如下:
在这里插入图片描述


以上就是空域滤波的一些常见滤波方法,关于频域滤波 emmm 下次补上
完结 cheers! 🍻

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章