Advertisement
DarkArbiter

Untitled

Sep 18th, 2023
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.80 KB | None | 0 0
  1. #include <QVTKOpenGLNativeWidget.h>
  2. #include <vtkActor.h>
  3. #include <vtkDataSetMapper.h>
  4. #include <vtkDoubleArray.h>
  5. #include <vtkGenericOpenGLRenderWindow.h>
  6. #include <vtkPointData.h>
  7. #include <vtkProperty.h>
  8. #include <vtkRenderer.h>
  9. #include <vtkSphereSource.h>
  10. #include <vtkVolume.h>
  11. #include <vtkVolumeProperty.h>
  12. #include <vtkSmartVolumeMapper.h>
  13. #include <vtkOpenGLGPUVolumeRayCastMapper.h>
  14. #include <vtkImageReslice.h>
  15. #include <vtkImageMapper3D.h>
  16. #include <vtkImageActor.h>
  17. #include <vtkLookupTable.h>
  18. #include <vtkImageMapToColors.h>
  19. #include <vtkTransform.h>
  20. #include <vtkChartXY.h>
  21. #include <vtkContextScene.h>
  22. #include <vtkContextView.h>
  23. #include <vtkFloatArray.h>
  24. #include <vtkIntArray.h>
  25. #include <vtkPlot.h>
  26. #include <vtkTable.h>
  27. #include <vtkColorSeries.h>
  28. #include <vtkAxis.h>
  29. #include <vtkRenderWindowInteractor.h>
  30. #include <vtkChartHistogram2D.h>
  31. #include <vtkContextScene.h>
  32. #include <vtkContextView.h>
  33. #include <vtkIntArray.h>
  34. #include <vtkPlot.h>
  35. #include <vtkTable.h>
  36. #include <vtkRenderWindow.h>
  37. #include <vtkRenderWindowInteractor.h>
  38. #include <vtkPolyData.h>
  39. #include <vtkSTLReader.h>
  40. #include <vtkPolyDataMapper.h>
  41. #include <vtkActor.h>
  42. #include <vtkProperty.h>
  43.  
  44. #include <QApplication>
  45. #include <QDockWidget>
  46. #include <QGridLayout>
  47. #include <QLabel>
  48. #include <QMainWindow>
  49. #include <QPointer>
  50. #include <QPushButton>
  51. #include <QVBoxLayout>
  52. #include <QDebug>
  53. #include <QSlider>
  54. #include <QRadioButton>
  55. #include <QDialog>
  56. #include <QtCharts/QChartView>
  57. #include <QtCharts/QBarSeries>
  58. #include <QtCharts/QBarSet>
  59. #include <QtCharts/QBarCategoryAxis>
  60. #include <QtCharts/QValueAxis>
  61.  
  62. #include <cmath>
  63. #include <cstdlib>
  64. #include <random>
  65.  
  66. #include <iostream>
  67. #include <fstream>
  68. #include <sstream>
  69.  
  70. #include <vtkImageData.h>
  71. #include <vtkSmartPointer.h>
  72. #include <vtkActor.h>
  73. #include <vtkRenderer.h>
  74. #include <vtkNamedColors.h>
  75. #include <vtkColorTransferFunction.h>
  76. #include <vtkPiecewiseFunction.h>
  77. #include <vtkImageHistogram.h>
  78. #include <vtkImageAccumulate.h>
  79. #include <vtkImageBlend.h>
  80.  
  81. using namespace std;
  82.  
  83.  
  84. int main(int argc, char* argv[])
  85. {
  86.     QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
  87.     QApplication app(argc, argv);
  88.  
  89.     QMainWindow mainWindow;
  90.     mainWindow.resize(1200, 900);
  91.  
  92.     QGridLayout* gridLayout = new QGridLayout();
  93.     QWidget* centralWidget = new QWidget(&mainWindow);
  94.     centralWidget->setLayout(gridLayout);
  95.     mainWindow.setCentralWidget(centralWidget);
  96.  
  97.     QDockWidget controlDock;
  98.     mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &controlDock);
  99.  
  100.     QLabel controlDockTitle("");
  101.     controlDock.setTitleBarWidget(&controlDockTitle);
  102.  
  103.     QPointer<QVBoxLayout> dockLayout = new QVBoxLayout();
  104.     QWidget layoutContainer;
  105.     layoutContainer.setLayout(dockLayout);
  106.     controlDock.setWidget(&layoutContainer);
  107.  
  108.     QPointer<QVTKOpenGLNativeWidget> ctRenderWidget = new QVTKOpenGLNativeWidget();
  109.     QPointer<QVTKOpenGLNativeWidget> mrRenderWidget = new QVTKOpenGLNativeWidget();
  110.     QPointer<QVTKOpenGLNativeWidget> ctMrRenderWidget = new QVTKOpenGLNativeWidget();
  111.  
  112.     vtkNew<vtkGenericOpenGLRenderWindow> ctRenderWindow;
  113.     vtkNew<vtkGenericOpenGLRenderWindow> mrRenderWindow;
  114.     vtkNew<vtkGenericOpenGLRenderWindow> ctMrRenderWindow;
  115.     ctRenderWidget->setRenderWindow(ctRenderWindow.Get());
  116.     mrRenderWidget->setRenderWindow(mrRenderWindow.Get());
  117.     ctMrRenderWidget->setRenderWindow(ctMrRenderWindow.Get());
  118.  
  119.     vtkNew<vtkGenericOpenGLRenderWindow> histogramRenderWindow;
  120.     QVTKOpenGLNativeWidget* histogramRenderWidget = new QVTKOpenGLNativeWidget();
  121.     histogramRenderWidget->setRenderWindow(histogramRenderWindow.Get());
  122.  
  123.     vtkNew<vtkGenericOpenGLRenderWindow> MRhistogramRenderWindow;
  124.     QVTKOpenGLNativeWidget* MRhistogramRenderWidget = new QVTKOpenGLNativeWidget();
  125.     MRhistogramRenderWidget->setRenderWindow(MRhistogramRenderWindow.Get());
  126.  
  127.     QSlider slider(Qt::Vertical);
  128.     dockLayout->addWidget(&slider);
  129.  
  130.     slider.setMinimum(0);
  131.     slider.setMaximum(141);
  132.     slider.setValue(0);
  133.  
  134.  
  135.     // File headers
  136.     string CTinput = "D:/adobiiii/mr-ct/CT.rdata"; ///////////////change later
  137.     string MRinput = "D:/adobiiii/mr-ct/MR.rdata"; ///////////////change later
  138.     ifstream MRstream(MRinput + ".header");
  139.     ifstream CTstream(CTinput + ".header");
  140.     string line;
  141.  
  142.     std::ifstream MRfin(MRinput, ios::in | ios::binary | ios::ate);
  143.     std::ifstream CTfin(CTinput, ios::in | ios::binary | ios::ate);
  144.  
  145.     //size CT
  146.     int CTsize = CTfin.tellg();
  147.     cout << CTsize;
  148.     CTfin.seekg(0, ios::beg);
  149.  
  150.     char *CTbuffer = new char[CTsize];
  151.     CTfin.read(CTbuffer, CTsize);
  152.     CTfin.close();
  153.      
  154.     //size MR
  155.     int MRsize = MRfin.tellg();
  156.     cout << MRsize;
  157.     MRfin.seekg(0, ios::beg);
  158.  
  159.     char *MRbuffer = new char[MRsize];
  160.     MRfin.read(MRbuffer, MRsize);
  161.     MRfin.close();
  162.  
  163.  
  164.     //Setup allocator for input file MR
  165.     vtkSmartPointer<vtkImageData> MRimageData = vtkSmartPointer<vtkImageData>::New();
  166.     MRimageData->SetDimensions(512, 512, 192);
  167.     MRimageData->SetSpacing(0.351562, 0.351562, 0.7);
  168.     MRimageData->SetOrigin(0, 0, 0);
  169.     MRimageData->AllocateScalars(VTK_UNSIGNED_SHORT, 1);
  170.  
  171.     //Setup allocator for input file CT
  172.     vtkSmartPointer<vtkImageData> CTimageData = vtkSmartPointer<vtkImageData>::New();
  173.     CTimageData->SetDimensions(512, 512, 247);
  174.     CTimageData->SetSpacing(0.447266, 0.447266, 0.625);
  175.     CTimageData->SetOrigin(0, 0, 0);
  176.     CTimageData->AllocateScalars(VTK_UNSIGNED_SHORT, 1);
  177.  
  178.     //Copy image data MR
  179.     unsigned char* MRimageDataPointer = static_cast<unsigned char*>(MRimageData->GetScalarPointer());
  180.     std::memcpy(MRimageDataPointer, MRbuffer, MRsize);
  181.     //Copy image data CT
  182.     unsigned char* CTimageDataPointer = static_cast<unsigned char*>(CTimageData->GetScalarPointer());
  183.     std::memcpy(CTimageDataPointer, CTbuffer, CTsize);
  184.  
  185.     //Mapping data MR
  186.     vtkNew<vtkOpenGLGPUVolumeRayCastMapper> MRvolumeMapper;
  187.     MRvolumeMapper->SetInputData(MRimageData);
  188.  
  189.     //Mapping data CT
  190.     vtkNew<vtkOpenGLGPUVolumeRayCastMapper> CTvolumeMapper;
  191.     CTvolumeMapper->SetInputData(CTimageData);
  192.  
  193.     //Volumes properties MR
  194.     vtkNew<vtkVolumeProperty> MRvolumeProperty;
  195.     MRvolumeProperty->SetInterpolationTypeToLinear();
  196.  
  197.     vtkNew<vtkVolume> MRvolume;
  198.     MRvolume->SetMapper(MRvolumeMapper);
  199.     MRvolume->SetProperty(MRvolumeProperty);
  200.  
  201.     vtkNew<vtkImageReslice> MRreslice;
  202.     MRreslice->SetInputData(MRimageData);
  203.     MRreslice->SetOutputDimensionality(2);
  204.     MRreslice->SetResliceAxesDirectionCosines(1, 0, 0, 0, 1, 0, 0, 0, 1);
  205.     MRreslice->SetInterpolationModeToLinear();
  206.  
  207.     MRreslice->SetResliceAxesOrigin(0, 0, 1);
  208.  
  209.     //Volumes properties CT
  210.     vtkNew<vtkVolumeProperty> CTvolumeProperty;
  211.     CTvolumeProperty->SetInterpolationTypeToLinear();
  212.  
  213.     vtkNew<vtkVolume> CTvolume;
  214.     CTvolume->SetMapper(CTvolumeMapper);
  215.     CTvolume->SetProperty(CTvolumeProperty);
  216.  
  217.     vtkNew<vtkImageReslice> CTreslice;
  218.     CTreslice->SetInputData(CTimageData);
  219.     CTreslice->SetOutputDimensionality(2);
  220.     CTreslice->SetResliceAxesDirectionCosines(1, 0, 0, 0, 1, 0, 0, 0, 1);
  221.     CTreslice->SetInterpolationModeToLinear();
  222.  
  223.     CTreslice->SetResliceAxesOrigin(0, 0, 1);
  224.  
  225.     // Create a vtkLookupTable for color mapping MR
  226.     vtkNew<vtkLookupTable> MRcolorTable;
  227.     MRcolorTable->SetTableRange(0, 256); // Zakres danych medycznych
  228.     MRcolorTable->SetHueRange(0.7, 0.7);
  229.     MRcolorTable->SetSaturationRange(1.0, 1.0); // Nasycenie kolorów
  230.     MRcolorTable->SetValueRange(0.2, 1.0); // Jasność kolorów
  231.     MRcolorTable->SetAlphaRange(1.0, 1.0); // Kolor nie jest przezroczysty
  232.     MRcolorTable->SetNumberOfColors(256); // Liczba kolorów w mapie (dostosuj według potrzeb)
  233.     // Tworzenie mapy kolorów
  234.     for (int i = 0; i < 256; i++) {
  235.         double val = static_cast<double>(i) / 255.0;
  236.         MRcolorTable->SetTableValue(i, val, val, val * 0.8, 1.0); // Ustaw niebieski kolor
  237.     }
  238.  
  239.     // Create a vtkLookupTable for color mapping CT
  240.     vtkNew<vtkLookupTable> CTcolorTable;
  241.     CTcolorTable->SetTableRange(0, 10000); // Zakres danych medycznych
  242.     CTcolorTable->SetHueRange(0.0, 0.0);
  243.     CTcolorTable->SetSaturationRange(0.0, 0.0); // Nasycenie kolorów
  244.     CTcolorTable->SetValueRange(0.0, 1.0); // Jasność kolorów
  245.     CTcolorTable->SetAlphaRange(1.0, 1.0); // Kolor nie jest przezroczysty
  246.    
  247.     MRcolorTable->Build();
  248.     CTcolorTable->Build();
  249.  
  250.     // Przeprowadź przekształcenie geometryczne danych MR
  251.     vtkNew<vtkTransform> transform;
  252.  
  253.     // Przekształcenie do współrzędnych rzeczywistych przez pomnożenie każdego woksela zbioru MR przez jego rozmiar
  254.     transform->Scale(0.351562, 0.351562, 0.7);
  255.  
  256.     // Oblicz przesunięcie tak, aby maksymalne wartości były w tej samej pozycji
  257.     double shiftX = (512 - 512) / 2.0; // Szerokość CT - Szerokość MR
  258.     double shiftY = (512 - 512) / 2.0; // Wysokość CT - Wysokość MR
  259.     double shiftZ = (247 - 192) / 2.0; // Grubość CT - Grubość MR
  260.  
  261.     // Przesuń dane MR
  262.     vtkNew<vtkTransform> shiftTransform;
  263.     shiftTransform->Translate(shiftX, shiftY, shiftZ);
  264.  
  265.     // Dodaj przesunięcie do transformacji
  266.     transform->Concatenate(shiftTransform);
  267.  
  268.     // Przekształcenie do współrzędnych zbioru CT przez podzielenie każdego woksela zbioru MR przez rozmiar woksela zbioru CT
  269.     transform->Scale(1.0 / 0.447266, 1.0 / 0.447266, 0.625 / 0.7);
  270.  
  271.     vtkNew<vtkImageReslice> MRCTreslice;
  272.     MRCTreslice->SetInputData(MRimageData);
  273.     MRCTreslice->SetOutputDimensionality(2);
  274.     MRCTreslice->SetResliceAxesDirectionCosines(1, 0, 0, 0, 1, 0, 0, 0, 1);
  275.     MRCTreslice->SetInterpolationModeToLinear();
  276.  
  277.     // Dodaj transformację do MRCTreslice
  278.     MRCTreslice->SetResliceTransform(transform);
  279.  
  280.     vtkNew<vtkImageMapToColors> MRcolorMapper;
  281.     MRcolorMapper->SetInputConnection(MRreslice->GetOutputPort());
  282.     MRcolorMapper->SetLookupTable(MRcolorTable.Get());
  283.  
  284.     vtkNew<vtkImageMapToColors> CTcolorMapper;
  285.     CTcolorMapper->SetInputConnection(CTreslice->GetOutputPort());
  286.     CTcolorMapper->SetLookupTable(CTcolorTable.Get());
  287.  
  288.     vtkNew<vtkImageMapToColors> MRCTcolorMapper;
  289.     MRCTcolorMapper->SetInputConnection(MRCTreslice->GetOutputPort());
  290.     MRCTcolorMapper->SetLookupTable(MRcolorTable.Get());
  291.  
  292.  
  293.     // Tworzenie histogramu CT
  294.     vtkNew<vtkImageHistogram> ctHistogram;
  295.     ctHistogram->SetInputData(CTimageData);
  296.     ctHistogram->SetNumberOfBins(256); // Liczba koszyków
  297.     ctHistogram->SetBinOrigin(0); // Początek zakresu wartości pikseli CT
  298.     ctHistogram->SetBinSpacing(64); // Rozmiar koszyka (jeden piksel)
  299.  
  300.     // Tworzenie histogramu MR
  301.     vtkNew<vtkImageHistogram> mrHistogram;
  302.     mrHistogram->SetInputData(MRimageData);
  303.     mrHistogram->SetNumberOfBins(256); // Liczba koszyków
  304.     mrHistogram->SetBinOrigin(0); // Początek zakresu wartości pikseli MR
  305.     mrHistogram->SetBinSpacing(1); // Rozmiar koszyka (jeden piksel)
  306.  
  307.     // Oblicz miarę NMI
  308.     double nmi = 0.0;
  309.     // Oblicz histogramy CT i MR
  310.     ctHistogram->Update();
  311.     mrHistogram->Update();
  312.  
  313.     // Oblicz sumy binów histogramów CT i MR
  314.     double sumBinsCT = 0.0;
  315.     double sumBinsMR = 0.0;
  316.     double epsilon = 1e-10; // Mała stała zapobiegająca dzieleniu przez zero
  317.  
  318.     for (int i = 0; i < 256; ++i) {
  319.         double pCT = ctHistogram->GetOutput()->GetScalarComponentAsDouble(i, 0, 0, 0);
  320.         double pMR = mrHistogram->GetOutput()->GetScalarComponentAsDouble(i, 0, 0, 0);
  321.  
  322.         sumBinsCT += pCT;
  323.         sumBinsMR += pMR;
  324.  
  325.         if (pCT > 0 && pMR > 0) {
  326.             double pJoint = pCT * pMR; // Oblicz prawdopodobieństwo wspólne
  327.             nmi += pJoint * log(pJoint / (pCT * pMR) + epsilon); // Dodaj do NMI
  328.         }
  329.     }
  330.  
  331.     // Oblicz miarę NMI
  332.     nmi /= sqrt(sumBinsCT * sumBinsMR);
  333.  
  334.     // Formatuj wynik jako liczbę zmiennoprzecinkową z ograniczoną precyzją po przecinku
  335.     std::ostringstream stream;
  336.     stream << std::fixed << std::setprecision(12) << nmi; // Ustal precyzję, np. 4 miejsca po przecinku
  337.  
  338.     QString nmiString = QString::fromStdString(stream.str());
  339.  
  340.     // Tworzenie QLabel do wyświetlenia wyniku NMI
  341.     QLabel *nmiLabel = new QLabel("NMI: " + nmiString);
  342.     dockLayout->addWidget(nmiLabel);
  343.    
  344.    
  345.     // Create a vtkImageActor and set it up to display the slice with colors
  346.     vtkNew<vtkImageActor> MRimageActor;
  347.     vtkNew<vtkImageActor> CTimageActor;
  348.     vtkNew<vtkImageActor> MRCTimageActor;
  349.     vtkNew<vtkImageActor> hist;
  350.     vtkNew<vtkImageActor> histMR;
  351.     MRimageActor->GetMapper()->SetInputConnection(MRcolorMapper->GetOutputPort());
  352.     CTimageActor->GetMapper()->SetInputConnection(CTcolorMapper->GetOutputPort());
  353.     MRCTimageActor->GetMapper()->SetInputConnection(MRCTcolorMapper->GetOutputPort());
  354.     hist->GetMapper()->SetInputConnection(ctHistogram->GetOutputPort());
  355.     histMR->GetMapper()->SetInputConnection(mrHistogram->GetOutputPort());
  356.  
  357.     vtkNew<vtkRenderer> MRrenderer;
  358.     vtkNew<vtkRenderer> CTrenderer;
  359.     vtkNew<vtkRenderer> MRCTrenderer;
  360.     vtkNew<vtkRenderer> histRenderer;
  361.     vtkNew<vtkRenderer> MRhistRenderer;
  362.     mrRenderWindow->AddRenderer(MRrenderer);
  363.     MRrenderer->AddActor(MRimageActor);
  364.     ctRenderWindow->AddRenderer(CTrenderer);
  365.     CTrenderer->AddActor(CTimageActor);
  366.     ctMrRenderWindow->AddRenderer(MRCTrenderer);
  367.     MRCTrenderer->AddActor(MRCTimageActor);
  368.  
  369.     histogramRenderWindow->AddRenderer(histRenderer);
  370.     histRenderer->AddActor(hist);
  371.  
  372.     MRhistogramRenderWindow->AddRenderer(MRhistRenderer);
  373.     MRhistRenderer->AddActor(histMR);
  374.  
  375.     // Dodaj widżety do siatki w głównym oknie
  376.     gridLayout->addWidget(ctRenderWidget, 0, 0);
  377.     gridLayout->addWidget(mrRenderWidget, 0, 1);
  378.     gridLayout->addWidget(ctMrRenderWidget, 0, 2);
  379.     gridLayout->addWidget(histogramRenderWidget, 1, 0);
  380.     gridLayout->addWidget(MRhistogramRenderWidget, 1, 1);
  381.  
  382.  
  383.     mainWindow.show();
  384.     MRrenderer->Render();
  385.     CTrenderer->Render();
  386.     MRCTrenderer->Render();
  387.     histRenderer->Render();
  388.     MRhistRenderer->Render();
  389.  
  390.     QObject::connect(&slider, &QSlider::valueChanged, [&](int value) {
  391.         MRreslice->SetResliceAxesOrigin(0, 0, value);
  392.         CTreslice->SetResliceAxesOrigin(0, 0, value);
  393.         MRCTreslice->SetResliceAxesOrigin(0, 0, value);
  394.         MRrenderer->GetRenderWindow()->Render();
  395.         CTrenderer->GetRenderWindow()->Render();
  396.         MRCTrenderer->GetRenderWindow()->Render();
  397.         });
  398.  
  399.     return app.exec();
  400. }
  401.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement