直方图规定化
/**************************************************
BOOL CImgProcess::GenHist(double * pdHist, int n)
功能:
生成图像的灰度直方图
参数:
double * pdHist
输出的灰度直方图数组
BYTE n
灰度直方图的灰度级数(段数)
返回值:
BOOL类型,true为成功,false为失败
***************************************************/
BOOL CImgProcess::GenHist(double * pdHist, int n)
{
// 首先检查图像的类型
if (m_pBMIH->biBitCount!=8) return false;
// 检查n范围
if ((n256)) return false;
// 计算分段因子
double dDivider;
memset(pdHist, 0, n * sizeof(double));
dDivider = 256.0 / (double)n;
BYTE bGray; // 临时变量,存储当前光标像素的灰度值
for (int i=0; ibiHeight; i++)
{
for (int j=0; jbiWidth; j++)
{
bGray = GetGray(j, i);
pdHist[(int)(bGray / dDivider)]++; // 指定的灰度区间自加
}
};
UINT square = m_pBMIH->biWidth * m_pBMIH->biHeight;
for (int k=0; k
{
pdHist[k]=pdHist[k]/square;
}
return true;
}
/**************************************************
BOOL CImgProcess::Histeq(CImgProcess * pTo)
功能:
图像的灰度直方图均衡化方法
参数:
CImgProcess * pTo
输出CImgProcess对象的指针
返回值:
BOOL类型,true为成功,false为失败
***************************************************/
BOOL CImgProcess::Histeq(CImgProcess * pTo)
{
// 首先检查图像是否是8位灰度图像
if (m_pBMIH->biBitCount!=8) return false;
BYTE gray; // 临时变量,存储当前光标像素的灰度值
int target; // 临时变量,存储当前光标像素的目标值
double pdHist[256]; //临时变量,存储灰度直方图
double dTemp; // 临时变量,存储累加的直方图数据
this->GenHist(pdHist);
for (int i=0; ibiHeight; i++)
{
for (int j=0; jbiWidth; j++)
{
dTemp = 0;
gray = GetGray(j, i);
for (BYTE k=0; k
{
dTemp+=*(pdHist + k);
};
target = 255 * dTemp;
if (target
if (target > 255) target = 255;
// 写入目标图像
pTo->SetPixel(j, i, RGB(target, target, target));
}
};
return true;
}
/**************************************************
BOOL CImgProcess::Histst(CImgProcess* pTo, double* pdStdHist)
功能:
图像的灰度直方图规定化方法
参数:
CImgProcess * pTo
输出CImgProcess对象的指针
double * pdStdHist
标准直方图数组(要求已经归一化的直方图)
返回值:
BOOL类型,true为成功,false为失败
***************************************************/
BOOL CImgProcess::Histst(CImgProcess* pTo, double* pdStdHist)
{
int i,j;
// 首先检查图像是否是8位灰度图像
if (m_pBMIH->biBitCount!=8) return false;
BYTE gray; // 临时变量,存储当前光标像素的灰度
值
int target; // 临时变量,存储当前光标像素的目标值
double pdHist[256]; // 临时变量,存储灰度直方图
this->GenHist(pdHist);
double dTemp; // 临时变量,存储累加的直方图数据
int pdTran[256]; // 临时变量,存储标准直方图均衡化的变换矩阵
memset(pdTran, -1, sizeof(int)*256);
// 求标准直方图的均衡化变换矩阵
for (i=0; i
{
dTemp = 0;
for (BYTE k=0; k
{
dTemp+=*(pdStdHist + k);
}
*(pdTran + (int)(0.5+255 * dTemp)) = i;
}
// 去除均衡化变换矩阵中的间断点——插值
{
i=0, j=0;
while(i
{
if(*(pdTran + i + 1)!=-1)
{
i++;
continue;
}
j = 1;
while((*(pdTran + i + j)==-1)&&((i + j)
{
*(pdTran + i + j)=*(pdTran + i);
j++;
}
}
}
// 对原图像首先进行灰度均衡化后再进行规定化
for (i=0; ibiHeight; i++)
{
for (j=0; jbiWidth; j++)
{
dTemp = 0;
gray = GetGray(j, i);
for (BYTE k=0; k
{
dTemp+=*(pdHist + k);
};
target = *(pdTran + (int)(255 * dTemp));
if (target
if (target > 255) target = 255;
// 写入目标图像
pTo->SetPixel(j, i, RGB(target, target, target));
}
};
return true;
}