自定義比例的GS噪聲和椒鹽噪聲的加入和阿爾法修正的均值濾波的實現
阿新 • • 發佈:2018-12-19
椒鹽噪聲的加入和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