您的位置:首页 > 其它

图像增强-直方图均衡化

2016-10-25 11:09 302 查看
1.图像直方图统计
         直方图是图像的一种统计表示形式,对于一幅灰度图来说,其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言,图像的视觉效果和其直方图有对应关系,通过调整或变换其直方图的形状会对图像显示效果有很大影响。

      

        灰度级范围为[0,L-1]的数字图像的直方图是离散函数:

其中

第k级灰度值,

是图像中灰度为的像素个数

归一化直方图,用图像像素总数MN除以它的每一个分量。公式如下:

是灰度级在图像中出现的概率估计

以下是我用matlab显示图像的直方图。







matlab代码
srcImage= imread('D:\gamma\2.jpg');

grayImage= rgb2gray(srcImage);

figure;

subplot(1,3,1);
imshow(grayImage);title('grayImage');

subplot(1,3,2);
imhist(grayImage);title('hist');

[M,N]= size(grayImage);
[counts,x]= imhist(grayImage);
counts= counts/M/N;

subplot(1,3,3);
stem(x,counts);
通过直方图的分析,可以发现:
(1)在暗的图像中,直方图的分量集中在灰度级的低端,而亮图像直方图则集中在灰度级的高端。
(2)如果一幅图的像素倾向于占据整个可能的灰度级且分布均匀,则该图像会有较高对比度,细节丰富且动态范围较大。

2. 直方图均衡原理

直方图变换公式:
, r = 0,1,...,L-1

r表示原图像的灰度,其取值区间为[0,L-1],且
0表示黑色,L-1表示白色。对于输入图像中每一个具有r值的像素值产生一个输出的灰度值s。并且假设,
(1)T(r)在区间[0,L-1]上为单调递增函数
(2)当r取值[0,L-1]时,T(r)的取值范围也在[0,L-1]

通过推导公式(此处略去,一是麻烦,一是网上很容易找到这部分),得出以下结论公式

其中,MN是图像中像素的总数,nk是灰度rk为的像素个数,L是图像中可能的灰度级的数量。

以下是C++实现图像直方图均衡化:

BOOLInteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
unsignedchar* lpSrc; //
指向源图像的指针

LONGlTemp;
// 临时变量
LONG i;
// 循环变量
LONG j;

LONG lCount[256];
// 灰度映射表
BYTE bMap[256];
// 灰度映射表
LONG lLineBytes;
// 图像每行的字节数

lLineBytes =WIDTHBYTES(lWidth * 8);//
计算图像每行的字节数

for (i = 0; i <256; i ++)
// 重置计数为0
{
lCount[i] = 0;
}

// 计算各个灰度值的计数
for (i = 0; i <lHeight; i ++)
{
for (j = 0; j< lWidth; j ++)
{
lpSrc =(unsigned char *)lpDIBBits + lLineBytes * i + j;
lCount[*(lpSrc)]++;
}
}

// 计算灰度映射表
for (i = 0; i <256; i++)
{
lTemp = 0;
for (j = 0; j <=i ; j++)
{
lTemp +=lCount[j];
}

// 计算对应的新灰度值
bMap[i] = (BYTE)(lTemp * 255 / lHeight / lWidth);
}

for(i = 0; i <lHeight; i++)
// 每行
{
for(j = 0; j <lWidth; j++)
// 每列
{
//指向DIB第i行,第j个象素的指针
lpSrc =(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;

// 计算新的灰度值
*lpSrc =bMap[*lpSrc];
}
}

return TRUE;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: