送交者: catfish 于 2005-6-30, 11:44:53:
回答: 请教一个关于图形处理的小问题 由 lll 于 2005-6-29, 21:38:40:
灰度直方图的数值就是像素点数,然后计算面积。
首先对原始图像的各像素点的灰度情况进行统计计算。对于24位BMP图像,图像阵列是从第54字节开始的,每像素按R、G、B的顺序占3个字节。
for (DWORD i=54; i
ns_r[m_cpBuffer[i]]++; //ns_r[k]为k灰度级像素数,m_cpBuffer[i]为当前的灰度值
i++;
ns_g[m_cpBuffer[i]]++;
//ns_g为G分量的统计计数
i++;
ns_b[m_cpBuffer[i]]++;
//ns_b为B分量的统计计数
}
for (i=0; i<256; i++)
//计算R、G、B三分量的直方图分布
{
ps_r[i]=ns_r[i]/((m_dwFileLen-54)/3.0f);
//ps_r[i]为R分量中i灰度级出现的概率
ps_g[i]=ns_g[i]/((m_dwFileLen-54)/3.0f);
//ps_b[i]为G分量中i灰度级出现的概率
ps_b[i]=ns_b[i]/((m_dwFileLen-54)/3.0f);
//ps_b[i]为B分量中i灰度级出现的概率
}
然后计算R、G、B三分量各灰度级的累计直方图分布,并对其进行取整以得出源和目标图像灰度之间的映射关系:
for (i=0; i<256; i++)
{
//计算累计直方图分布
temp_r[i]=temp_r[i-1]+ps_r[i];
temp_g[i]=temp_g[i-1]+ps_g[i];
temp_b[i]=temp_b[i-1]+ps_b[i];
//累计分布取整,ns_r[]、ns_g[]、ns_b[]保存有计算出来的灰度映射关系
ns_r[i]=(int)(255.0f*temp_r[i]+0.5f);
ns_g[i]=(int)(255.0f*temp_g[i]+0.5f);
ns_b[i]=(int)(255.0f*temp_b[i]+0.5f);
}