直方图截取线性拉伸的matlab代码,直方图均衡化与Matlab代码实现

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

一、直方图均衡化概述

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

1783a69cff4371b6ded742c9e0f20028.png

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

a09ad2baeedd3939246532e22b6a54b9.png

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

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

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

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

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

424b976527170f9729c01d0f7b4dda1b.png

方程两边对y求导:

98e52e895a5fa6efd34881ccca2056cb.png

由于有:

95e72eb4d807283837c30cc554f90a0d.png

可得:

04121d12b0812ed373aa18456e9c28b4.png

方程两边积分:

bf3bdb1d1794bfaa09c75fd2414e0302.png

ed5f405011edc2ed39d616440560cd43.png

对于离散值而言:

730a19aa76512f17f16e0c0c7aa5ac61.png

三、直方图均衡化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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值