子函数代码:
function[y]=K_neardealnoise(x,a,b)
[m,n]=size(x);
x=double(x);
y=x;
k0=floor(a*b/2)+1;
for i=2:m-1
for j=2:n-1
%y(i,j)=0;
z1=abs(x(i,j)-x(i-1,j+1));
z2=abs(x(i,j)-x(i,j+1));
z3=abs(x(i,j)-x(i+1,j+1));
z4=abs(x(i,j)-x(i-1,j));
z5=abs(x(i,j)-x(i+1,j));
z6=abs(x(i,j)-x(i-1,j-1));
z7=abs(x(i,j)-x(i,j-1));
z8=abs(x(i,j)-x(i+1,j-1));
z=[z1,z2,z3,z4,z5,z6,z7,z8];
h=[x(i-1,j+1),x(i,j+1),x(i+1,j+1),x(i-1,j),x(i+1,j),x(i-1,j-1),x(i,j-1),x(i+1,j-1)];
%对8个差进行冒泡排序法
for i1=1:1:7
for j1=1:1:8-i1
if z(1,j1) > z(1,j1+1)
%%该算法找出与核心像素灰度值接近的K个像素。若为信号点,非噪声点,则不受太大影响;若为噪声点,此种方法起到抑制噪声的作用
I=imread('1.jpg');
I=rgb2gray(I);
[e f]=size(I);
%J=imnoise(I,'salt & pepper',0.030);
J=imnoise(I,'gaussian',0,0.002);
%%第一种算法在保持边缘和细节较第二种算法要好很多,当然第一种算法在去噪方面不彻底,不如第二种
l=K_neardealnoise(J,3,3);%灰度最小方差的均值滤波器
m=commonfilt2(J,3,3);%自己编写的均或中值滤波方法
subplot(1,2,1),imshow( uint8(l) ),title('K近邻平滑滤波');
subplot(1,2,2),imshow( uint8(m)),title('普通均值滤波');
%2 计算三种算法的峰值信噪比
B=8; %编码一个像素用多少二进制位
MAX=2^B-1; %图像有多少灰度级
I=double(I);
l=double(l);
m=double(m);
% psnr2 = 32.0636
MES2=sum(sum((I-l).^2))/(e*f); %自适应中值去噪的均方差
PSNR2=20*log10(MAX/sqrt(MES2)); %自适应中值算法去噪的峰值信噪比
% psnr3 = 34.3898
MES3=sum(sum((I-m).^2))/(e*f); %自己编写的中值去噪的均方差
PSNR3=20*log10(MAX/sqrt(MES3)); %自己编写的中值去噪的峰值信噪比
%%该算法找出与核心像素灰度值接近的K个像素。若为信号点,非噪声点,则不受太大影响;若为噪声点,此种方法起到抑制噪声的作用
I=imread('1.jpg');
I=rgb2gray(I);
[e f]=size(I);
%J=imnoise(I,'salt & pepper',0.030);
J=imnoise(I,'gaussian',0,0.002);
%%第一种算法在保持边缘和细节较第二种算法要好很多,当然第一种算法在去噪方面不彻底,不如第二种
l=K_neardealnoise(J,3,3);%灰度最小方差的均值滤波器
m=commonfilt2(J,3,3);%自己编写的均或中值滤波方法
subplot(1,2,1),imshow( uint8(l) ),title('K近邻平滑滤波');
subplot(1,2,2),imshow( uint8(m)),title('普通均值滤波');
%2 计算三种算法的峰值信噪比
B=8; %编码一个像素用多少二进制位
MAX=2^B-1; %图像有多少灰度级
I=double(I);
l=double(l);
m=double(m);
% psnr2 = 32.0636
MES2=sum(sum((I-l).^2))/(e*f); %自适应中值去噪的均方差
PSNR2=20*log10(MAX/sqrt(MES2)); %自适应中值算法去噪的峰值信噪比
% psnr3 = 34.3898
MES3=sum(sum((I-m).^2))/(e*f); %自己编写的中值去噪的均方差
PSNR3=20*log10(MAX/sqrt(MES3)); %自己编写的中值去噪的峰值信噪比