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

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

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

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

时间: 2024-12-14 14:58:19

Qt 中彩色图像转换为灰度图的相关文章

从视频文件中读入数据--&gt;将数据转换为灰度图--&gt;对图像做candy边缘检测

//从视频文件中读入数据-->将数据转换为灰度图-->对图像做candy边缘检测 //作者:sandy //时间:2015-10-10 #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]){ //预备工作 CvCapture* capture=cvCreateFileCapture("E:\\Videos\\xx.avi");//让capture变量指向视频文件 i

机器学习进阶-图像基本处理-视频的读取与处理 1.cv2.VideoCapture(视频的载入) 2.vc.isOpened(载入的视频是否可以打开) 3.vc.read(视频中一张图片的读取) 4.cv2.cvtColor(将图片转换为灰度图)

1.vc = cv2.VideoCapture('test.mp4') #进行视频的载入 2.vc.isOpened() # 判断载入的视频是否可以打开 3.ret, frame = vc.read()  #进行单张图片的读取,ret的值为True或者Flase, frame表示读入的图片 4.cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  #表示将图片转换为灰度图 代码: import cv2 vc = cv2.VideoCapture('test.mp4')

(4)彩色图像转灰度图以及色调,饱和度等概念相关定义

以下关于定义的内容来自冈萨雷斯——<数字图像处理> RGB彩色模型:图像由三个分量图像组成,每种原色一副分量图像.当送入RGB监视器时,这三幅图像在屏幕上混合生成一副合成的彩色图像. HSI彩色模型:RGB模型的彩色系统对于硬件实现很理想,且与人眼强烈感知红.绿.蓝三原色的事实能很好的匹配.遗憾的是RGB模型和其它类似的彩色模型不能很好的适应实际上人解释的颜色(1).人观察一个彩色物体时,我们用其色调.饱和度和亮度来描述它,这就是HSI彩色模型. (1)原因与人眼中感光细胞对各种原色光的敏感度

c语言实现BMP图像转换为灰度图

当初是自己要装X,非要用c来写信息隐藏作业,装了X,就得付出实践.查了好久资料,到期末才把作业交了,这里总结一下. 这道题是将真彩图转换为灰度图. 关于BMP文件结构,这是困扰了我好久的问题,上网查了很久图片的知识才弄明白 BMP文件包括以下几部分(具体结构在程序中说明): 位图文件头 位图信息头 调色板 位图数据 结构体内存对齐原则 每个成员存储的起始位置要从该成员大小的整数倍开始 成员是结构体时相对与起始偏移是其内部最大元素大小的整数倍 结构体的总大小是其内部最大成员的整数倍 因此在定义头结

mupdf实现常用图片转换为灰度图pnm

我要实现的工作是使用mupdf库转换pdf.jpeg.tif等文件为灰度图,转换完成的灰度图存放到内存中,而不是存为文件,在读取到内存中,主要是嵌入式系统中使用.下面是example.c,我加了我理解的注释,以及自己修改的地方.example.c全文 #include <mupdf/fitz.h> void render(char *filename, int pagenumber, int zoom, int rotation) { // Create a context to hold t

如何使用 python3 将RGB 图片转换为 灰度图

首先,介绍第一种方法, 使用  PIL  库,   PIL库是一种python语言常用的一个图形处理库. 关于   PIL  库的安装本文就不介绍了. from PIL import Image I = Image.open('C:\\Users\\Administrator\\Desktop\\照片\\timg.jpg') I.show() L = I.convert('L') L.show()L.save('C:\\Users\\Administrator\\Desktop\\照片\\tim

C# (灰度)加权平均法将图片转换为灰度图

private Bitmap ToG(string file) { using (Bitmap o = new Bitmap(file)) { Bitmap g = new Bitmap(o.Width, o.Height); for (int i = 0; i < o.Width; i++) { for (int j = 0; j < o.Height; j++) { Color c = o.GetPixel(i, j); //灰度加权平均法公式 int rgb = (int)(c.R *

彩色图到灰度图究竟是怎么变换的

??之前对彩色图与灰度图仅仅停留在前者是3通道后者是单通道的理解上.我也知道计算机看图片是将它们当成数组,但是一直搞不清楚将一张彩色图转变为灰度图是怎么操作的.当然,很多库函数都提供借口,包括OpenCV.PIL等.这里我参考https://blog.csdn.net/saltriver/article/details/79677116 手动实现将一张彩色图转换为灰色图.当然还是以帅气的哈士奇.jpg作为我的练习对象,看到它敲代码都有动力. from PIL import Image impor

彩色图像--伪彩处理 灰度图转伪彩色图像

学习DIP第68天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:https://github.com/Tony-Tan/DIPpro 开篇废话 观察了一下冈萨雷斯的书,发现彩色图像处理只用了一章进行介绍,原因分析了一下,后来发现,好像别的介绍的也不多,得出一个结论,冈萨雷斯这本书只能作为一部纲领性的介绍,它基本涵盖了图像处理的基础知识,但是如果想使用某种方向作为工作的话,需要继续找