• 13874阅读
  • 13回复

求助关于Qt如何显示灰度图的问题 [复制链接]

上一主题 下一主题
离线libo1017
 
只看楼主 正序阅读 楼主  发表于: 2010-04-02
各位大侠,小弟需要将一般格式的图片(*.png,*jpg,*gif,*bmp)转换为8阶的灰度图,然后用Qt显示出来,请问我该怎么做,希望各位大侠帮助,小弟不胜感激~
离线yangfanxing
只看该作者 13楼 发表于: 2010-04-06
引用第12楼libo1017于2010-04-06 17:46发表的  :
首先感谢您们的回复,用qGray或者(299*R+587*G+114*B)/1000都能够实现,对了还想请教一下关于4阶灰度、8阶灰度和16阶灰度这些应该怎样设置,谢谢!


还是颜色表对应的事儿~不过8阶就是上边讨论那样的;4阶要分段设置颜色表,比如gray值是[0~15]的设为0,等等;
16阶也一样,不过显示的话要将quint16向8阶map(线性的方法等)!毕竟显示器不能显示0~255意外的灰度。
PHPWind好恶心。。。不想看这种界面。。。
离线libo1017
只看该作者 12楼 发表于: 2010-04-06
首先感谢您们的回复,用qGray或者(299*R+587*G+114*B)/1000都能够实现,对了还想请教一下关于4阶灰度、8阶灰度和16阶灰度这些应该怎样设置,谢谢!
离线elainejin
只看该作者 11楼 发表于: 2010-04-06
引用第9楼libo1017于2010-04-06 15:38发表的  :
通过QRgb px = image.pixel(x,y); 获取像素颜色,
然后通过image.setPixel(x,y,qRgb(( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000,
      ( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000,
              ( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000));将其转换为灰度值,这样是否能够实现,谢谢~~


我正好也在弄这个,你可以用Qgray这个灰度处理~~
QRgb pixel=image.pixel(i,j);
              int r=qRed(pixel);
              int g=qGreen(pixel);
              int b=qBlue(pixel);
           grayImg.setPixel(i,j,qGray(r,g,b));
离线yangfanxing
只看该作者 10楼 发表于: 2010-04-06
没调试啊?意思是对的,但是你能先分别算那三个分量再setPixel吗???
多乱呀~速度也下来了~
另外
  1. /1000

的话不知道精确度漫步满足你的需要!
e.g.:
999/1000 = 0;
用double计算再转回来也许好些~
PHPWind好恶心。。。不想看这种界面。。。
离线libo1017
只看该作者 9楼 发表于: 2010-04-06
通过QRgb px = image.pixel(x,y); 获取像素颜色,
然后通过image.setPixel(x,y,qRgb(( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000,
      ( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000,
              ( 299*qRed(px) +587*qGreen(px)+ 114*qBlue(px))/1000));将其转换为灰度值,这样是否能够实现,谢谢~~
离线yangfanxing
只看该作者 8楼 发表于: 2010-04-06
QColor::red();
QColor::green();
QColor::blue();
灰度根据这三个分量处理得到(如0.5R+.3G+.2B)
PHPWind好恶心。。。不想看这种界面。。。
离线xinqingfly

只看该作者 7楼 发表于: 2010-04-06
如何得到一个QColor对应的灰度颜色呢
菜鸟也是鸟
离线elainejin
只看该作者 6楼 发表于: 2010-04-06
引用楼主libo1017于2010-04-02 10:59发表的 求助关于Qt如何显示灰度图的问题 :
各位大侠,小弟需要将一般格式的图片(*.png,*jpg,*gif,*bmp)转换为8阶的灰度图,然后用Qt显示出来,请问我该怎么做,希望各位大侠帮助,小弟不胜感激~


有没有解决这个问题啊 ???
离线yangfanxing
只看该作者 5楼 发表于: 2010-04-02
  1. QImage grayImg(colourImgSize, QImage::Format_Indexed8);

问题可能出在这儿,你的RGB图像没有经过任何的矩阵转化就用Format_Indexed8
这样的结果可能是
1、读到第一个像点【A1R1G1B1】(请先体会RGB图像的存储格式)
2、把A1当做灰度图I的第一个像素;把R1当做第二个像素;把G1当做第三个像素;把B1当做第四个像素;同样把读到的第二个像点【A2R2G2B2】中的A2当做第五个像素。。。
A1 R1 G1 B1 A2 R2 G2 B2。。。这样图像能对吗???
3、查下怎么从RGB图像中一个像素映射为GRAY图像的一个像素。。。


    for(int i = 0; i < height; i++)
    {
     for(int j = 0; j < width; j++)
     {
      *grayImgDataPtr = *(colourImgDataPtr + 1);
      colourImgDataPtr += 4;
      grayImgDataPtr++;
     }
    }

还有这个干哈?
PHPWind好恶心。。。不想看这种界面。。。
离线libo1017
只看该作者 4楼 发表于: 2010-04-02
您能帮我看一下,这样写对吗?谢谢,但是我这样写了后输出的图片有问题。
#include <QtGui>
int main (int argc,char *argv[])
{
    QApplication app(argc,argv);
    QImage colourImg("test.png");
    QSize colourImgSize = colourImg.size();
    int width = colourImgSize.rwidth();
    int height = colourImgSize.rheight();
    unsigned char *colourImgDataPtr = colourImg.bits();
    QImage grayImg(colourImgSize, QImage::Format_Indexed8);
    unsigned char *grayImgDataPtr = grayImg.bits();

    for(int i = 0; i < height; i++)
    {
     for(int j = 0; j < width; j++)
     {
      *grayImgDataPtr = *(colourImgDataPtr + 1);
      colourImgDataPtr += 4;
      grayImgDataPtr++;
     }
    }
    QVector<QRgb> grayColourTable;
    QRgb colourtable[255];
    for(int i = 0; i < 256; i++)
    {
       colourtable=qRgb(i,i,i);
       grayColourTable.append(colourtable);
    }
    grayImg.setColorTable(grayColourTable);
    grayImg.save("grayImage.bmp", "bmp");
    app.exec();
}
离线yangfanxing
只看该作者 3楼 发表于: 2010-04-02
宽,高,of course...
你看看构造一幅QImage需要那些信息就可以了~
PHPWind好恶心。。。不想看这种界面。。。
离线libo1017
只看该作者 2楼 发表于: 2010-04-02
转化为灰度图除了需要获得像素值bits(),还需要哪些图像信息,谢谢!
离线yangfanxing
只看该作者 1楼 发表于: 2010-04-02
1、获得图像像素值信息bits()等。。。构造QImage。
2、设置八位颜色索引表
  1.          for(int i = 0; i < 256; i++)
  2.          {
  3.              colorTable[i] = qRgb(i, i, i);
  4.              vcolorTable.append(colorTable[i]);
  5.          }

3、对所构造的QImage要setColorTable(vcolorTable);
4、setPalette();等方法显示图像。
PHPWind好恶心。。。不想看这种界面。。。
快速回复
限100 字节
 
上一个 下一个