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

755 阅读2分钟

本例子将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 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()

{

m_vecGrayTable.clear();
m_vecColorTable.clear();
int r;
int g;
int b;
int nTemp;
for(int i=0;i<256;i++)
{
    //初始化灰度图颜色表
    m_vecGrayTable<<(i+i*0x100+i*0x10000+0xff000000);
    //初始化伪彩图颜色表
    if(i<=51)
    {
        r = 255;
        g = i*5;
        b = 0;
    }
    else if(i<=102)
    {
        nTemp = i-51;
        r = 255-nTemp*5;
        g = 255;
        b = 0;
    }
    else if(i<=153)
    {
        nTemp = i-102;
        r = 0;
        g = 255;
        b = nTemp*5;
    }
    else if(i<=204)
    {
        nTemp = i-153;//51
        r = 0;
        g = 255-(qint8)(nTemp*127.0/51+0.5);
        b = 255;
    }
    else if(i<=255)
    {
        nTemp = i-204;
        r = 0;
        g = 127-(qint8)(nTemp*127.0/51+0.5);
        b = 255;
    }
    QColor c(r,g,b);
    m_vecColorTable.insert(0,c.rgb());
    //m_vecColorTable.append(c.rgb());
}

}

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

}

mainwindow.ui:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>947</width>
    <height>562</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QHBoxLayout" name="horizontalLayout">
    <item>
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <widget class="QPushButton" name="pushButton_2">
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>ShowGray</string>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="pushButton">
        <property name="maximumSize">
         <size>
          <width>100</width>
          <height>16777215</height>
         </size>
        </property>
        <property name="text">
         <string>ShowColor</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
    <item>
     <widget class="QLabel" name="label">
      <property name="text">
       <string/>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>947</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

.pro文件如下:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# The following define makes your compiler emit warnings if you use

# any Qt feature that has been marked deprecated (the exact warnings

# depend on your compiler). Please consult the documentation of the

# deprecated API in order to know how to port your code away from it.

DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if it uses deprecated APIs.

# In order to do so, uncomment the following line.

# You can also select to disable deprecated APIs only up to a certain version of Qt.

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \

    main.cpp \

    mainwindow.cpp

HEADERS += \

    mainwindow.h

FORMS += \

    mainwindow.ui

# Default rules for deployment.

qnx: target.path = /tmp/$${TARGET}/bin

else: unix:!android: target.path = /opt/$${TARGET}/bin

!isEmpty(target.path): INSTALLS += target