图像增强-直方图均衡化

来源:互联网 发布:申请美国博士知乎 编辑:程序博客网 时间:2024/05/18 09:19

1.图像直方图统计

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

      

        灰度级范围为[0L-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表示原图像的灰度,其取值区间为[0L-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++)

// 每列

{

//指向DIBi行,第j个象素的指针

lpSrc =(unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;

// 计算新的灰度值

*lpSrc =bMap[*lpSrc];

}

}

return TRUE;

}










 

1 0
原创粉丝点击