灰度均衡变换之c++实现(qt + 不调包)

1.基本原理

    灰度均衡是以累计分布函数变换为基础的直方图修正法,它可以产生一副灰度级分布概率均匀的图像。也就是说,经过灰度均衡后的图像在没一级灰度上像素点的数量相差不大。公式见下图,n_{x}为灰度值为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 hist(256);
    std::vector 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++实践(左飞等著),写代码与写博客的时间相差两年,至于还参考其他的资料不,我已经忘记了,如若需要,我可以补上去

你可能感兴趣的:(基于qt图像算法处理,c++,qt,开发语言)