參考:
https://www.cnblogs.com/tiandsp/archive/2012/11/14/2770462.html
https://blog.csdn.net/zbc1090549839/article/details/38404995
https://baike.baidu.com/item/%E6%A4%92%E7%9B%90%E5%99%AA%E5%A3%B0/3455958?fr=aladdin 椒鹽雜訊
椒鹽雜訊也稱為脈衝雜訊。它是由映像感應器,傳輸通道,解碼處理等產生的黑白相間的亮暗點雜訊。其中黑色的雜訊點就被形象地稱為胡椒雜訊(pepper noise),而白色的雜訊點就被稱為鹽雜訊(salt noise)。一般這2種雜訊同時出現,呈現在映像上就是黑白的雜點。
椒鹽雜訊往往由映像切割引起,去除脈衝幹擾及椒鹽雜訊最常用的演算法是中值濾波。 中值濾波
濾除椒鹽雜訊比較有效方法是對訊號進行中值濾波處理。去除椒鹽雜訊後可以得到較為平滑的訊號,其效果要優於均值濾波器,當然中值濾波也同樣會造成邊緣模糊、訊號不夠銳利,這似乎也是很多濾波方法的一大通病。所以能夠激發的一點思考就是在濾波的同時如何更好的保持邊緣是濾波中尤其需要注意的。
在matlab中,調用 y = medfilt1(x,n)即可進行一維訊號的中值濾波操作(x表示輸入訊號,n值窗寬度)
調用 B = medfilt2(A, [m n])可完成二維訊號的中值濾波操作(A為要被中值濾波的映像,採用m*n大小的視窗)。 中值濾波代碼
clc;clear;close all;fprintf('=======中值濾波=====\n');img=imread('remote_sense.tif'); [~,~,ch] = size(img);if ch ==3 img =rgb2gray(img);endfigure;imshow(img);title('原始映像');img_med = medfilt2(img, [2,2]);figure;imshow(img_med);title('2*2中值濾波');psnr_med = eval_psnr(img,img_med);% 使用[3,3]的視窗img_med2 = medfilt2(img, [3,3]);figure;imshow(img_med2);title('3*3中值濾波');psnr_med2 = eval_psnr(img,img_med2);
為了作比較我們也是用DCT來去除椒鹽雜訊並利用PSNR評價。 DCT(頻域濾波)去除椒鹽雜訊
經過顯示去噪之後的結果我們同樣可以看到,無論是在頻域濾波還是在空間域濾波,我們都會造成邊緣模糊。這是需要我們思考的。
clc;close all;img = imread('remote_sense.tif'); [m,n,ch] = size(img);if ch == 3 img = rgb2gray(img);endfigure;imshow(img);title('原始映像');%DCT變換img_dct = dct2(img); I = zeros(m,n);% 高頻屏蔽I(1:m/3,1:n/3)=1; Ydct = img_dct .* I;%逆DCT變換img_dct = uint8(idct2(Ydct)); %結果輸出figure;imshow(img_dct);title('去噪之後');psnr_dct = eval_psnr(img,img_dct);
評價結果及結論
我們會發現中值濾波的結果要好於DCT濾波,但是[2,2]的視窗濾波卻比[3,3]的視窗濾波效果要好。 PSNR評價
PSNR可簡單地由均方差MSE進行定義。PSNR基於映像像素灰階值進行統計分析。由於人類視覺特性的差異性,通常出現的評價結果與人的主要感覺不一致,但其仍然是一個有參考價值的評價指標。
其求解公式為
這裡的MAX通常是映像的灰階級,一般就是255。當用於對比2幅映像相似的時候,PSNR越大則表示映像之前相似性越高。
function [PSNR] = eval_psnr(img,imgn)% =================PSNR評價% param :% img:輸入灰階映像(img與imgn同等大小)% imgn:輸入要進行對比的灰階映像% B = 8; %編碼一個像素用多少二進位位MAX = 2^B-1; %映像有多少灰階級[height,width,~] = size(img);MES = sum(sum((img-imgn).^2))/(height*width); %均方差PSNR = 20*log10(MAX/sqrt(MES)); %峰值信噪比end