qt实现将数据转成灰度图及伪彩图

本例子将800*600的double类型的数据先进行归一化成0-255的quint8类型的数据,然后将归一化后的数据生成一个QImage,这个QImage的格式一定要是

QImage::Format_Indexed8
这是为了方便使用自定义的颜色表,然后将qimage放到qlabel中显示,效果如下:

 

 主要代码如下:

头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void            initRGBTable();
    void            findMaxMin(QVector<double> vData, double &fMax, double &fMin);
    QVector<QRgb>   m_vecGrayTable;//灰度图颜色表
    QVector<QRgb>   m_vecColorTable;//彩色图颜色表
    QVector<double> m_vData;
    int             m_nWidth;
    int             m_nHeight;
private slots:
    void on_pushButton_2_clicked();

    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

 源文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    m_nWidth = 800;
    m_nHeight = 600;
    m_vData.resize(800*600);
    for(int i = 0;i<m_nHeight;i++)
    {
        for(int j = 0;j<m_nWidth;j++)
        {
            m_vData[i*m_nWidth+j]=j+0.5;
        }
    }
    initRGBTable();//初始化颜色表
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_2_clicked()//show gray img
{
    double fMax=0.0;
    double fMin=0.0;
    findMaxMin(m_vData,fMax,fMin);
    double fDifference = fMax - fMin;
    QVector<quint8> vnData;
    vnData.resize(m_vData.size());
    if(fDifference != 0)
    {
        for(int i = 0;i<m_nHeight;i++)
        {
            for(int j = 0;j<m_nWidth;j++)
            {
                vnData[i*m_nWidth+j] = static_cast<int>((m_vData.value(i*m_nWidth+j)-fMin)*1.0f/fDifference*255);
            }
        }
    }
    QImage img((uchar*)(&vnData[0]),m_nWidth,m_nHeight,QImage::Format_Indexed8);
    img.setColorTable(m_vecGrayTable);
    QPixmap qPix = QPixmap::fromImage(img);
    qPix.scaled(ui->label->size(), Qt::KeepAspectRatio);
    ui->label->setPixmap(qPix);
}
void MainWindow::findMaxMin(QVector<double> vData, double &fMax, double &fMin)
{
    if(vData.size()>1)
    {
        fMax = vData.value(0);
        fMin = fMax;
        for(int i=1;i<vData.size();i++)
        {
            if(fMax<vData.value(i))
            {
                fMax = vData.value(i);
            }
            if(fMin>vData.value(i))
            {
                fMin = vData.value(i);
            }
        }
    }
}
void MainWindow::initRGBTable()
{
   //核心代码,请联系博主获取
}

void MainWindow::on_pushButton_clicked()
{
    double fMax=0.0;
    double fMin=0.0;
    findMaxMin(m_vData,fMax,fMin);
    double fDifference = fMax - fMin;
    QVector<quint8> vnData;
    vnData.resize(m_vData.size());
    if(fDifference != 0)
    {
        for(int i = 0;i<m_nHeight;i++)
        {
            for(int j = 0;j<m_nWidth;j++)
            {
                vnData[i*m_nWidth+j] = static_cast<int>((m_vData.value(i*m_nWidth+j)-fMin)*1.0f/fDifference*255);
            }
        }
    }
    QImage img((uchar*)(&vnData[0]),m_nWidth,m_nHeight,QImage::Format_Indexed8);
    img.setColorTable(m_vecColorTable);
    QPixmap qPix = QPixmap::fromImage(img);
    qPix.scaled(ui->label->size(), Qt::KeepAspectRatio);
    ui->label->setPixmap(qPix);
}

这个功能的核心就是编辑自己的颜色表,这部分代码可以加我WX获取:13382893223

Guess you like

Origin blog.csdn.net/weixin_43935474/article/details/118730168