实现图像直方图均衡
直方图均衡是空间域增强方法中的灰度处理的一种,主要是通过灰度级均衡来实现的。
根据公式Dm:代表灰度级 ;A0:代表图像像素总数;
表示0~Da的灰度级之和。
所以可以将代码分为三个部分:
1、计算直方图灰度级
2、根据公式计算新的灰度级
3、用新的灰度级代替原先的灰度级
void CMFCApplication1View::hisEqualiz(BYTE* image, int w, int h, BYTE* outImg)
{
//直方图均衡
//1、计算直方图
int his[256] = {0};
int n,i,j;
for (n = 0; n < 256; n++)
his[n] = 0;
for (i = 0; i < h; i++)
for (j = 0; j < w; j++)
his[image[i * w + j]]++;
for (n = 1; n < 256; n++)
his[n] += his[n - 1];
//2、计算新的灰度级
BYTE gray[256] = {0};
float cons;
cons = 255. / his[255];
for (n = 0; n < 256; n++)
gray[n] = (BYTE)(cons * his[n]);
//3、用新的灰度级替代旧的灰度级
for (i = 0; i < h; i++)
for (j = 0; j < w; j++)
outImg[i * w + j] = gray[image[i * w + j]];
}
w,h:表示图像的长和宽,outImg:存储输出图像信息
image:用于存储图像信息;如果没有,需要先获取一下图像的信息。
typedef unsigned char BYTE
FILE* fpImg = fopen(xxx,"rb");
BYTE * rowBuff;
int rowLen;
int bicount;
BYTE * image;
fread(&bmiHeader, sizeof(BITMAPINFOHEADER), 1, fpImg);
bicount = bmiHeader.biBitCount;
rowLen = ((width * bicount) / 8 + 3) / 4 * 4;
rowBuff = new BYTE[rowLen];
image = new BYTE[width * height];
for (int i = height - 1; i >= 0; i--)
{
fread(rowBuff, 1, rowLen, fpImg);
memcpy(image + i * width, rowBuff, width);
}
结果: