【數字圖像處理】MATLAB實現椒鹽噪聲與高斯噪聲及濾波

椒鹽噪聲、高斯噪聲及關於濾波的MATLAB實現


1、相關知識回顧

常見的圖像噪聲有 椒鹽噪聲高斯噪聲

  • 椒鹽噪聲的特徵:出現位置是隨機的,但噪聲的幅值是基本相同的。
  • 高斯噪聲的特徵:出現位置是一定的(每一點上),但噪聲的幅值是隨機的。

圖像噪聲抑制濾波器有三類:①均值濾波器 ②中值濾波器 ③邊界保持類濾波器

  • 均值濾波器原理
    在圖像上,對待處理的像素給定一個模板,該模板包括了其周圍的鄰近像素。將模板中 的全體像素的均值來替代原來的像素值的方法。
  • 中值濾波器原理
    在某個模板中,對像素進行由小到大排列的重新排列,取模板中排在中間位置上的像素的灰度值替代待處理像素的值的方法。

2、matlab自帶函數實現

調matlabimnoisemedfilt2filter2調用matlab自帶函數imnoise、medfilt2、filter2實現如下功能:
11)生成含有高斯噪聲、椒鹽噪聲的圖像
2使2)使用均值濾波分別對高斯噪聲、椒鹽噪聲的圖像進行濾波
3使3)使用中值濾波分別對高斯噪聲、椒鹽噪聲的圖像進行濾波

代碼實現

im = imread('img\lena.jpg');

% 1)生成含有高斯噪聲、椒鹽噪聲的圖像
% imnoise 是表示添加噪聲污染一幅圖像,叫做噪聲污染圖像函數
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒鹽噪聲
im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪聲

% 顯示加入噪聲後的圖像
% figure,imshow(im_noise_salt);title('加入椒鹽噪聲後的圖像');
% figure,imshow(im_noise_gaussian);title('加入高斯噪聲後的圖像');
figure;
subplot(131),imshow(im);title('原圖');
subplot(132),imshow(im_noise_salt);title('加入椒鹽噪聲後的圖像');
subplot(133),imshow(im_noise_gaussian);title('加入高斯噪聲後的圖像');

% 2)使用均值濾波分別對高斯噪聲、椒鹽噪聲的圖像進行濾波
% fspecial函數 用來生成濾波器(也叫算子)的函數
% h = fspecial(type)  h = fspecial(type,para) 
% 使用type參數來指定濾波器的種類,使用para來對具體的濾波器種類添加額外的參數信息。h就是生成的濾波器。
n=1; m=2*n+1;
A = fspecial('average',m); % 生成系統自帶3×3濾波器

% filter2 - 二維數字濾波器 
% Y = filter2(H,X)  根據矩陣 H 中的係數,對數據矩陣 X 應用有限脈衝響應濾波器。
% 進行濾波並顯示圖像
im_filtered1 = filter2(A,im_noise_salt);
im_filtered2 = filter2(A,im_noise_gaussian);
figure;
subplot(321),imshow(im_noise_salt);title('加入椒鹽噪聲後的圖像');
subplot(322),imshow(im_noise_gaussian);title('加入高斯噪聲後的圖像');
subplot(323),imshow(uint8(im_filtered1));title('椒鹽噪聲圖像進行均值濾波後的圖像');
subplot(324),imshow(uint8(im_filtered2));title('高斯噪聲圖像進行均值濾波後的圖像');

% 3)使用中值濾波分別對高斯噪聲、椒鹽噪聲的圖像進行濾波
% 定義鄰域尺寸
n1 = 2; m1 = 2*n1+1;
n2 = 2; m2 = 2*n2+1;

% medfilt2函數用於執行二維中值濾波,使用方法如下:
% B = medfilt2(A, [m n]) B = medfilt2(A)
% 其中[m n]表示鄰域塊的大小,默認值爲[3 3]。 b=medfilt2(a,[m,n]);
% b是中值濾波後的圖象矩陣,a是原圖矩陣,m和n是處理模版大小,默認3×3。
im_filtered11 = medfilt2(im_noise_salt,[m1,m2]);
im_filtered22 = medfilt2(im_noise_gaussian,[m1,m2]);
subplot(325),imshow(im_filtered11);title('椒鹽噪聲圖像進行中值濾波後的圖像');
subplot(326),imshow(im_filtered22);title('高斯噪聲圖像進行中值濾波後的圖像');

代碼執行結果
在這裏插入圖片描述

3、自編寫程序實現均值濾波、中值濾波


1)均值濾波

代碼實現

% 自編寫均值濾波函數
im = imread('img\lena.jpg');
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒鹽噪聲
% im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪聲

n=1; m=2*n+1;
H = ones(m,m)/(m*m); % 3×3矩陣 n=2:5×5
[h,l,c] = size(im_noise_salt); % [h,l,c] = size(im_noise_gaussian);
x1 = double(im_noise_salt); % x1 = double(im_noise_gaussian);
x2 = x1; 
for i=n+1:h-n
    for j=n+1:l-n
        % 去除x1中從(i,j)開始的n行n列元素與模板相乘
        c = x1(i-n:i+n,j-n:j+n).*H;
        s = sum(c(:));
        x2(i,j) = s;
    end
end
im_filtered2 = uint8(x2);
subplot(2,2,[1,2]),imshow(im);title('原圖');
subplot(223),imshow(im_noise_salt);title('加入椒鹽噪聲後的圖像');
subplot(224),imshow(im_filtered2);title('椒鹽噪聲圖像進行均值濾波後的圖像');

代碼執行結果
在這裏插入圖片描述

2)中值濾波

代碼實現

% 自編寫中值濾波函數
im = imread('img\lena.jpg');
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒鹽噪聲
% im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪聲

% % 定義鄰域尺寸
n1 = 2; m1 = 2*n1+1;
n2 = 2; m2 = 2*n2+1;

k = floor(m1*m2/2)+1;

[h,l,c] = size(im_noise_salt); % [h,l,c] = size(im_noise_gaussian);
H = zeros(h,l); 
t = zeros(n1,n2); 

for i=n1+1:h-n1
    for j=n2+1:l-n2
        Neiborhood = im_noise_salt(i-n1:i+n1,j-n2:j+n2); % 得到3×3鄰域
        t = Neiborhood(:);
        s = sort(t);
        H(i,j) = s(k);
    end
end
im_filtered2 = uint8(H);
subplot(2,2,[1,2]),imshow(im);title('原圖');
subplot(223),imshow(im_noise_salt);title('加入椒鹽噪聲後的圖像');
subplot(224),imshow(im_filtered2);title('椒鹽噪聲圖像進行中值濾波後的圖像');

代碼執行結果
在這裏插入圖片描述

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