您的位置:首页 > 其它

直方图均衡化实现

2016-08-10 20:11 176 查看
代码如下:

//直方图均衡化
void histogram_equalization(unsigned char* img, int h, int w)
{
int i, j;
int pixNum[256] = { 0 };
float pixP[256] = { 0 };
float pixNormalize[256] = { 0 };
int maxpix = img[0];
int minpix = img[0];
unsigned char* tempimg = (unsigned char*)malloc(h*w);
memcpy(tempimg, img, h*w);

for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
//统计直方图每个灰度级出现的次数
pixNum[tempimg[i*w + j]]++;

//找出像素的最大值和最小值
if (maxpix < tempimg[i*w + j])
maxpix = tempimg[i*w + j];
else if (minpix > tempimg[i*w + j])
minpix = tempimg[i*w + j];

}
}
//p[i]表示的就是灰度级为i的像素在整幅图像中出现的概率
for (i = 0; i < 256; i++)
{
pixP[i] = (float)(pixNum[i]) / (float)(h*w);
}
//累计的归一化直方图
for (i = 0; i < 256; i++)
{
for (j = 0; j <= i; j++)
{
pixNormalize[i] += pixP[j];
}
}

for (i = 0; i < h; i++)
{
for (j = 0; j < w; j++)
{
tempimg[i*w + j] = pixNormalize[img[i*w + j]] * (maxpix - minpix) + minpix;
}
}
memcpy(img, tempimg, h*w);
free(tempimg);
}

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