Matlab90%椒盐噪声,MSE评价

一、目标:

  1. 对lena.bmp图像采用转成灰度图后,加入90%强度的椒盐噪声。尝试任意方法,能够较好恢复图像。采用MSE评价

 

二、分析:

      此次恢复方案采用https://github.com/gkh178/noise-adaptive-switching-non-local-means

 

三、代码展示:

       关键算法:

function output_image = NASNLM(input_image,t,f,h)
[row, column] = size(input_image);
output_image = zeros(row,column);
output_image1 = zeros(row,column);
input_image2 = padarray(input_image,[3 3],'symmetric');
L_min = 0;
L_max = 255;
F = F_(input_image2);
[G1,G2,G3] = G_(input_image2,F);

for i =4:(row+3)
	for j = 4:(column+3)
	
		if L_min<input_image2(i,j) && input_image2(i,j)<L_max
			output_image1(i-3,j-3) = input_image2(i,j);
		else 
			if G1(i,j)>0
				d1 = abs(input_image2(i-1,j-1)-input_image2(i+1,j+1));
				d2 = abs(input_image2(i-1,j)-input_image2(i+1,j));
				d3 = abs(input_image2(i-1,j+1)-input_image2(i+1,j-1));
				d4 = abs(input_image2(i,j-1)-input_image2(i,j+1));
				if F(i-1,j-1)==0 || F(i+1,j+1)==0
					d1 = 512;
				end
				if F(i-1,j)==0 || F(i+1,j)==0
					d2 = 512;	
				end
				if F(i-1,j+1)==0 || F(i+1,j-1)==0
					d3 = 512;	
				end
				if F(i,j-1)==0 || F(i,j+1)==0
					d4 = 512;
				end
				d= [d1,d2,d3,d4];
				d_min = min(d);
				
				if d_min==512
					count=0;
                    x=zeros(1,9);
					for m=-1:1
						for n=-1:1
							if F(i+m,j+n)==1
								count=count+1;
								x(1,count) =input_image2(i+m,j+n);
							end
						end
					end
					output_image1(i-3,j-3)=median(x(:,1:count));
				else
					if d_min==d1
						output_image1(i-3,j-3)=(input_image2(i-1,j-1)+input_image2(i+1,j+1))/2;
                    elseif d_min==d2
						output_image1(i-3,j-3)=(input_image2(i-1,j)+input_image2(i+1,j))/2;
                    elseif d_min==d3
						output_image1(i-3,j-3)=(input_image2(i-1,j+1)+input_image2(i+1,j-1))/2;
                    elseif d_min==d4
						output_image1(i-3,j-3)=(input_image2(i,j-1)+input_image2(i,j+1))/2;
					end
				end
				
            elseif G2(i,j)>0
				count=0;
                x=zeros(1,25);
				for m=-2:2
					for n=-2:2
						if F(i+m,j+n)==1
							count=count+1;
							x(1,count) =input_image2(i+m,j+n);
						end
					end
				end
				output_image1(i-3,j-3)=median(x(:,1:count));
            elseif G3(i,j)>0
				count=0;
				for m=-3:3
					for n=-3:3
						if F(i+m,j+n)==1
							count=count+1;
							x(1,count) =input_image2(i+m,j+n);
						end
					end
				end
				output_image1(i-3,j-3)=median(x(:,1:count));						
			else
				output_image1(i-3,j-3)=median(median(input_image2(i-1:i+1,j-1:j+1)));							
			end
        end
	end
end

input_image3 = padarray(output_image1,[f+t f+t],'symmetric');
F = padarray(F(4:row+3,4:column+3),[f+t f+t],'symmetric');
kernel = make_kernel(f);
kernel = kernel / sum(sum(kernel));
for i =1:row
	for j=1:column
		i1 = i+ f+t;
        j1 = j+ f+t;
		if F(i1,j1)==1
			output_image(i,j)=input_image3(i1,j1);
		else
			W1= input_image3(i1-f:i1+f , j1-f:j1+f);%小窗口
			wmax=0; 
			average=0;
			sweight=0;		
			value=0;
			rmin=i1-t;
			rmax=i1+t;
			smin=j1-t;
			smax=j1+t;
			for r=rmin:1:rmax %大窗口
				for s=smin:1:smax
					if(r==i1 && s==j1) 
						continue; 
					end
					W2= input_image3(r-f:r+f , s-f:s+f);    %大搜索窗口中的小相似性窗口     
					d = sum(sum(kernel.*(W1-W2).*(W1-W2)));
					w=exp(-d/(h^2)); %权重
					if w>wmax                
						wmax=w;   %求最大权重            
					end
					sweight = sweight + w;  %大窗口中的权重和
					average = average + w*input_image3(r,s);   
				end
			end
			average = average + wmax*input_image3(i1,j1);
			sweight = sweight + wmax;
			if sweight > 0
				output_image(i,j) = average / sweight;
			else
				output_image(i,j) = output_image1(i,j);
			end
		end
	end
end
end

function F = F_(input_image2)
[r,c] = size(input_image2);
F = zeros(r,c);
L_min = 0;
L_max = 255;
for i =1:r
	for j = 1:c
		if input_image2(i,j)==L_min || input_image2(i,j)==L_max
			F(i,j) = 0;
		else
			F(i,j) = 1;
		end
	end
end
end

function [G1,G2,G3] = G_(input_image2,F)
[r,c] = size(input_image2);
G1 = zeros(r,c);
G2 = zeros(r,c);
G3 = zeros(r,c);

for i=4:(r-3)
	for j = 4:(c-3)
	
		if F(i,j)==0
			G1_count = 0;
			G2_count = 0;
			G3_count = 0;
			for m = -1:1
				for n = -1:1
					if F(i+m,j+n)==1
						G1_count = G1_count + 1;
					end
				end
			end
			G1(i,j)=G1_count;
			
			for m = -2:2
				for n = -2:2
					if F(i+m,j+n)==1
						G2_count = G2_count + 2;
					end
				end
			end
			G2(i,j)=G2_count;
			
			for m = -3:3
				for n = -3:3
					if F(i+m,j+n)==1
						G3_count = G3_count + 2;
					end
				end
			end
			G3(i,j)=G3_count;		
		end
	end
end
end

function [kernel] = make_kernel(f)  
kernel=zeros(2*f+1,2*f+1);   
for d=1:f    
  value= 1 / (2*d+1)^2 ;    
  for i=-d:d
     for j=-d:d
        kernel(f+1-i,f+1-j)= kernel(f+1-i,f+1-j) + value ;
    end
  end
end
kernel = kernel ./ f;
end

四、结果展示及分析:

 

                                           图1 噪声图                                                                                        图2 MF方法

                                      图3 ACMF方法                                                                                    图4 DBA方法

                                    图5 NAFSM方法                                                                                图6 NASEPF方法

                                   图7 NASNLM方法

最终MSE值为最低为140,当然MSE值是在一定小幅度不停变动

 

 

 

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值