1 为什么要去坏点
严重影响成像质量!
因为我们显示时,灰度值会进行压缩,比如坏点的灰度值为10000而其他值都在2000左右,带来的后果就是整体图像偏暗。
2 目前硬件上的去坏点做法
- 先整帧检测坏点,判断并标记坏点,直接用整帧均值进行坏点替换
- 先整帧检测坏点,判断并标记坏点,利用图像的四邻域均值进行坏点替换
- 先整帧检测坏点,判断并标记坏点,利用图像的八邻域均值进行坏点替换
考虑速度和质量的影响,一般采用第二种方法,或者在第二种方法的基础上进行行列上的进一步扩展。第三种方法也可以再FPGA平台实时。这里只讲第三种方法如何实现,大家要先看前面我讲的两点校正算法,知道我们如果要去坏点,要经过两个过程,第一个过程是增益校正系数A的坏点抑制。第二个过程是第一个过程的进一步检测和优化。参考下面步骤
- 先对增益校正系数矩阵A进行坏点去除,A的范围根据实际情况进行设置或者对周边的15领域进行自适应判定,如果A不在该阈值范围内,则标记为坏点。然后用周边8(或15)邻域的均值进行替换,具体如果出现坏块的情况,这种方法无法有效去除。如果不影响效果,可以用平坦区或者整帧均值进行替换也可以。
- 在step1的基础上进行校正,检测图像的坏点是否存在,如果不存在,可以不进行进一步处理。如果部分坏点依然存在,则需要在进行第二次坏点去除,同样设置上下灰度阈值,检测坏点是否在双阈值范围内。如果不在则标记为坏点,并用周边邻域的均值进行坏点值替换。
Code
function imgOut = RemoveBadPoint( object )
% 本函数仅针对灰度图像!!!!
[M, N, num] = size( object );
imgOut = zeros(M, N, num);
for i = 1 : num
flag = 0;
Temp = object(:, :, i);
% 先标记无法通过后续手段处理的坏点
Temp( isnan( Temp(:) ) == 1 ) = flag;
Temp( isinf( Temp(:) ) == 1 ) = flag;
% Pre process
Min = min( Temp(:) );
Temp = Temp - Min .* ones(M, N);
avgTemp = mean( Temp(:) );
% 针对不同图像 XXX 需要自己设置
th = avgTemp * XXX;
tl = avgTemp * XXX;
for s = 1 : M
for t = 1: N
if Temp(s, t) > th
Temp(s, t) = flag;
elseif Temp(s, t) < tl
Temp(s, t) = flag;
end
end
end
TempNew = padarray(Temp, [1 1], 'replicate');
for k = 2 : M + 1
for l = 2 : N + 1
judge = TempNew(k-1 : k+1, l-1 : l+1);
% bad point
bp = find(judge == flag);
gp = find(judge ~= flag);
% number of good point
nbp = 9 - numel(bp);
if TempNew(k, l) == flag
if nbp > 0
TempNew(k, l) = sum( judge(gp) ) / nbp;
else
TempNew(k, l) = avgTemp;
end
end
end
end
imgOut(:, :, i) = TempNew(2 : M+1, 2 : N+1);
end
end