|
一种数码照片降噪的方法
此方法适用于使用长焦距拍摄的星体照片,即星像占据数个像素的情况。对于数码相机直接拍摄的星空照片,则由于无法区分星像与噪点而无法使用。
其基本原理是判断每个像素的亮度是否有突然的变化。如果有,则改正为平均值;正常的像素不做改变。
以下是降噪效果:
上图:原大剪裁。2004年2月13日拍摄,ISO400,曝光39秒,降噪关闭。
下图:处理后
MATLAB源程序:
式中ITE为叠代次数,CRI为阈值设定
function imspotnr()
%噪点消除
disp('图像噪点消除');
[fname,pname] = uigetfile('*.*','原始图片');
%原始图片及显示
im=imread([pname,fname]);
[h,w,d]=size(im);
%分区处理
h0=round(h/3);
w0=round(w/3);
rec00=[1 ,1 ,1 , h0-1 ,h0-1 ,h0-1 ,2*h0-1 ,2*h0-1 ,2*h0-1
];
rec01=[1 ,w0-1 ,2*w0-1 , 1 ,w0-1 ,2*w0-1 ,1 ,w0-1 ,2*w0-1 ];
rec10=[h0,h0 ,h0 , 2*h0 ,2*h0 ,2*h0 ,h ,h ,h ];
rec11=[w0,2*w0 ,w , w0 ,2*w0 ,w ,w0 ,2*w0 ,w ];
for i=(1:9)
im00=im(rec00(i):rec10(i),rec01(i):rec11(i),:);
fim=singlesect(im00);
im(rec00(i):rec10(i),rec01(i):rec11(i),:)=fim;
end
imwrite(uint8(im),[pname,fname,'_nr.bmp'],'bmp');
%显示原始图片及处理结果
figure(1)
image(imread([pname,fname]));
axis equal;
figure(2)
image(uint8(im))
axis equal
function res=singlesect(imsrc)
%处理单块
[h,w,d]=size(imsrc);
im=double(imsrc);
cri=max(max(max(im)))/15; %判决阈值设定,可更改
ite=2;
for i=(1:ite)
imn(:,:,1)=singlelayer(h,w,im(:,:,1),cri);
imn(:,:,2)=singlelayer(h,w,im(:,:,2),cri);
imn(:,:,3)=singlelayer(h,w,im(:,:,3),cri);
im=imn;
end
res=im;
function res=singlelayer(h,w,im,cri)
%处理单层
%平均图
biash=[1,1,-1,-1,0,0,1,-1];
biasw=[1,-1,1,-1,1,-1,0,0];
for i=(1:8)
ims(:,:,i)=im;
ims(2:h-1,2:w-1,i)=im(2+biash:h-1+biash,2+biasw:w-1+biasw);
end
imeva=mean(ims,3);
[imcri,ind]=max(ims,[],3);
fim=im-imcri-cri;
fim=abs(fim)+fim;
fim=round(fim./(fim+0.0001));
fimn=1-fim;
res=im.*fimn+fim.*imeva;
|