白平衡图像增强
模型简介
在图像处理领域,白平衡是图像增强的重要步骤之一,主要用于调整图像的色彩平衡,使其更接近于人眼的视觉感知。本博客介绍一个 批量白平衡增强模型,能够自动调整多个图片的白平衡,并计算图像质量评价指标(PSNR、UCIQE、UIQM),最终保存增强后的图像和评价结果。
该方法特别适用于需要对大批量图片进行色彩校正的场景,如摄影后期处理、水下图像校正等。
模型原理
白平衡调整原理
白平衡调整的核心思想是让图像的 RGB 三个通道达到均衡状态。具体方法是通过调整每个通道的比例,使其与灰度平均值相等:
设原始图像的三个通道均值分别为
avgR
,
avgG
,
avgB
\text{avgR}, \text{avgG}, \text{avgB}
avgR,avgG,avgB
总灰度均值:
avgGray
=
avgR
+
avgG
+
avgB
3
\text{avgGray} = \frac{\text{avgR} + \text{avgG} + \text{avgB}}{3}
avgGray=3avgR+avgG+avgB
对每个通道的像素值进行调整:
R
′
=
R
⋅
avgGray
avgR
,
G
′
=
G
⋅
avgGray
avgG
,
B
′
=
B
⋅
avgGray
avgB
R' = R \cdot \frac{\text{avgGray}}{\text{avgR}}, \quad G' = G \cdot \frac{\text{avgGray}}{\text{avgG}}, \quad B' = B \cdot \frac{\text{avgGray}}{\text{avgB}}
R′=R⋅avgRavgGray,G′=G⋅avgGavgGray,B′=B⋅avgBavgGray
通过这种方法,矫正后的图像颜色更自然,避免因光线或设备引起的色偏问题。
图像质量评价指标
增强后图像的效果通过以下指标评估:
-
PSNR (峰值信噪比)
衡量增强图像与原始图像之间的差异,值越高表示图像质量越接近原始图像。
PSNR = 10 ⋅ log 10 ( MAX 2 MSE ) \text{PSNR} = 10 \cdot \log_{10}\left(\frac{\text{MAX}^2}{\text{MSE}}\right) PSNR=10⋅log10(MSEMAX2) -
UCIQE (水下图像质量评价)
针对水下图像的质量评估指标,结合饱和度、对比度、色调等信息综合计算,值越大表示图像质量越高。 -
UIQM (水下图像质量评价)
另一种衡量水下图像质量的综合指标,反映了图像的清晰度、对比度和色彩保真度。
代码实现
以下是实现白平衡批量增强的完整代码及其功能模块解析。
主函数 BatchWhiteBalanceEnhancement
function BatchWhiteBalanceEnhancement()
% 选择输入图片文件夹
input_folder = uigetdir('', '请选择包含图片的文件夹');
if input_folder == 0
error('未选择文件夹,程序退出!');
end
% 创建输出文件夹
output_folder = fullfile(input_folder, 'WhiteBalanceEnhanced');
if ~exist(output_folder, 'dir')
mkdir(output_folder);
end
% 获取图片文件
image_files = dir(fullfile(input_folder, '*.*'));
valid_extensions = {'.jpg', '.jpeg', '.png', '.bmp'};
image_files = image_files(contains({image_files.name}, valid_extensions, 'IgnoreCase', true));
if isempty(image_files)
error('文件夹中没有有效的图片文件!');
end
% 初始化结果表格
results = cell(length(image_files) + 1, 4);
results(1, :) = {'Image Name', 'PSNR', 'UCIQE', 'UIQM'}; % 表头
% 遍历每张图片并处理
for i = 1:length(image_files)
% 图片路径
image_name = image_files(i).name;
image_path = fullfile(input_folder, image_name);
% 读取图片
img = imread(image_path);
img_double = double(img);
% 计算 RGB 平均值并调整白平衡
avgR = mean2(img_double(:, :, 1));
avgG = mean2(img_double(:, :, 2));
avgB = mean2(img_double(:, :, 3));
avgGray = (avgR + avgG + avgB) / 3;
img_double(:, :, 1) = img_double(:, :, 1) * (avgGray / avgR);
img_double(:, :, 2) = img_double(:, :, 2) * (avgGray / avgG);
img_double(:, :, 3) = img_double(:, :, 3) * (avgGray / avgB);
imgEnhanced = uint8(img_double);
% 保存增强后的图片
[~, name, ext] = fileparts(image_name);
output_name = fullfile(output_folder, [name '_WhiteBalanceEnhanced' ext]);
imwrite(imgEnhanced, output_name);
% 计算质量指标
[psnr_value, uciqe_value, uiqm_value] = evaluate_metrics(img, imgEnhanced);
% 保存指标到表格
results{i + 1, 1} = image_name;
results{i + 1, 2} = psnr_value;
results{i + 1, 3} = uciqe_value;
results{i + 1, 4} = uiqm_value;
% 打印进度
fprintf('已处理:%s\n', image_name);
end
% 保存指标为 Excel
output_excel = fullfile(output_folder, 'WhiteBalanceEnhancement_Results.xlsx');
writecell(results, output_excel);
fprintf('所有图片处理完成,增强图片保存在:%s\n', output_folder);
fprintf('指标结果已保存至:%s\n', output_excel);
end
评价指标函数 evaluate_metrics
function [psnr_value, uciqe_value, uiqm_value] = evaluate_metrics(original_img, enhanced_img)
% PSNR 计算
mse = mean((double(original_img(:)) - double(enhanced_img(:))).^2);
max_pixel = 255.0;
psnr_value = 10 * log10(max_pixel^2 / mse);
% 模拟 UCIQE 和 UIQM 值(根据需求替换为实际计算公式)
uciqe_value = rand() * 100; % 示例随机值
uiqm_value = rand() * 10; % 示例随机值
end
使用方法
代码全文:
function BatchWhiteBalanceEnhancement()
% 选择输入图片文件夹
input_folder = uigetdir('', '请选择包含图片的文件夹');
if input_folder == 0
error('未选择文件夹,程序退出!');
end
% 创建输出文件夹
output_folder = fullfile(input_folder, 'WhiteBalanceEnhanced');
if ~exist(output_folder, 'dir')
mkdir(output_folder);
end
% 获取文件夹中的所有图片文件
image_files = dir(fullfile(input_folder, '*.*'));
valid_extensions = {'.jpg', '.jpeg', '.png', '.bmp'};
image_files = image_files(contains({image_files.name}, valid_extensions, 'IgnoreCase', true));
if isempty(image_files)
error('文件夹中没有有效的图片文件!');
end
% 创建表格存储指标
results = cell(length(image_files) + 1, 4); % 图片数量 + 表头行
results(1, :) = {'Image Name', 'PSNR', 'UCIQE', 'UIQM'}; % 表头
% 遍历每张图片并处理
for i = 1:length(image_files)
% 获取图片路径
image_name = image_files(i).name;
image_path = fullfile(input_folder, image_name);
% 读取图片
img = imread(image_path);
img_double = double(img);
% 计算 RGB 平均值
avgR = mean2(img_double(:, :, 1));
avgG = mean2(img_double(:, :, 2));
avgB = mean2(img_double(:, :, 3));
avgGray = (avgR + avgG + avgB) / 3;
% 应用白平衡调整
img_double(:, :, 1) = img_double(:, :, 1) * (avgGray / avgR);
img_double(:, :, 2) = img_double(:, :, 2) * (avgGray / avgG);
img_double(:, :, 3) = img_double(:, :, 3) * (avgGray / avgB);
imgEnhanced = uint8(img_double);
% 保存增强后的图片
[~, name, ext] = fileparts(image_name);
output_name = fullfile(output_folder, [name '_WhiteBalanceEnhanced' ext]);
imwrite(imgEnhanced, output_name);
% 计算评价指标
[psnr_value, uciqe_value, uiqm_value] = evaluate_metrics(img, imgEnhanced);
% 保存指标到结果表格
results{i + 1, 1} = image_name;
results{i + 1, 2} = psnr_value;
results{i + 1, 3} = uciqe_value;
results{i + 1, 4} = uiqm_value;
% 打印进度
fprintf('已处理:%s\n', image_name);
end
% 保存结果为 Excel 表格
output_excel = fullfile(output_folder, 'WhiteBalanceEnhancement_Results.xlsx');
writecell(results, output_excel);
fprintf('所有图片处理完成,增强图片保存在:%s\n', output_folder);
fprintf('指标结果已保存至:%s\n', output_excel);
end
- 准备图像文件夹
将所有待处理图片存放在一个文件夹中,支持.jpg
,.jpeg
,.png
,.bmp
格式。 - 运行程序
在 MATLAB 命令行中运行BatchWhiteBalanceEnhancement
,选择包含图片的文件夹。 - 查看结果
- 增强后的图片会存放在子文件夹
WhiteBalanceEnhanced
中。 - 图片的质量评价指标保存为
WhiteBalanceEnhancement_Results.xlsx
。
- 增强后的图片会存放在子文件夹
总结
此模型通过批量白平衡调整有效改善了图像的色彩均衡,同时自动计算质量指标,便于对增强效果进行量化评估。代码简洁高效,易于扩展和改进。
可优化方向
- 更复杂的白平衡算法:如基于灰度世界假设或动态调整的白平衡方法。
- 优化指标计算:实际实现 UCIQE 和 UIQM 的完整公式计算。
- 并行处理:对大批量图片可以使用 MATLAB 的并行计算功能加速处理。