直方图均衡化与Matlab代码实现

2023-03-12,,

  昨天说了,今天要好好的来解释说明一下直方图均衡化。并且通过不调用histeq函数来实现直方图的均衡化。

  一、直方图均衡化概述

  直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。[1]

  根据香农定理关于信息熵的定义:

  对于一副图像而言,当每一个灰度值分布更均衡,图像所包含的信息量是越大的;相反,仅仅只有一个灰度值的时候,信息量很少。这个是我们能够想来的比如:纯黑图像包含信息量很少,而其他图像我们可能会看到一些人物、景物。

  就效果而言,直方图均衡化使得图像信息量变大,但是不可能会发生较小的灰度值在经过均衡化后变得比原来较大的灰度值更大。这也就意味着,我们通过均衡化后的图所观察到的景物应当与原来图像所观察到的一致,只是颜色层次更清晰,更加具有辨识度。

  二、直方图均衡化公式推导

  (ps:今天一开始看了好多人的推导都觉得特别乱,思路比较混乱,最后自己沉下心来研究了一下,终于将推导思路理顺了,在下文进行呈现)

  现假定原图的直方图-灰度值关系为f(x),则累积灰度直方图应当是F(x),经过均衡化后的直方图-灰度值关系为f(y),其累积灰度直方图应当是F(y)。原灰度值x与后灰度值y之间存在某种映射关系:y=T(x)。

    

  方程两边对y求导:

    

  由于有:

    

  可得:

    

  方程两边积分:

    

  即

    

  对于离散值而言:

    

  三、直方图均衡化Matlab代码实现

clc;
clear;
RGB = imread('2.jpg'); % 读取彩色图
subplot(2,3,1);imshow(RGB);title('彩色图'); fx=rgb2gray(RGB);
subplot(2,3,2);imshow(fx);title('灰度图');
subplot(2,3,3);imhist(fx);title('灰度图'); [R, C] = size(fx); % 统计每个像素值出现次数
count = zeros(1, 256);
for i = 1 : R
for j = 1 : C
count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%一下编写T函数[2]
T = zeros(1, 256);
T = double(T); count = double(count); % 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
T(1, i) = count(1, i) / (R * C);
end % 求累计概率,得到累计直方图
for i = 2 : 256
T(1, i) = T(1, i - 1) + T(1, i);
end % 完善T函数的定义
for i = 1 : 256
T(1, i) = T(1, i) * 255;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 完成每个像素点的映射
fy = double(fx);
for i = 1 : R
for j = 1 : C
fy(i, j) = T(1, fy(i, j) + 1);
end
end % 输出仍然要记得改数据类型
fy = uint8(fy);
subplot(2,3,5);imshow(fy);title('直方图均衡化');
subplot(2,3,6);imhist(fy);title('直方图均衡化');

 

参考文献:

[1] https://www.cnblogs.com/hustlx/p/5245461.html.

[2] https://blog.csdn.net/acmore_xiong/article/details/53183131.

2019-03-07

22:24:57

直方图均衡化与Matlab代码实现的相关教程结束。

《直方图均衡化与Matlab代码实现.doc》

下载本文的Word格式文档,以方便收藏与打印。