小白學習圖像處理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! 🍻

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