1.基本原理
灰度均衡是以累计分布函数变换为基础的直方图修正法,它可以产生一副灰度级分布概率均匀的图像。也就是说,经过灰度均衡后的图像在没一级灰度上像素点的数量相差不大。公式见下图,为灰度值为x的像素点的个数,n为总像素点
2.代码实现(代码是我以前自学图像处理时写的,代码很粗糙没做任何优化,但很好理解)
此代码中“origiin”一般为灰度图片,彩色图片转灰度图片,可参考我的一篇博客:彩色图转灰度图之c++实现(qt + 不调包)
/*灰度均衡函数*/
QImage* MainWindow::GrayEqualize(QImage* origiin)
{
QImage* newImage = new QImage(origiin->width(), origiin->height(), QImage::Format_ARGB32);
int r, g, b;
unsigned char* graydata = origiin->bits();
long lTemp;
std::vector<int> hist(256);
std::vector<int> map(256);
for (int i=0;i!=origiin->width();i++)
{
for (int j=0;j!=origiin->height();j++)
{
int index = int(*graydata);
hist[index] = hist[index]+1;
graydata+=4;
}
}
graydata = NULL;
for (int i = 0; i < 256; i++)
{
lTemp = 0;
for (int j = 0; j <= i; j++)
lTemp += hist[j];
map[i] = (int) (lTemp * 255.0f / origiin->width() / origiin->height());
}
unsigned char* graydata1 = origiin->bits();
for(int y = 0; y < newImage->height(); y++)
{
for(int x = 0; x < newImage->width(); x++)
{
int index = int(*graydata1);
r = g = b = map[index];
graydata1+=4;
newImage->setPixel(x, y, qRgb(r, g, b));
}
}
graydata = NULL;
return newImage;
}
3.参考资料:
数字图像处理——技术详解与Visual C++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去