灰度图的直方图变换
对于一个灰度图像,m_pBMIH,宽度为biWidth,高度为biHeight,那么它的像素点总数为宽度*高度
传入的参数n为灰度直方图的灰度级数,phDist为输出的直方图数组
下面的代码主要分成以下几个部分:
1,判断传入的参数的合法性
2,根据传入的灰度级数n得到每一个级数所含有的灰度点dDivider
3,对所有的像素点,将对应的灰度级的个数增1 0(m*n)级别
4,将形成的phDist进行归一化处理,有点求平均的感觉 0(k)级别
这样得到的phDist是一个数组,数组的下标为灰度直方图的灰度级,数组的对应下标的值为相应的像素点的个数的归一概率值。
代码抄写字数字图像与机器视觉的那本书,理解才好
BOOL CImgProcess::GenHistLP(double* phHist, int n)
{
if(m_pBMIH->biBitCount != 8) return false;
if(n<=0 || n > 256) return FALSE;
//直方图的每一分需要占用几个灰度级
double dDivider;
memset(phHist, 0, sizeof(double));
dDivider = 256.0 / (double)n;
BYTE bGray;
for (int i =0; i < m_pBMIH->biHeight; ++i)
{
for(int j =0; j < m_pBMIH->biWidth; ++j)
{
bGray = GetGray(j, i);//获取指定像素点的灰度级
phHist[(int)(bGray/dDivider)]++;
}
}
double squre = m_pBMIH->biWidth * m_pBMIH->biHeight;
for(int i = 0; i < n; ++i)
{
phHist[i] /= squre;
}
return true;
}