红外图像去坏点总结

红外图像去坏点总结

Blog: https://blog.csdn.net/AnimateX

Email: semi_xiaobai@qq.com

风景如画

1 为什么要去坏点

严重影响成像质量!
因为我们显示时,灰度值会进行压缩,比如坏点的灰度值为10000而其他值都在2000左右,带来的后果就是整体图像偏暗。

2 目前硬件上的去坏点做法

  1. 先整帧检测坏点,判断并标记坏点,直接用整帧均值进行坏点替换
  2. 先整帧检测坏点,判断并标记坏点,利用图像的四邻域均值进行坏点替换
  3. 先整帧检测坏点,判断并标记坏点,利用图像的八邻域均值进行坏点替换

考虑速度和质量的影响,一般采用第二种方法,或者在第二种方法的基础上进行行列上的进一步扩展。第三种方法也可以再FPGA平台实时。这里只讲第三种方法如何实现,大家要先看前面我讲的两点校正算法,知道我们如果要去坏点,要经过两个过程,第一个过程是增益校正系数A的坏点抑制。第二个过程是第一个过程的进一步检测和优化。参考下面步骤

  1. 先对增益校正系数矩阵A进行坏点去除,A的范围根据实际情况进行设置或者对周边的15领域进行自适应判定,如果A不在该阈值范围内,则标记为坏点。然后用周边8(或15)邻域的均值进行替换,具体如果出现坏块的情况,这种方法无法有效去除。如果不影响效果,可以用平坦区或者整帧均值进行替换也可以。
  2. 在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
  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值