1.基础知识
定义:通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。所以,直方图修正的关键就是灰度映像函数。
计算步骤:
1、先对原始的直方图均衡化:S = T(r)
2、对规定的直方图规定化:v=G(z)
3、令 S = v,则:z = G-1(v) = G-1[T(r)]
例题:假设一幅图像具有如表1 所示概率分布,对其进行规定化。要求规定化后的图像具有如表2 所示的灰度级分布。
表一:
灰度级 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
各灰度级概率分布 | 0.10 | 0.20 | 0.30 | 0.10 | 0.15 | 0.05 | 0.05 | 0.05 |
表二:
灰度级 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
各灰度级概率分布 | 0.10 | 0.20 | 0.30 | 0.10 | 0.15 | 0.05 | 0.05 | 0.05 |
解题过程
2.代码实现
假设原始图像为'original_image.jpg',目标图像为'target_image.jpg'。首先,将原始图像和目标图像转换为灰度图像。然后,计算原始图像和目标图像的直方图,并对其进行归一化处理。接下来,计算原始图像和目标图像的累积分布函数。根据累积分布函数的差异来构建灰度级映射表。最后,使用映射表将原始图像的像素值替换为对应的目标图像的像素值,得到规定化结果图像。
% 读取原始图像和目标图像
originalImage = imread('original_image.jpg');
targetImage = imread('target_image.jpg');
% 将原始图像和目标图像转换为灰度图像
originalGray = rgb2gray(originalImage);
targetGray = rgb2gray(targetImage);
% 计算原始图像和目标图像的直方图
originalHist = imhist(originalGray);
targetHist = imhist(targetGray);
% 对直方图进行归一化处理
originalHist = originalHist / sum(originalHist);
targetHist = targetHist / sum(targetHist);
% 计算原始图像和目标图像的累积分布函数
originalCDF = cumsum(originalHist);
targetCDF = cumsum(targetHist);
% 构建灰度级映射表
mappingTable = zeros(256, 1, 'uint8');
for i = 1:256
[~, index] = min(abs(originalCDF(i) - targetCDF));
mappingTable(i) = index - 1; % 灰度级从0开始
end
% 应用灰度级映射表进行直方图规定化
resultImage = mappingTable(originalGray + 1);
% 显示原始图像、目标图像和规定化结果图像
subplot(1, 3, 1);
imshow(originalImage);
title('Original Image');
subplot(1, 3, 2);
imshow(targetImage);
title('Target Image');
subplot(1, 3, 3);
imshow(resultImage);
title('Result Image');
3.总结
直方图规定化是一种用于调整图像对比度和亮度的方法,通过将图像的像素值映射到目标直方图的过程来实现。
优点:
- 增强对比度:直方图规定化可以显著改善图像的对比度,使得图像中的细节更加突出。
- 调整亮度:通过匹配目标直方图,可以调整图像的亮度分布,使得图像更贴近期望的亮度效果。
- 保留图像特征:在规定化过程中,图像的整体特征和结构通常能够得到保留,只是对比度和亮度发生了调整。
缺点:
- 信息丢失:直方图规定化可能会导致原始图像中的一些细节和信息丢失,特别是在目标直方图与原始直方图差异较大的情况下。
- 过度增强:如果目标直方图的动态范围远大于原始图像的动态范围,规定化可能会导致一些像素值集中在极端位置,使得图像出现过度增强或失真。
- 对异常值敏感:直方图规定化对噪声和异常值比较敏感,可能会导致一些不希望的结果。