码迷,mamicode.com
首页 > 其他好文 > 详细

Qt 中彩色图像转换为灰度图

时间:2015-06-27 11:35:16      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:

最近在做几个图像处理相关的项目。里面有一个操作就是需要先将彩色图像转换为灰度图像。QImage 有一个convertToFormat方法。最开始一直用这个函数来实现。但是今天仔细看了看,发现这个函数转换出的灰度图与原始图像的亮度似乎是有区别的。比如说下面这副图像:

技术分享


用下面这三行代码转换:

QImage image2 = image.convertToFormat(QImage::Format_Indexed8);
    image2.setColorCount(256);
    for(int i = 0; i < 256; i++)
    {
        image2.setColor(i, qRgb(i, i, i));
}

得到的结果是这样的:

技术分享

明显转换之后的图像要暗一些,对比度也差很多。说明这个方法是错误的。其实想想也能知道,convertToFormat 只是选取了原始图像中出现最多的那些颜色,并以此生成了colorTable。这个colorTable 的顺序与亮度其实不一定具有线性关系,我这样随意的转换从原理上就是说不通的。

 

后来花了点时间,自己写了个转换代码:

QImage toGray( QImage image )
{
    int height = image.height();
    int width = image.width();
    QImage ret(width, height, QImage::Format_Indexed8);
    ret.setColorCount(256);
    for(int i = 0; i < 256; i++)
    {
        ret.setColor(i, qRgb(i, i, i));
    }
    switch(image.format())
    {
    case QImage::Format_Indexed8:
        for(int i = 0; i < height; i ++)
        {
            const uchar *pSrc = (uchar *)image.constScanLine(i);
            uchar *pDest = (uchar *)ret.scanLine(i);
            memcpy(pDest, pSrc, width);
        }
        break;
    case QImage::Format_RGB32:
    case QImage::Format_ARGB32:
    case QImage::Format_ARGB32_Premultiplied:
        for(int i = 0; i < height; i ++)
        {
            const QRgb *pSrc = (QRgb *)image.constScanLine(i);
            uchar *pDest = (uchar *)ret.scanLine(i);

            for( int j = 0; j < width; j ++)
            {
                 pDest[j] = qGray(pSrc[j]);
            }
        }
        break;
    }
    return ret;
}

利用这个代码的转换结果如下:

技术分享

这个的转换效果明显要好很多。看来写代码还是要精益求精,不能凑合着来啊。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Qt 中彩色图像转换为灰度图

标签:

原文地址:http://blog.csdn.net/liyuanbhu/article/details/46659725

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!