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

这2天在做一个关于图像处理的项目的时候,需要折腾将任何图片转换成256色的图片,本来这个在windows画笔下都可以很简单的过程,在Qt中自己却研究了几天,而且此类文章很少,反而比较多的是转换成8位灰度图的研究,因此在转换完256色后,又稍微研究了下转换灰度的方法,本来qt中有很简单的方法可以实现,但是看到一篇博文,有更好的方法可以实现更好的图片,因此在这里做个记录


转载:http://blog.csdn.net/liyuanbhu/article/details/46659725


最近在做几个图像处理相关的项目.里面有一个操作就是需要先将彩色图像转换为灰度图像.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;  
}  

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



这个明显就比之前的好很多了


  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值