qt显示RGB彩色图

        
        for(int i = 0;i<height;i++)
        {
            for(int j = 0;j<width;j++)
            {
                ImageRGB_m[i*3*width+3*j]  =ImageR_m[i*width+j];
                ImageRGB_m[i*3*width+3*j+1]=ImageG_m[i*width+j];
                ImageRGB_m[i*3*width+3*j+2]=ImageB_m[i*width+j];
            }
        }
        QImage *tempImage=new QImage(ImageRGB_m,width,height,QImage::Format_RGB888);
        ImageLable_m->setImagePix(tempImage);
        ImageLable_m->show();

        ui->image_LB_show->setPixmap(QPixmap::fromImage(*image));

中间的ImageLable_m是我自己写的一个专门用于显示图片包含QLabel的一个类.这个是在5.5.1版本中可以先试采土代码。

网上发现很多人说RGB的彩图显示不了,最开始我的也是现实不了,后来发现是
QImage(ImageRGB_m,width,height,QImage::Format_RGB888);这个是个重载函数,如果要限定每一行的
数据大小,切记不要限定为width,这样也是导致显示不了的主要原因,这时候看tempImage的调试信息
显示位invalid,将限定数据大小的去掉就可以正常显示彩图了。也就是不要写成
QImage(ImageRGB_m,width,height,width ,QImage::Format_RGB888);,如果要防止图片扭曲可以写成下面这样就可以了
        QImage *tempImage=new QImage(ImageRGB_m,width,height,3*width,QImage::Format_RGB888);
防止图片扭曲:
同时限定每一行的数据大小可以保证
图片显示不扭曲,这里之前也是一直搞不懂图片为什么会扭曲,其实就是没有限定每一行数据的大小,当,
不限定每一行数据的大小的时候磨人的貌似是8的倍数的就刚好可以显示,否则就会发生错行,也就是扭曲
的了。qt里面有很多需要注意的细节的了,希望对遇到同样问题的人有帮助。

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将光谱数据映射成像有多种方法,以下是基本的一种方法: 1. 将光谱数据转换为灰度值或彩色值:将光谱数据的每个数据点转换为灰度值或RGB值。可以使用线性缩放或非线性缩放来进行数据转换,以便将数据映射到0-255或0-1的范围内。例如,可以通过使用MinMaxScaler进行归一化将数据缩放到0-1范围内,然后将其转换为灰度或RGB值。 2. 创建像:根据光谱数据的大小创建一个空白像,并使用灰度或RGB值填充每个像素。 3. 显示像:使用Qt中的相应函数将显示在窗口中。可以使用QImage来保存和加载像。 下面是一个简单的示例代码,它将光谱数据转换为灰度像并将其显示Qt窗口中: ```cpp // load spectral data from file std::vector<double> spectrum = loadSpectralData("spectrum.txt"); // create grayscale image int width = 256; int height = 256; QImage image(width, height, QImage::Format_Grayscale8); // convert spectral data to grayscale values double maxVal = *std::max_element(spectrum.begin(), spectrum.end()); double minVal = *std::min_element(spectrum.begin(), spectrum.end()); for (int i = 0; i < spectrum.size(); i++) { double val = (spectrum[i] - minVal) / (maxVal - minVal) * 255.0; image.setPixel(i % width, i / width, qRgb(val, val, val)); } // display image in window QLabel* label = new QLabel(); label->setPixmap(QPixmap::fromImage(image)); label->show(); ``` 其中,loadSpectralData函数可以自己实现来读取光谱数据文件。上面的代码将光谱数据映射到了灰度像,如果要映射到彩色像,可以将每个数据点映射到RGB值,例如: ```cpp // convert spectral data to RGB values for (int i = 0; i < spectrum.size(); i++) { double val = (spectrum[i] - minVal) / (maxVal - minVal); int r = 255 * std::min(2.0 - val * 2.0, 1.0); int g = 255 * std::min(std::max(2.0 - std::abs(val - 1.0) * 2.0, 0.0), 1.0); int b = 255 * std::min(2.0 - val * 2.0, 1.0); image.setPixel(i % width, i / width, qRgb(r, g, b)); } ``` 这会将光谱数据映射到一个彩色像中,其中红色代表高强度,绿色代表中等强度,蓝色代表低强度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值