失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java 灰度直方图_【数字图像处理】灰度直方图 直方图均衡化 直方图规定化...

java 灰度直方图_【数字图像处理】灰度直方图 直方图均衡化 直方图规定化...

时间:2022-07-15 02:52:06

相关推荐

java 灰度直方图_【数字图像处理】灰度直方图 直方图均衡化 直方图规定化...

灰度直方图

一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。

图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。

灰度直方图的计算公式如下:

p(rk)=nk/MN

其中,rk是像素的灰度级,nk是具有灰度rk的像素的个数,MN是图像中总的像素个数。

直方图均衡化 Histogram Equalization

假如图像的灰度分布不均匀,其灰度分布集中在较窄的范围内,使图像的细节不够清晰,对比度较低。通常采用直方图均衡化及直方图规定化两种变换,使图像的灰度范围拉开或使灰度均匀分布,从而增大反差,使图像细节清晰,以达到增强的目的。

直方图均衡化,对图像进行非线性拉伸,重新分配图像的灰度值,使一定范围内图像的灰度值大致相等。这样,原来直方图中间的峰值部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较为平坦的直方图。

均衡化算法

直方图的均衡化实际也是一种灰度的变换过程,将当前的灰度分布通过一个变换函数,变换为范围更宽、灰度分布更均匀的图像。也就是将原图像的直方图修改为在整个灰度区间内大致均匀分布,因此扩大了图像的动态范围,增强图像的对比度。通常均衡化选择的变换函数是灰度的累积概率,直方图均衡化算法的步骤:

计算原图像的灰度直方图P(Sk)=nknP(Sk)=nkn,其中nn为像素总数,nknk为灰度级SkSk的像素个数

计算原始图像的累积直方图CDF(Sk)=∑i=0knin=∑i=0kPs(Si)CDF(Sk)=∑i=0knin=∑i=0kPs(Si)

Dj=L⋅CDF(Si)Dj=L⋅CDF(Si),其中DjDj是目的图像的像素,CDF(Si)CDF(Si)是源图像灰度为i的累积分布,L是图像中最大灰度级(灰度图为255)

灰度直方图均衡化实现的步骤

1.统计灰度级中每个像素在整幅图像中的个数

2.计算每个灰度级占图像中的概率分布

3.计算累计分布概率

4.计算均衡化之后的灰度值

5.映射回原来像素的坐标的像素值

示例说明

来看看通过上述步骤怎样实现的拉伸。假设有如下图像:

得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:

映射后的图像如下所示:

灰度直方图均衡化实现

//img_size为图像大小//Image_Use为图像数组

//Use_ROWS为行,Use_Line为列

float img_size = Use_ROWS * Use_Line * 1.0;int count_data[256],huidu_data[256]; //计数统计、均衡化的灰度值

float midu_data[256],leijimidu_data[256]; //概率密度、累计概率密度//数组初始化

memset(count_data, 0, sizeof(count_data));

memset(midu_data,0.0, sizeof(midu_data));

memset(leijimidu_data,0.0, sizeof(leijimidu_data));

memset(huidu_data,0.0, sizeof(huidu_data));//1.统计灰度级中每个像素在整幅图像中的个数

for(int i = 0; i < Use_ROWS; i++)

{for(int j = 0; j < Use_Line; j++)

{

count_data[Image_Use[i][j]]++;

}

}//2.计算每个灰度级占图像中的概率分布

for(int i = 0; i < 256; i++)

{

midu_data[i]= count_data[i]/img_size;

}//3.计算累计分布概率

leijimidu_data[0] = midu_data[0];for(int i = 1; i < 256; i++)

{

leijimidu_data[i]= midu_data[i]+leijimidu_data[i-1];

}//4.计算均衡化之后的灰度值

for(int i =0; i <256; i++)

{

huidu_data[i]= (int)(255 *leijimidu_data[i]);

}//5.映射回原来像素的坐标的像素值

for(int i = 0; i < Use_ROWS; i++)

{for(int j = 0; j < Use_Line; j++)

{

Image_Use[i][j]=huidu_data[Image_Use[i][j]];

}

}

原始图像:

直方图均衡化后的图像:

直方图规定化

参考:

如果觉得《java 灰度直方图_【数字图像处理】灰度直方图 直方图均衡化 直方图规定化...》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。