基于灰度世界与白点检测的局部自动白平衡算法

一.算法原理
1.定义:自动白平衡的目标是消除光源色温对图像颜色的影响,使白色物体在不同光照下都能呈现真实的白色。
2.改进点:
1)灰度世界全局处理导致局部色偏。
2)局部白平衡在颜色均匀区域产生的分块效应。
3.算法设计:
1)局部处理:使用滑动窗口实现局部自适应,避免全局处理导致的色偏。
2)双策略融合:结合“灰度世界”和“白点检测”假设
3)重叠窗口:步长小于窗口大小,平滑过渡不同区域的增益。
二.算法结构与代码

function outImg = AWB_Slide(inputImg, filterSize, weightGray)

    stepSize = 40;  %偶数同时可被4除尽,避免窗口落在错误位置

    img = double(inputImg);         
    [height, width] = size(img);    
    outImg = zeros(size(inputImg));  
    
    %增益矩阵
    gainR = zeros(height, width);   
    gainB = zeros(height, width);   
    weight = zeros(height, width);  

    for i = 1:stepSize:height
        for j = 1:stepSize:width

            %当前窗口
            rowStart = max(1, min(i, height-filterSize+1));
            colStart = max(1, min(j, width-filterSize+1));
            rowEnd = rowStart + filterSize - 1;
            colEnd = colStart + filterSize - 1;
            window = img(rowStart:rowEnd, colStart:colEnd);
            
            % 分离RGGB
            R = window(1:2:end, 1:2:end);   
            Gr = window(1:2:end, 2:2:end);  
            Gb = window(2:2:end, 1:2:end);  
            B = window(2:2:end, 2:2:end);   
            
            meanG = (mean(Gr(:)) + mean(Gb(:)))/2;
            maxG = max(max(Gr(:)), max(Gb(:)));
            
            % R增益
            meanR = mean(R(:));
            maxR = max(R(:));
            kR = meanG / meanR;           
            pR = maxG / maxR;         
            gainRVal = weightGray*kR + (1-weightGray)*pR;
            
            % B增益
            meanB = mean(B(:));
            maxB = max(B(:));
            kB = meanG / meanB;
            pB = maxG / maxB;
            gainBVal = weightGray*kB + (1-weightGray)*pB;

            %增益累计
            %R
            gainR(rowStart:2:rowEnd, colStart:2:colEnd) = ...
                gainR(rowStart:2:rowEnd, colStart:2:colEnd) + gainRVal;
            %B
            gainB(rowStart+1:2:rowEnd, colStart+1:2:colEnd) = ...
                gainB(rowStart+1:2:rowEnd, colStart+1:2:colEnd) + gainBVal;
            
            weight(rowStart:rowEnd, colStart:colEnd) = ...
                weight(rowStart:rowEnd, colStart:colEnd) + 1;
        end
    end
    
    % R
    outImg(1:2:height, 1:2:width) = img(1:2:height, 1:2:width) .* ...
        (gainR(1:2:height, 1:2:width) ./ weight(1:2:height, 1:2:width));
    % B
    outImg(2:2:height, 2:2:width) = img(2:2:height, 2:2:width) .* ...
        (gainB(2:2:height, 2:2:width) ./ weight(2:2:height, 2:2:width));

    outImg(1:2:height, 2:2:width) = img(1:2:height, 2:2:width);
    outImg(2:2:height, 1:2:width) = img(2:2:height, 1:2:width);
    outImg = uint16(outImg);
end

内存局限:
1.1帧原始Bayer数据(用于当前窗口处理)。
2.gainR、gainB、weight 矩阵各需1帧内存(存储累加值)。

posted on 2025-04-22 14:24  飞鸟healer  阅读(178)  评论(0)    收藏  举报