自定义比例的GS噪声和椒盐噪声的加入和阿尔法修正的均值滤波的实现

椒盐噪声的加入和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

 

你可能感兴趣的:(matlab冈萨雷斯功能实现)