由于影响THPF算法收敛速度与其鬼影问题的根本原因在于大量无关的场景信息被参与到非均匀性校正参数的计算过程中,所以只要尽可能将更多的场景信息,特别是强物体从原始图像中排除,再将剩下的部分参与到非均匀性校正参数的计算过程,这样就可以尽可能减小非随机运动与场景中强物体对校正过程的影响,有效减少鬼影效应。根据这个思想,SLPF-NUC 预先采用空域滤波器将输入的图像信号进行分离。由于在空间上,场景中目标信号具有连续相关性,表现为空域低频性,而非均匀性是由各探测器阵列元独立产生,各阵列元对应的输出的非均匀性差异较大,表现为空域高频性,所以应用空域滤波器将原始信号分离成高频( HSF) 和低频( LSF) 两个部分,只利用高频部分参与非均匀性的校正。
最早的算法中采用了空域线性均值滤波器,场景中的边缘信号同时被平均,所以可以引入一个阈值Th,大于阈值时,可认为它是场景的边缘,置零,不参与非均匀性的校正。后续不断升级低通滤波器,SLPF(空域均值滤波高通非均匀性校正算法)->BFTH(空域双边滤波高通非均匀性校正算法)->GFTH(空域引导滤波高通非均匀性校正算法)->NLMTH(空域非局部均值滤波高通非均匀性校正算法)。也可以通过添加运动检测判断、自适应权重系数对算法进行改进,效果越来越好的同时,算法实时硬件实现的难度也在不断提高。
MATLAB代码实现:
clear; closeall; clc; %% 初始化frameWidth = 640; frameHeight = 512; M = 200; % 时间参数image(:,:,:) = zeros(512,640,100); image_low(:,:,:) = zeros(512,640,100); image_high(:,:,:) = zeros(512,640,100); hsize = 5; H = fspecial('average',hsize); %% 帧间迭代fork = 2:100%读取序列图像fileName = ['.\序列图像\(', num2str(k), ')', '.Raw']; image(:,:,k) = double(reshape(uint16(fread(fopen(fileName),'uint16')) ,[frameWidthframeHeight])'); image_low(:,:,k)=filter2(H,image(:,:,k)); image_high(:,:,k) = image(:,:,k) -image_low(:,:,k); image(:,:,k) = 1/M*image_high(:,:,k) + (1-1/M)*image(:,:,k-1); endimage_x(:,:) = image(:,:,k); %% 测试图像filename = '第100帧.Raw'; fid = fopen(filename); image_raw = fread(fid,'uint16'); image_raw = uint16(image_raw); fclose(fid); data_temp = reshape(image_raw,[frameWidthframeHeight]); image_raw = data_temp'; image_raw = double(image_raw); image_out = image_raw-image_x; %% 输出结果图figure(1);imshow(image_raw,[]);title('原图像'); figure(2);imshow(image_out,[]);title('SLPF效果图');