16位或8位单通道图像直方图均衡化算法原理与实现

理论知识来源:
直方图均衡化算法原理与实现
直方图均衡化

16位或者8位直方图实现代码:
直方图均衡(支持单通道16位和8位图像).rar


直方图均衡化的介绍

直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。

例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。

采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。

换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。

直方图均衡化原理

我们知道提高图像对比度的变换函数f(x)f(x)f(x)需要满足一下条件:

  1. f(x)在0<=x<=L−1上单调递增(不要求严格单调递增),其中L表示灰度级(L=256)
  2. f(x)的范围是[0,L−1]

我们知道当图像直方图完全均匀分布的时候,此时图像的熵是最大的(随机变量每个值的概率都相同时,概率最大),图像对比度是最大的。所以,理想情况下,图像经过变换函数f(x)变换后,直方图能够均匀分布,此时对比度是最大的。

那问题来了?怎样的变换函数具有如此神奇的功能呢?
在图像处理中,有一个重要的函数,能够满足上面的条件:

其中 p x ( x ) p_x(x) px(x)表示概率密度函数,在离散的图像中,表示直方图的每个灰度级的概率(在图像中,灰度级就可以看成是一个随机变量,而直方图就是该随机变量的概率密度函数),由概率论的知识,我们可以知道,变换函数f(x)其实就是连续型随机变量x的分布函数,表示的是函数下方的面积。

分布函数的两个性质:1.单调不减 2.值域为[0,1],我们可以知道f(x)满足条件1和2

有人可能会有这个疑问?图像是离散的,为什么可以用连续的来表示呢?从数学角度来看,离散是连续的一种特例(图像就是一个很好的例子)

下面我们证明变换后的直方图是均匀的。
由概率论知识,变换后的概率密度:

由变上限函数求导法则可知:

反函数的导数等于原函数导数的倒数,所以

在这里插入图片描述
所以:

看到了吧,变换后的概率密度函数是一个均匀分布,对于图像来说,就是每个灰度级概率都是相等的,达到了我们的目的。

下面我们需要将这个变换函数转换为图像中的表达,图像中,我们可以知道,可以使用求和代替积分,差分代替微分,所以上述的变换函数就是:
其中h(x)表示直方图中每个灰度级像素的个数, w和 h分别表示图像的宽和高。

手工实现直方图均衡化

了解直方图均衡化的原理之后,我们以一个简单的例子来手工计算均衡化后的图像。这里我们假设存在以下这张图像(假定图像的灰度级范围是 [0, 9]):
原始图像

🔳🔳第一步,计算原始图像的灰度直方图 n k n_{k} nk

n ( 0 ) = 3 n(0) = 3 n(0)=3,即原始图像中灰度级为0的像素的个数是3,直接从图1中可以数出来。按这样的方式分别得出 n ( 1 ) , n ( 2 ) , . . . , n ( 9 ) n(1), n(2), ..., n(9) n(1),n(2),...,n(9)。这里我们可以得到 n k = [ 3 , 2 , 4 , 4 , 1 , 1 , 4 , 1 , 2 , 3 ] n_{k}= [3,2,4,4,1,1,4,1,2,3] nk=[3,2,4,4,1,1,4,1,2,3]


🔳🔳第二步,计算原始图像的像素总个数。

N = 5 ∗ 5 = 25 N = 5*5 = 25 N=55=25

🔳🔳第三步,计算原始图像的灰度分布频率。

p r ( k ) = n k / N = [ 3 / 25 , 2 / 25 , 4 / 25 , 4 / 25 , 1 / 25 , 1 / 25 , 4 / 25 , 1 / 25 , 2 / 25 , 3 / 25 ] , k = 0 , 1 , 2 , . . . , 9 p_{r}(k) = n_{k} / N = [3/25,2/25,4/25,4/25,1/25,1/25,4/25,1/25,2/25,3/25],k = 0, 1, 2, ..., 9 pr(k)=nk/N=[3/25,2/25,4/25,4/25,1/25,1/25,4/25,1/25,2/25,3/25]k=0,1,2,...,9

🔳🔳第四步,计算原始图像的灰度累积分布频率。

s k = ∑ i = 0 k n i N = [ 3 / 25 , 5 / 25 , 9 / 25 , 13 / 25 , 14 / 25 , 15 / 25 , 19 / 25 , 20 / 25 , 22 / 25 , 25 / 25 ] , k = 0 , 1 , 2 , . . . , 9 s_{k} = \sum_{i=0}^{k}\frac{n_{i}}{N}= [3/25,5/25,9/25,13/25,14/25,15/25,19/25,20/25,22/25,25/25],k = 0, 1, 2, ..., 9 sk=i=0kNni=[3/25,5/25,9/25,13/25,14/25,15/25,19/25,20/25,22/25,25/25]k=0,1,2,...,9

🔳🔳第五步,将归一化的 s_{k} 乘以 L-1再四舍五入,以使得均衡化后图像的灰度级与归一化前的原始图像一致。

s 0 = 3 25 ∗ ( L − 1 ) = 3 25 ∗ 9 = 1.08 s_{0} = \frac{3}{25} *(L-1) = \frac{3}{25} *9 = 1.08 s0=253(L1)=2539=1.08,四舍五入之后其值为1,也就是说原始图像中灰度级0对应均衡化后的灰度级1,即0→1。

同理:
s_{1} = 1.8,四舍五入之后为2,即1→2;
s_{2} = 3.24,四舍五入之后为3,即2→3;
s_{3} = 4.68,四舍五入之后为5,即3→5;
s_{4} = 5.04,四舍五入之后为5,即4→5;
s_{5} = 5.4,四舍五入之后为5,即5→5;
s_{6} = 6.84,四舍五入之后为7,即6→7;
s_{7} = 7.2,四舍五入之后为7,即7→7;
s_{8} = 7.92,四舍五入之后为8,即8→8;
s_{9} = 9,四舍五入之后为9,即9→9。
以上的映射关系,就是变换函数 T® 的作用。

🔳🔳第六步,根据以上映射关系,参照原始图像中的像素,可以写出直方图均衡化之后的图像:

以上过程即为手动计算直方图均衡化。接着,我们看一下均衡化后图像的灰度直方图,如图2所示。


在图1中,原始图像灰度值为4,5,7的像素的个数为1,
因此在图2中,这三个像素值点分别归并到相邻的灰度值中。
因为有三个灰度值归并,因此在均衡化处理后,出现了三个空位,由这些空位将原来相邻的灰度值展开(举个例子:5和6相邻,均衡化后,变成5和7相邻),故而展宽了对比度,但是归并也带来了某些相邻像素对比度的降低(举个例子:4和5相邻,均衡化后,变成5和5相邻)。这也说明了直方图均衡化方法对灰度分布比较集中的图像的处理效果比较明显。

16位或者8位直方图实现代码:
直方图均衡(支持单通道16位和8位图像).rar

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值