数学建模_CLAHE 图像增强Matlab代码包教会使用,直接替换数据即可

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

  1. 准备图像文件
    将待增强的图像存放于文件夹 Attachment 2 中,支持 RGB 和灰度图像。
  2. 运行程序
    在 MATLAB 命令窗口运行 CLAHEEnhancement,输入图像名称(包括后缀,如 example.jpg)。
  3. 查看结果
    • 增强后的图像保存于 test deal 文件夹中。
    • 程序会绘制亮度分布对比曲线,并显示原始与增强后的图像对比。

总结

CLAHE 是一种鲁棒性强、适应性广的图像增强方法,尤其在亮度分布不均的图像中表现卓越。通过调整参数(如 Clip Limit 和分布模式),可以进一步优化增强效果。

改进方向

  • 支持更多色彩空间(如 LAB 空间)的增强。
  • 对比 CLAHE 与其他增强方法(如 Retinex、Gamma 校正)的效果差异。
  • 批量处理功能以提高效率。
CLAHE(Contrast Limited Adaptive Histogram Equalization)是一种用于图像增强的算法。它首先将图像分成许多小块,然后对每个小块应用自适应直方图均衡化(AHE)算法。最后,通过插值来消除块之间的边界,确保增强后的图像平滑自然。下面是用MATLAB编写的CLAHE算法代码: ```matlab function enhanced_image = clahe(image, clip_limit, tile_size) % image:输入图像 % clip_limit:对比度裁剪阈值 % tile_size:分块尺寸 % 将输入图像转换为灰度图像 gray_image = rgb2gray(image); % 初始化增强后的图像 enhanced_image = zeros(size(gray_image)); % 计算图像的行数和列数 [rows, cols] = size(gray_image); % 计算行和列上的分块数 num_row_tiles = floor(rows / tile_size); num_col_tiles = floor(cols / tile_size); % 确保clip_limit不为0,限制范围为1到10之间 clip_limit = max(clip_limit, 1); clip_limit = min(clip_limit, 10); % 对每个分块应用AHE算法 for i = 1:num_row_tiles for j = 1:num_col_tiles % 获取当前分块的坐标 start_row = (i-1) * tile_size + 1; end_row = start_row + tile_size - 1; start_col = (j-1) * tile_size + 1; end_col = start_col + tile_size - 1; % 获取当前分块的图像 tile = gray_image(start_row:end_row, start_col:end_col); % 应用AHE算法 tile_eq = histeq(tile); % 裁剪直方图,并缩放到0-255范围 hist_clip = clipHist(tile_eq, clip_limit); % 将增强后的分块图像复制到输出图像中 enhanced_image(start_row:end_row, start_col:end_col) = hist_clip; end end % 标准化增强后的图像 enhanced_image = uint8(255 * mat2gray(enhanced_image)); end % 对直方图进行裁剪并缩放到0-255范围 function hist_clip = clipHist(image, clip_limit) % 计算直方图 histogram = imhist(image); % 裁剪直方图 cdf = cumsum(histogram) / numel(image); cdf_clip = min(cdf, clip_limit / 100); cdf_clip = cdf_clip / max(cdf_clip); % 缩放直方图 hist_clip = round(cdf_clip(image) * 255); end ``` 以上是用MATLAB实现的CLAHE算法的代码。该代码首先将输入图像转换为灰度图像,然后对图像进行分块,并对每个分块应用AHE算法。最后,对直方图进行裁剪并缩放到0-255范围,生成增强后的图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值