在图像处理中,直方图均衡化是一种常用的方法,用于改善图像的对比度,尤其是在图像的亮度不均匀时。这种方法通过重新分配图像的像素值,使得图像的直方图更加均匀,从而提升图像的对比度和细节。以下是在MATLAB中实现灰度图像直方图均衡化的详细步骤和代码示例。
1. 准备工作
首先,确保你已经安装了MATLAB软件,并且你的图像文件是灰度图像。以下是一个基本的MATLAB脚本,用于读取图像并显示其原始直方图。
% 读取灰度图像
I = imread('example.jpg');
I = rgb2gray(I); % 如果图像是彩色的,需要转换为灰度
% 显示原始图像
subplot(1, 2, 1);
imshow(I);
title('原始图像');
% 显示原始图像的直方图
subplot(1, 2, 2);
histeq(I);
title('原始图像直方图');
2. 计算累积分布函数(CDF)
直方图均衡化的核心是计算图像的累积分布函数(CDF)。以下代码展示了如何计算灰度图像的CDF。
% 计算直方图
[hist, L] = imhist(I);
% 计算累积分布函数
cdf = cumsum(hist) / sum(hist);
% 计算映射表
L_eq = L * (length(L) - 1) * cdf / (cdf(end) - cdf(1));
L_eq = floor(L_eq) + 1;
L_eq = min(L_eq, length(L));
3. 应用映射表
接下来,使用计算出的映射表来转换图像的像素值。
% 应用映射表进行直方图均衡化
I_eq = imapplylut(I, L_eq);
4. 显示均衡化后的图像和直方图
最后,显示均衡化后的图像以及其直方图,以便比较。
% 显示均衡化后的图像
subplot(1, 2, 1);
imshow(I_eq);
title('均衡化后的图像');
% 显示均衡化后图像的直方图
subplot(1, 2, 2);
histeq(I_eq);
title('均衡化后图像直方图');
5. 完整的MATLAB脚本
将上述步骤整合到一个完整的脚本中,如下所示:
% 读取灰度图像
I = imread('example.jpg');
I = rgb2gray(I); % 如果图像是彩色的,需要转换为灰度
% 显示原始图像
subplot(1, 2, 1);
imshow(I);
title('原始图像');
% 显示原始图像的直方图
subplot(1, 2, 2);
histeq(I);
title('原始图像直方图');
% 计算直方图
[hist, L] = imhist(I);
% 计算累积分布函数
cdf = cumsum(hist) / sum(hist);
% 计算映射表
L_eq = L * (length(L) - 1) * cdf / (cdf(end) - cdf(1));
L_eq = floor(L_eq) + 1;
L_eq = min(L_eq, length(L));
% 应用映射表进行直方图均衡化
I_eq = imapplylut(I, L_eq);
% 显示均衡化后的图像
subplot(1, 2, 1);
imshow(I_eq);
title('均衡化后的图像');
% 显示均衡化后图像的直方图
subplot(1, 2, 2);
histeq(I_eq);
title('均衡化后图像直方图');
通过运行这个脚本,你可以看到原始图像和经过直方图均衡化处理后的图像,以及它们各自的直方图。通常,均衡化后的图像会有更高的对比度和更丰富的细节。
