CLAHE 图像增强:方法与实现
模型简介
对比度受限自适应直方图均衡化(CLAHE, Contrast Limited Adaptive Histogram Equalization)是一种改进的直方图均衡化方法,能够在增强图像对比度的同时避免过度增强导致的伪影问题。本博客介绍一种基于 CLAHE 的图像增强方法,适用于灰度图像和 RGB 图像的亮度增强,特别是在亮度分布不均的情况下。
原理解析
1. 自适应直方图均衡化 (AHE)
AHE 的核心思想是将图像分为多个小区域(称为“网格”),对每个区域分别进行直方图均衡化。增强后的图像具有更好的局部对比度,但可能会引入噪声或伪影。
2. 对比度受限自适应直方图均衡化 (CLAHE)
CLAHE 在 AHE 的基础上引入了对比度限制机制,防止对比度增强过度导致伪影:
- Clip Limit:限制直方图中某个灰度级的最大频率值,将超出的频率分布到其他灰度级。
- 分布模式:可以选择直方图的分布类型(如均匀分布或瑞利分布)。
对于 RGB 图像,通常只对亮度通道进行 CLAHE 增强,从而保持色彩一致性。
公式化描述:
-
假设输入图像为 I(x,y),直方图均衡后的值为:
I ′ ( x , y ) = T [ I ( x , y ) ] I'(x, y) = T[I(x, y)] I′(x,y)=T[I(x,y)]
其中 T 是直方图均衡化变换函数。 -
CLAHE 增强后的值为:
I CLAHE ′ ( x , y ) = min ( T [ I ( x , y ) ] , Clip Limit ) I'_{\text{CLAHE}}(x, y) = \min(T[I(x, y)], \text{Clip Limit}) ICLAHE′(x,y)=min(T[I(x,y)],Clip Limit)
算法步骤
1. 图像预处理
- 读取输入图像。
- 如果是 RGB 图像,转换色彩空间,仅对亮度通道 Y 应用 CLAHE。
2. CLAHE 增强
- 使用
adapthisteq
函数对亮度通道进行增强,设置适当的 Clip Limit 和分布模式(如瑞利分布)。
3. 图像后处理
- 将增强后的亮度通道与原始的色度通道 Cb 和 Cr合并,转换回 RGB 空间。
- 如果是灰度图像,直接返回增强后的结果。
4. 评价与可视化
- 计算增强前后亮度分布对比。
- 显示原始图像与增强图像的对比图。
- 计算图像质量指标(如 PSNR、亮度分布)。
代码实现
以下是基于 MATLAB 的 CLAHE 增强代码及其讲解。
主函数 CLAHEEnhancement
function CLAHEEnhancement()
% 输入图片名称(带后缀)
image_name = input('请输入图片名称(包括后缀):', 's');
image_path = fullfile('Attachment 2', image_name); % 构建路径
% 检查图片是否存在
if ~isfile(image_path)
error('图片 %s 不存在,请检查文件名或路径!', image_name);
end
% 读取图片
img = imread(image_path);
% CLAHE增强处理
if size(img, 3) == 3
% RGB 图像增强:只处理亮度通道
img_yuv = rgb2ycbcr(img);
img_yuv(:, :, 1) = adapthisteq(img_yuv(:, :, 1), 'ClipLimit', 0.02, 'Distribution', 'rayleigh');
imgEnhanced = ycbcr2rgb(img_yuv);
else
% 灰度图像增强
imgEnhanced = adapthisteq(img);
end
% 保存增强后的图像
[~, name, ext] = fileparts(image_name);
output_image = fullfile('test deal', [name '_CLAHEEnhanced' ext]);
imwrite(imgEnhanced, output_image);
% 绘制亮度对比曲线
plotBrightnessComparison(img, imgEnhanced);
% 显示结果
figure, imshowpair(img, imgEnhanced, 'montage');
title('Original Image (Left) vs CLAHE Enhanced Image (Right)');
% 计算评价指标
evaluate_metrics(img, imgEnhanced);
% 输出保存路径
fprintf('增强后的图像已保存至:%s\n', output_image);
end
辅助函数:亮度分布对比 plotBrightnessComparison
function plotBrightnessComparison(original_img, enhanced_img)
% 计算处理前后的亮度分布对比曲线
% 转换为灰度图
original_gray = rgb2gray(original_img);
enhanced_gray = rgb2gray(enhanced_img);
% 图像分块数
num_blocks = 50;
% 计算亮度分布
brightness_original = calculateBrightnessDistribution(original_gray, num_blocks);
brightness_enhanced = calculateBrightnessDistribution(enhanced_gray, num_blocks);
% 绘制亮度分布对比曲线
figure;
plot(1:num_blocks, brightness_original, '-o', 'LineWidth', 1.5, 'DisplayName', 'Original');
hold on;
plot(1:num_blocks, brightness_enhanced, '-x', 'LineWidth', 1.5, 'DisplayName', 'Enhanced');
xlabel('Block Number');
ylabel('Average Brightness');
title('Brightness Distribution Comparison Before and After Enhancement');
legend;
grid on;
hold off;
end
辅助函数:亮度分布计算 calculateBrightnessDistribution
function brightness_distribution = calculateBrightnessDistribution(img, num_blocks)
% 计算图像分块的亮度分布
[height, width] = size(img);
% 分块尺寸
block_height = floor(height / num_blocks);
block_width = floor(width / num_blocks);
brightness_distribution = zeros(1, num_blocks);
for i = 1:num_blocks
% 定义当前块区域
row_start = (i - 1) * block_height + 1;
row_end = min(i * block_height, height);
% 提取当前块
block = img(row_start:row_end, :);
% 计算当前块的平均亮度
brightness_distribution(i) = mean(block(:));
end
end
使用方法
代码全文:
function CLAHEEnhancement()
% 输入图片名称(带后缀)
image_name = input('请输入图片名称(包括后缀):', 's');
image_path = fullfile('Attachment 2', image_name); % 构建路径
% 检查图片是否存在
if ~isfile(image_path)
error('图片 %s 不存在,请检查文件名或路径!', image_name);
end
% 读取图片
img = imread(image_path);
% CLAHE增强处理
if size(img, 3) == 3
img_yuv = rgb2ycbcr(img);
img_yuv(:, :, 1) = adapthisteq(img_yuv(:, :, 1),'ClipLimit', 0.02, 'Distribution', 'rayleigh');
imgEnhanced = ycbcr2rgb(img_yuv);
else
imgEnhanced = adapthisteq(img);
end
% 保存增强后的图像
[~, name, ext] = fileparts(image_name);
output_image = fullfile('test deal', [name '_CLAHEEnhanced' ext]);
imwrite(imgEnhanced, output_image);
% 绘制亮度对比曲线
plotBrightnessComparison(img, imgEnhanced);
% 显示结果
figure, imshowpair(img, imgEnhanced, 'montage');
title('Original Image (Left) vs CLAHE Enhanced Image (Right)');
% 计算评价指标
evaluate_metrics(img, imgEnhanced);
% 输出保存路径
fprintf('增强后的图像已保存至:%s\n', output_image);
end
function plotBrightnessComparison(original_img, enhanced_img)
% 计算处理前后的亮度分布对比曲线
% 转换为灰度图
original_gray = rgb2gray(original_img);
enhanced_gray = rgb2gray(enhanced_img);
% 图像分块数
num_blocks = 50;
% 计算亮度分布
brightness_original = calculateBrightnessDistribution(original_gray, num_blocks);
brightness_enhanced = calculateBrightnessDistribution(enhanced_gray, num_blocks);
% 绘制亮度分布对比曲线
figure;
plot(1:num_blocks, brightness_original, '-o', 'LineWidth', 1.5, 'DisplayName', 'Original');
hold on;
plot(1:num_blocks, brightness_enhanced, '-x', 'LineWidth', 1.5, 'DisplayName', 'Enhanced');
xlabel('Block Number');
ylabel('Average Brightness');
title('Brightness Distribution Comparison Before and After Enhancement');
legend;
grid on;
hold off;
end
function brightness_distribution = calculateBrightnessDistribution(img, num_blocks)
% 计算图像分块的亮度分布
[height, width] = size(img);
% 分块尺寸
block_height = floor(height / num_blocks);
block_width = floor(width / num_blocks);
brightness_distribution = zeros(1, num_blocks);
for i = 1:num_blocks
% 定义当前块区域
row_start = (i - 1) * block_height + 1;
row_end = min(i * block_height, height);
% 提取当前块
block = img(row_start:row_end, :);
% 计算当前块的平均亮度
brightness_distribution(i) = mean(block(:));
end
end
- 准备图像文件
将待增强的图像存放于文件夹Attachment 2
中,支持 RGB 和灰度图像。 - 运行程序
在 MATLAB 命令窗口运行CLAHEEnhancement
,输入图像名称(包括后缀,如example.jpg
)。 - 查看结果
- 增强后的图像保存于
test deal
文件夹中。 - 程序会绘制亮度分布对比曲线,并显示原始与增强后的图像对比。
- 增强后的图像保存于
总结
CLAHE 是一种鲁棒性强、适应性广的图像增强方法,尤其在亮度分布不均的图像中表现卓越。通过调整参数(如 Clip Limit 和分布模式),可以进一步优化增强效果。
改进方向
- 支持更多色彩空间(如 LAB 空间)的增强。
- 对比 CLAHE 与其他增强方法(如 Retinex、Gamma 校正)的效果差异。
- 批量处理功能以提高效率。