直方图均衡化原理

如题
2025-04-03 03:49:49
推荐回答(2个)
回答1:

C实现的,matlab里面就更简单了

//LPSTR lpDIBBits - 指向源DIB图像指针
//LONG lWidth - 源图像宽度(象素数)
//LONG lHeight - 源图像高度(象素数)

BOOL WINAPI InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
// 指向源图像的指针
unsigned char* lpSrc;
// 临时变量
LONG lTemp;
// 循环变量
LONG i;
LONG j;
// 灰度映射表
BYTE bMap[256];
// 灰度映射表
LONG lCount[256];
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth * 8);
// 重置计数为0
for (i = 0; i < 256; i ++)
{
// 清零
lCount[i] = 0;
}
// 计算各个灰度值的计数
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lWidth; j ++)
{
lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;

// 计数加1
lCount[*(lpSrc)]++;
}
}

// 计算灰度映射表
for (i = 0; i < 256; i++)
{
// 初始为0
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;
}

回答2:

直方图是统计像数统计图,如设一张灰度图或一个通道,值0~255
直方图如果按。255个区分的话。统计出来的就是,值为。0的有几个像数,值为1的有机个像数,这样的一张表。
那么均衡化的意思就是。这样表要均衡。不直不于。0有上万个像数,1只有1 个。
正常,直方图本身可以用小于255个区。比如10个,那么这样相对图中的点就有一个映射,这时值0-9统计落在第一个区,值为10-19落第二个区。。。
这样的结果就会出来,10个区,10个统计数区。这时。你均衡就是让10区的统计数据都不会差很多。表现出来的就是一张图上的颜色分布相对均衡
怎么让,10个区统计数平衡。
这里牵涉到。机率密度PDF,累积分配CDF,LUT对应当等。
更具体的。我之前是在百度文库中有看到你找下