当前位置:[北京同好会]>[天文计算]>[一种消除噪点的方法]

 

一种数码照片降噪的方法

此方法适用于使用长焦距拍摄的星体照片,即星像占据数个像素的情况。对于数码相机直接拍摄的星空照片,则由于无法区分星像与噪点而无法使用。

其基本原理是判断每个像素的亮度是否有突然的变化。如果有,则改正为平均值;正常的像素不做改变。

以下是降噪效果:

上图:原大剪裁。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;