基于灰度世界与白点检测的局部自动白平衡算法
一.算法原理
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帧内存(存储累加值)。
浙公网安备 33010602011771号