去除椒盐噪声(简答的matlab代码实践,PSNR评价)

参考:
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);
end
figure;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);
end
figure;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

猜你喜欢

转载自blog.csdn.net/chaolei3/article/details/79769703