创作时间:2022-05-06
非均匀校正之两点校正(原理&MATLAB代码&效果)
目录:
1.原理&标定方法
2.代码
3.效果
正文:
先看下效果(校正前后对比)
1
2
3
4
5
1.原理
红外焦平面的响应非均匀性,其主要由焦平面制造的工艺,材料原因造成。因此,图像处理之前,需要进行预处理,包括非均匀校正和盲元校正。
非均匀校正的一种方法就是两点校正。
前提条件:
1)假设各个像元的影响都是线性的
2)忽略1/f电流噪声
实验室标定
准备:
黑体,镜头(可加可不加),电源,线缆等
步骤:
1) 固定一个积分时间
2) 将黑体设置为20℃,用采集卡连续保存100张raw图
3) 将黑体设置为35℃,用采集卡连续保存100张raw图
4) 按照一定的步进,改变积分时间,重复上述步骤
将20℃-35℃的盲元检测与校正做完之后,可以再进行扩展温度范围。建议值为10℃-40℃。
2.代码
%两点校正代码
% '06-May-2022'
%1)读低温黑体原始图像数据
%2)读高温黑体原始图像数据
%3)加载一张未校正的原始图像数据
%4)计算校正参数KB
%5) 进行校正
%----------------------
%1)读低温黑体数据
filename="低温黑体原始图像数据.raw";
if ~exist (filename,'file')
errordlg('文件不存在');
return
end
if ~isequal(filename(end-3:end),'.raw')
errordlg('文件格式必须是Raw');
return
end
numRows=640;
numCols=512;
Num=numRows*numCols;
L=100;
fid=fopen(filename,'r');
fseek(fid,0,'eof');
totalpixel=ftell(fid);
L_frame=floor(totalpixel/(2*Num));
L=min(L,L_frame);
if L<=0
errordlg({'图像大小不够一张!!';'单张640*512的16bit图大小为640kB!'});
return
end
A=zeros(Num,L);
for ii=1:L
fseek(fid,2*Num*(ii-1),'bof');
temp=fread(fid,Num,'uint16');
A(:,ii)=temp;
end
fclose(fid);
A=double(A);
T0_avg=mean(A,2);
T0_DN=mean(T0_avg);
h_load_t0=msgbox('T0温度下的原始图像加载完毕');
pause(0.5);
close(h_load_t0);
%2) 读高温黑体数据
filename="高温黑体原始图像数据.raw";
if ~exist (filename,'file')
errordlg('文件不存在');
return
end
if ~isequal(filename(end-3:end),'.raw')
errordlg('文件格式必须是Raw');
return
end
numRows=640;%高
numCols=512; %宽
Num=numRows*numCols;
L=100;
fid=fopen(filename,'r');fseek(fid,0,'eof');totalpixel=ftell(fid);
L_frame=floor(totalpixel/(2*Num));L=min(L,L_frame);
if L<=0
errordlg({'图像大小不够一张!!';'单张640*512的16bit图大小为640kB!'});
return
end
A=zeros(Num,L);
for ii=1:L
fseek(fid,2*Num*(ii-1),'bof');
temp=fread(fid,Num,'uint16');
A(:,ii)=temp;
end
fclose(fid);
A=double(A);
T1_avg=mean(A,2);
T1_DN=mean(T1_avg);
h_load_t1=msgbox('T1温度下的原始图像加载完毕');
pause(0.5);
close(h_load_t1);
%3)加载一张未校正的原始图像
filename="校正的原始图像数据.raw";
if ~exist (filename,'file')
errordlg('文件不存在');
return
end
if ~isequal(filename(end-3:end),'.raw')
errordlg('文件格式必须是Raw');
return
end
numRows=640;
numCols=512;
Num=numRows*numCols;
L=1;
fid=fopen(filename,'r');
fseek(fid,0,'eof');
totalpixel=ftell(fid);
L_frame=floor(totalpixel/(2*Num));
L=min(L,L_frame);
disp(L);
if L<=0
errordlg({'图像大小不够一张!!';'单张640*512的16bit图大小为640kB!'});
return
end
A=zeros(Num,L);
for ii=1:L
fseek(fid,2*Num*(ii-1),'bof');
temp=fread(fid,Num,'uint16');
A(:,ii)=temp;
end
fclose(fid);
T=double(A);
%4)计算校正参数KB
% 注:这里是不扣除盲元计算的KB,实际使用中可以考虑去除盲元,会更加精准
K=(T0_DN-T1dn)./(T0_avg-T1_avg);
K=max(K,0);
B=(T1dn.*T0_avg-T0_DN.*T1_avg)./(T0_avg-T1_avg);
% 5)进行校正&结果对比
T_NUC=K.*T+B;
%numRows=640;%高
%numCols=512; %宽
imgT=reshape(T,[numCols,numRows]);
imgT=imgT';
imgT_NUC=reshape(T_NUC,[numCols,numRows]);
imgT_NUC=imgT_NUC';
imtool( uint16([imgT,imgT_NUC]) );%结果对比
3.效果
写在前面了,这里略。
THE END~