dcmtk display image Пример Qt - PullRequest
       20

dcmtk display image Пример Qt

0 голосов
/ 29 июня 2018

Я хотел бы иметь возможность отображать изображение Dicom в проекте Qt с тем же рендером, который может дать программа просмотра Dicom.

Я смог сделать это, но с очень плохим контрастом. Я слышал, что вам нужно работать с пикселями, но я не уверен. У вас есть рабочий пример?

РЕДАКТИРОВАТЬ: я добавляю свой код на случай, если он поможет вам, я прокомментировал много вещей, потому что я заметил, что результат был точно такой же

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
#undef UNICODE
#undef _UNICODE
#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmimgle/dcmimage.h>
#include <QPixmap>
#include <QLabel>
#include <QImageReader>

using namespace std;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //int sizeX = 600;
   // int sizeY = 600;


    //initialize random seed
    //srand (time(NULL));


    //QImage image = QImage( sizeX, sizeY, QImage::Format_RGB32 );

    /*for( int l=0; l<sizeX; l++ )
    {
        for( int c=0; c<sizeY; c++ )
        {
            ///Random color for each pixel
            //image.setPixel( l, c, qRgb(rand() % 256, rand() % 256, rand() % 256) );

            ///Fixed color for each pixel
            image.setPixel( l, c, qRgb(100, 150, 200) );
        }
    }*/
    const char *file = "/home/x4rkz/project/Laura/QTImage/IMG00000";
    DicomImage *image = new DicomImage(file);


    if (image != NULL)
        {
          if (image->getStatus() == EIS_Normal)
          {
            Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 )); // bits per sample
            // Uint8 is a pointer to internal memory buffer
            if (pixelData != NULL)
            {
                // do something useful with the pixel data
                QImage img(pixelData,image->getWidth(), image->getHeight(), QImage::Format_Indexed8 );
                /*QColor color;
                QImage *img;
                void *pDicomDibits;
                uchar *px;
               // uchar pixel[4];
                const int width = (int)(image->getWidth());
                const int height = (int)(image->getHeight());
                if (image->isMonochrome()){
                    img = new QImage(width, height, QImage::Format_Indexed8);
                    img->setColorCount(256);
                    // define gray palette here
                    for (int i=0; i<256; i++) {
                        color.setRgb(i, i, i);
                        img->setColor(i, color.rgb());
                    }

                    image->createWindowsDIB(pDicomDibits, 0, 0, 8, 0, 1);
                    unsigned char * pd;
                    pd=(unsigned char *)pDicomDibits;

                    for (int y=0; y < (long) height; y++)
                    {
                        px = img->scanLine(y);
                        for (int x=0; x < (long) width; x++)
                        {
                            px[x] = (unsigned char) (*pd);
                            pd++;
                        }
                    }*/


                    QGraphicsScene * graphic = new QGraphicsScene( this );

                    graphic->addPixmap( QPixmap::fromImage( img ) );

                    ui->graphicsView->setScene(graphic);

               /* }else
                    cout << "Non monochrome image" << endl;*/


            }
          } else
            cerr << "Error: cannot load DICOM image (" << DicomImage::getString(image->getStatus()) << ")" << endl;
        }
  }

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









#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#undef UNICODE
#undef _UNICODE
#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmimgle/dcmimage.h>
#include <QPixmap>
#include <QLabel>
#include <QImageReader>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

enter image description here

Как видите, результат не имеет ограничений.

1 Ответ

0 голосов
/ 03 июля 2018

Как видите, результат не имеет ограничений.

Если визуализированное изображение имеет такой низкий контраст, вы должны попытаться установить соответствующее окно VOI (Value of Interest), например, используя image->setMinMaxWndow(). Подробнее см. Документация по API .

...