首页 > 其他 > 详细

Qt 彩色图像转换为灰度图

时间:2020-09-01 14:14:54      阅读:50      评论:0      收藏:0      [点我收藏+]

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

QImage 有一个convertToFormat方法。最開始一直用这个函数来实现。

可是今天细致看了看,发现这个函数转换出的灰度图与原始图像的亮度似乎是有差别的。比方说以下这副图像:

技术分享图片

用以下这三行代码转换:

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

得到的结果是这种:

技术分享图片

 

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

 

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

 1 QImage toGray( QImage image )
 2 {
 3     int height = image.height();
 4     int width = image.width();
 5     QImage ret(width, height, QImage::Format_Indexed8);
 6     ret.setColorCount(256);
 7     for(int i = 0; i < 256; i++)
 8     {
 9         ret.setColor(i, qRgb(i, i, i));
10     }
11     switch(image.format())
12     {
13     case QImage::Format_Indexed8:
14         for(int i = 0; i < height; i ++)
15         {
16             const uchar *pSrc = (uchar *)image.constScanLine(i);
17             uchar *pDest = (uchar *)ret.scanLine(i);
18             memcpy(pDest, pSrc, width);
19         }
20         break;
21     case QImage::Format_RGB32:
22     case QImage::Format_ARGB32:
23     case QImage::Format_ARGB32_Premultiplied:
24         for(int i = 0; i < height; i ++)
25         {
26             const QRgb *pSrc = (QRgb *)image.constScanLine(i);
27             uchar *pDest = (uchar *)ret.scanLine(i);
28 
29             for( int j = 0; j < width; j ++)
30             {
31                  pDest[j] = qGray(pSrc[j]);
32             }
33         }
34         break;
35     }
36     return ret;
37 }

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

技术分享图片

 

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

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

 

 

Qt 彩色图像转换为灰度图

原文:https://www.cnblogs.com/ybqjymy/p/13595616.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!