做了一天,都是黑屏,最后发现,竟然是一个局部变量引起。
基本是分3步,这个是在灰度图像下 实现均衡化直方图。 彩色下直接均衡化研究出来再补上。
第一步:
计算初始直方图,即记录每一个像素出现次数。
for(int y = 0; y < m_image->GetHeight(); y++) { for(int x = 0; x < m_image->GetWidth();x++) { COLORREF rgb = m_image->GetPixel(x,y);
int rValue = GetRValue(rgb); // 记录每一个像素出现次数。 hist[rValue]++; } }
第二步:
由上面得到的初始直方图计算归一化直方图和累积直方图
int hist[256] = {0}; double phist[256]; for (int i = 0; i <= 255 ;i++) { phist [i] = (double) hist[i] / (m_image->GetHeight() * m_image->GetWidth()); //归一化直方图 即每个像素出现概率 } double dSum[256] = {0.0}; for(int i = 0; i<=255;i++) { if(i != 0) { dSum[i] = dSum[i-1] + phist[i]; } else//累积直方图 { dSum[i] = phist[i]; } }
第三步:
求均衡化映射(旧图->新图)关系,并写入新图像
for(int y = 0; y < m_image->GetHeight(); y++) { for(int x = 0; x < m_image->GetWidth();x++) { COLORREF rgb = m_image->GetPixel(x,y); int rValue = GetRValue(rgb); rValue = Mapping[rValue]; //根据映射关系实现均衡化 rgb = RGB(rValue,rValue,rValue); m_image->SetPixel(x,y,rgb); } }