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


    近期在做几个图像处理相关的项目。里面有一个操作就是须要先将彩色图像转换为灰度图像。

    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;
    }

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

    这个的转换效果明显要好非常多。

    看来写代码还是要精益求精。不能凑合着来啊。


  • 相关阅读:
    CTK 编译
    MITK 2021.2编译
    执行git add .报错LF will be replaced by CRLF in
    vscode标记“&&”不是此版本中的有效语句分隔符
    vscode prettier插件使用无效
    vscode使用技巧
    kafka及hdfs常用命令
    博客已迁移
    SVM
    逻辑回归
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/6738879.html
Copyright © 2020-2023  润新知