椒盐噪声的加入和GS噪声的加入程序已经烂大街(GS噪声公式很不好想,可能会间歇性遗忘),在这主要是展示下特定比例的实现(其实也很简单)代码直接粘了:
jiaoyan:
im=double(imread('board-orig.bmp')); [m,n]=size(im); imout=zeros(m,n); for i=1:m for j=1:n t=rand; if t>0.2 imout(i,j)=im(i,j); elseif t<0.1 imout(i,j)=255; else imout(i,j)=0; end end end im3=uint8(imout); imshow(im3);
GSNoise:
function im2 = GSNoise(im, e, sigma) [m,n] = size(im); randm=rand(m,n); %生成随机矩阵(0-1) GSm=randm<0.2; %选取百分之20的点加噪 for i = 1:m for j = 1:n temp = rand(1)*255 - 255/2; %产生-127-127的随机数 sigma2 = sigma*sigma*2; PI2 = pi*2; sigmaPI2 = sqrt(PI2*sigma); GaussValue = exp(-temp/sigma2)/sigmaPI2; im2(i,j) = im(i,j) + (e + sigma*GaussValue)*GSm(i,j); end end imshow(im2); end
带阿尔法修正的均值滤波主要涉及到一个排序操作,第二次写卷积,不是很熟练,代码可能有冗杂。AF.m
function im4 = AF(im2,si,d) %si:卷积和边长;d:被去掉的首尾数 [m,n] = size(im2); %控制台输入加噪图像'im2' NoiseNum = m*n; s=(si-1)/2; %si:要扩充的边长值 im22=zeros(m+s,n+s); %构造扩充边缘矩阵 im22(s+1:s+m,s+1:s+n)=im2; for ii=1:s im22(ii,s+1:s+n)=im2(1,:); %上方行 im22(ii+m+s,s+1:s+n)=im2(m,:); %下方行 im22(s+1:s+m,ii)=im2(:,1); %左部列 im22(s+1:s+m,ii+n+s)=im2(:,n); %右部列 end for iii=1:s for jjj=1:s im22(iii,jjj)=im2(1,1); %左上角 im22(s+m+iii,jjj)=im2(m,1); %左下角 im22(iii,s+n+jjj)=im2(1,n); %右上角 im22(s+m+iii,s+n+jjj)=im2(m,n);%右下角 end end for i = s+1:s+m for j = s+1:s+n pick_=im22(i-(si-1)/2:i+(si-1)/2,j-(si-1)/2:j+(si-1)/2);%取邻域 pick=reshape(pick_',1,si*si); %变向量方便排序 % pick=[im1(i-1,j-1),im1(i-1,j),im1(i-1,j+1),im1(i,j-1),im1(i,j),im1(i,j+1),im1(i+1,j-1),im1(i+1,j),im1(i+1,j+1)]; %pick1=reshape(pick,3,3); %pick2=pick1'; [paixu index]=sort(pick); %排序并记录索引 zhongjian(1,1:si*si)=1; %中间矩阵方便计算、转换 for k=1:d/2 zhongjian(1,index(1,k))=0; %去最小值(椒) zhongjian(1,index(1,si*si+1-k))=0; %去最大值(盐) end filter1=reshape(zhongjian,si,si); %转回为矩阵 filter2=filter1'; %转回为矩阵 pick_=double(pick_); filter2=double(filter2); im4(i-s,j-s)=sum(sum((pick_.*filter2))')/(si*si-d); %滤波过程,mn-d个像素取平均; end end im4=uint8(im4); im22=uint8(im22); subplot(2,2,1);imshow(im2);title('高斯噪声'); subplot(2,2,2);imshow(im4);title('高斯噪声阿尔法'); subplot(2,2,3);imshow(im22);title('im22'); end