概要
直方图均衡化是一种图像处理技术,用于调整图像的对比度,以改善视觉效果或为后续处理做准备。本文介绍了一个MATLAB函数histogram_equalize,它实现了对输入图像的直方图均衡化操作,并返回均衡化后的图像以及对应的直方图。该函数首先检查输入是否为彩色图像,如果是,则将其转换为灰度图像。然后计算原始图像的直方图,并基于累计分布函数(CDF)映射新的灰度值,最后应用这些新值到输出图像中,并计算均衡化后的直方图。
整体架构流程
- 检查并转换图像:如果输入图像是彩色的(即有三个颜色通道),则使用加权平均法将其转换为灰度图像。
- 初始化和预处理:将图像数据类型转换为双精度浮点数,以便进行数学运算,并初始化必要的变量和矩阵。
- 计算原始直方图:统计每个灰度级别的像素出现次数,生成直方图。
- 计算累计分布函数(CDF):基于原始直方图计算CDF,并根据其结果确定新的灰度级别。
- 应用直方图均衡化:根据计算出的新灰度级别更新图像中的每一个像素。
- 计算均衡化后的直方图:再次统计每个灰度级别的像素出现次数,得到均衡化后的直方图。
技术名词解释
- 直方图均衡化:一种图像增强方法,通过重新分配图像中的亮度值来提高图像对比度。
- 累计分布函数 (CDF):累积概率分布函数,在直方图均衡化中用来确定新的灰度值。
- 灰度级:表示图像中不同亮度水平的数量,通常从0(黑色)到255(白色)。
技术细节
代码原理及注释
function [equalized_image, equalized_hist] = histogram_equalize(input_image)
% 如果是彩色图像,转换为灰度图像
if size(input_image, 3) == 3
input_image = (0.2989 * input_image(:,:,1) + 0.5870 * input_image(:,:,2) + 0.1140 * input_image(:,:,3));
end
img = im2double(input_image); % 将图像转换为双精度浮点数格式
img_out = zeros(size(img)); % 初始化输出图像矩阵
[m, n] = size(img); % 获取图像尺寸
% 计算直方图
h = zeros(1, 256); % 初始化直方图向量
for i = 1:m
for j = 1:n
gray_value = round(img(i,j) * 255) + 1; % 转换灰度值范围到[1, 256]
h(gray_value) = h(gray_value) + 1; % 统计每个灰度值的出现次数
end
end
h = h / (m * n); % 归一化直方图
s = zeros(1, 256); % 创建输出灰度值向量
rk = 0.0;
% 计算累计分布函数(CDF)并映射到新的灰度值
for i = 1:length(h)
rk = rk + h(i);
s(i) = round(rk * 255); % 映射到[0, 255]范围内的新灰度值
end
% 应用直方图均衡化
for i = 1:m
for j = 1:n
gray_value = round(img(i,j) * 255) + 1; % 获取灰度值并调整索引
img_out(i,j) = s(gray_value) / 255; % 映射到[0, 1]范围
end
end
equalized_image = img_out;
% 计算均衡化后的直方图
equalized_hist = zeros(1, 256);
for i = 1:m
for j = 1:n
gray_value = round(equalized_image(i,j) * 255) + 1; % 再次转换灰度值范围
equalized_hist(gray_value) = equalized_hist(gray_value) + 1;
end
end
equalized_hist = equalized_hist / (m * n); % 归一化直方图
end
注意事项
- 输入检查:此代码假设输入图像可以是单通道灰度图像或三通道RGB彩色图像。对于彩色图像,使用标准的RGB到灰度转换公式进行转换。
- 数据类型转换:使用
im2double函数将图像转换为双精度浮点数格式,确保所有数学运算都能准确执行。 - 直方图计算:这里直接遍历图像的所有像素来构建直方图。对于大尺寸图像,这种逐个像素处理的方法可能会比较慢,可以考虑利用MATLAB内置的直方图函数如
imhist来提高效率。 - 累计分布函数 (CDF) 和灰度映射:通过累加归一化的直方图来构建CDF,并以此为基础定义新的灰度映射关系。
- 直方图均衡化应用:根据新的灰度映射更新图像中的每一个像素值,实现直方图均衡化。
- 均衡化后直方图计算:与前面类似,再次遍历图像以统计均衡化后的灰度分布情况。
小结
上述MATLAB代码实现了直方图均衡化算法,这是一种常用的图像增强技术,能够有效地提升图像对比度,尤其适用于低对比度或特定区域对比度不足的图像。此代码提供了一个完整的直方图均衡化过程示例,包括了图像转换、直方图计算、累计分布函数构建、灰度映射以及最终的直方图均衡化应用。此外,代码还展示了如何计算均衡化前后的直方图,这对于评估均衡化效果非常有用。用户可以根据具体需求进一步优化这段代码,例如引入更高效的直方图计算方法或者扩展支持多通道图像的直方图均衡化。
5568



被折叠的 条评论
为什么被折叠?



