一、超限像素平滑法
I=imread('m3.png');
I=rgb2gray(I);
subplot(2,2,1),imshow(I);
[m,n]=size(I);
l=3;%模版尺寸
L=ones(l);%l*l模版
S=ones(m-l+1,n-l+1);
for i=1:m-l+1
for j=1:n-l+1
S(i,j)=1/(l*l)*sum(sum(I(i:i+l-1,j:j+l-1)));%求平均
end
end
subplot(2,2,2),imshow(S,[]);
P=imnoise(I,'salt & pepper',0.05);%加入椒盐躁声
subplot(2,2,3),imshow(P);
T=30;%设置阈值
A=P;
for i=1:m-2
for j=1:n-2
if (abs(P(i,j)-S(i,j))>T)
A(i,j)=P(i,j);
else
A(i,j)=S(i,j);
end
end
end
subplot(2,2,4),imshow(A);
思路:获取原始图像的灰度图与大小(m,n),假设一个方阵模版和(m-1,n-1)的矩阵,将方阵在图像上移动,每移动一次进行一次方阵大小范围内的平均值运算,得到由平均值组成的矩阵S,引入椒盐噪声函数,设定滤波阈值T,当灰度值与平均值的差大于阈值时,该点像素值保持不变,否则,取平均值。
程序结果:
体会:模版方阵在图像上移动,实质上是卷积运算,如何让模版方阵在图像移动,for语句的循环条件就需要计算准确。
后面的滤波使用选择语句即可。
二、灰度最相近的K个邻点平均法
I=imread('m3.png');
I=rgb2gray(I);
I=im2double(I);
[m,n]=size(I);
for i=2:m-1
for j=2:n-1
I1=I(i-1,j-1)-I(i,j);%求邻域内的值与中心值的差值
I2=I(i-1,j)-I(i,j);
I3=I(i-1,j+1)-I(i,j);
I4=I(i,j-1)-I(i,j);
I5=I(i,j)-I(i,j);
I6=I(i,j+1)-I(i,j);
I7=I(i+1,j-1)-I(i,j);
I8=I(i+1,j)-I(i,j);
I9=I(i+1,j+1)-I(i,j);
G=[I1,I2,I3,I4,I5,I6,I7,I8,I9]; %将差值保存在数组里
A=abs(G); %取绝对值
H=[1,2,3,4,5,6,7,8,9;A];
for s=1:9%使用for循环进行排序
for g=s+1:9
if H(2,s)>H(2,g)
MID=H(1,s);
H(1,s)=H(1,g);
H(1,g)=MID;
mid=H(2,s);
H(2,s)=H(2,g);
H(2,g)=mid;
end
end
end
K(1)=A(H(1,1));
K(2)=A(H(1,2));
K(3)=A(H(1,3));
K(4)=A(H(1,4));
K(5)=A(H(1,5));
K(6)=A(H(1,6));
K(7)=A(H(1,7));
ave=(K(1)+K(2)+K(3)+K(4)+K(5)+K(6)+K(7))/7; %排序后的结果存入K中,取差值的前七个求平均值
X(i,j)=ave;
end
end
E=im2uint8(X);
subplot(1,2,1),imshow(I);
subplot(1,2,2),imshow(E);
效果图:
体会:程序的关键在于,取邻域和排序,排序之后,差值有九个,取K 值,较小的K 值使噪声方差下降较小,但保持细节效果较好;而较大的K 值平滑噪声较好,但会使图像边缘模糊。