【学习图像处理】之实验二

您所在的位置:网站首页 直方图均衡化处理的算法步骤包括 【学习图像处理】之实验二

【学习图像处理】之实验二

2024-07-15 09:32| 来源: 网络整理| 查看: 265

灰度图像直方图规定化 图像增强一、实验内容二、灰度直方图1、什么是灰度直方图?2、直方图均衡化3、直方图规定化 三、代码实现与分析0、辅助功能实现1、绘制原图像直方图SH2、绘制均衡直方图SQH ,给出均衡图象QI3、绘出目标均衡直方图EQH4、绘制规定化变换函数T,给出最终增强图象DI及其直方图DH 结语

图像增强

上一回我们通过进行图像反白、调整调色板取值和彩图变灰图的实验对bmp图像的数据格式有了比较熟练的了解。其实一张图片上往往只有很少一部分信息是我们真正需要的,而这些信息却埋没于茫茫的像素之中,利用起来很不方便,因此我们就需要对图像进行增强。 增强什么?当然是依据需求定向的加强指定内容。今天的主题就是对灰度图像进行直方图均衡化(Histogram Equalization)与直方图规定化(Histogram Specifications)处理。

一、实验内容 绘出原图象直方图SH绘出直方图SH的均衡直方图SQH ,给出均衡图象QI绘出目标直方图EH的均衡直方图EQH绘出完成规定化任务的变换函数T,给出最终增强图象DI及其直方图DH 二、灰度直方图 1、什么是灰度直方图?

对于灰度图而言,画面是由很多个不同灰度值的像素组成的,图像中灰度的分布情况就成为了一个很重要的特征信息,因为它直接决定了整张图片什么信息最为突出,而另一些则不太明显。 灰度直方图,即是对图像中每个灰度级的像素数做了统计,绘制成的以灰度级为横坐标,像素个数(频率)为纵坐标的图像,它能够直观的体现灰度图像中某种灰度出现的概率,表达式为: P r ( r k ) = n k n Pr(rk)=\frac{nk}{n} Pr(rk)=nnk​ ,其中 r k rk rk为灰阶, n k nk nk表示灰度级为 r k rk rk的像元数目。 当然直方图也有一个很明显的缺点,就是它丢失了像素所在位置的信息。

2、直方图均衡化

一般一张自然的灰度图都会集中在相对较窄的一段灰阶内,这样就会导致细节丢失。如果我们通过某种手段,把灰度区间拉大或者让灰度尽可能均匀分布,这样做就可以增大图像对比度,从而把细节信息显示出来。 直方图均衡化就是一种达成上述目的的手段。均衡化处理后,灰度范围变大,对比度变大,清晰度变大,能够有效增强图像。其具体的推导过程涉及概率论中知识,感兴趣可以看这位作者撰写的直方图均衡化的数学原理,而它的作用解释可以见直方图均衡化作用。 对于我们写代码而言,只需要知道最终的变换公式即可: y = f ( x ) = ( L − 1 ) ∑ 0 x i h ( x i ) w ∗ h y=f(x)=(L-1)\sum_{0}^{x_i} \frac{h(x_i)}{w*h} y=f(x)=(L−1)∑0xi​​w∗hh(xi​)​

3、直方图规定化

上面讲到了直方图均衡化,现在有一个问题:如果两张图片s和u,他们都可以均衡化到t,那是否意味着s可以通过某种方法转换成u呢?答案是肯定的,我们用几个公式来表示s、u、t间的关系: t = T ( s k ) = ∑ i = 0 k p s ( s i ) t=T(s_k)=\sum_{i=0}^{k} p_s(s_i) t=T(sk​)=∑i=0k​ps​(si​) (1) k = 0 , 1 , . . . , M − 1 k=0,1,...,M-1 k=0,1,...,M−1 t = T u ( u j ) = ∑ j = 0 l p u ( u j ) t=T_u(u_j)=\sum_{j=0}^{l} p_u(u_j) t=Tu​(uj​)=∑j=0l​pu​(uj​) (2) l = 0 , 1 , . . . , N − 1 l=0,1,...,N-1 l=0,1,...,N−1

由此可见,我们想要通过均衡化的结果逆求出u是可行的。我们只需要找到s到u的映射关系T,而这个关系应该是: ∣ ∑ i = 0 k p s ( s i ) − ∑ i = 0 l p u ( u j ) ∣ |\sum_{i=0}^{k} p_s(s_i)-\sum_{i=0}^{l} p_u(u_j)| ∣∑i=0k​ps​(si​)−∑i=0l​pu​(uj​)∣

三、代码实现与分析

这次实验中我们用下面这张图作为原图像:

在这里插入图片描述

0、辅助功能实现

如果你仔细分析一下实验的每一步,会发现我们需要多次的存储用以绘制直方图的数据,而且这个数据往往是保存在一个数组之中,因此我们可以专门写一个函数将数组保存到txt文件中去。

template bool array2txt(T &H,const char* cFilename) //将一个数组输出到以cFilename命名的txt文件中 { ofstream outfile; outfile.open(cFilename, ios::out); if (!outfile.is_open()) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3