diff --git a/Plugins/org.mitk.gui.qt.exampleplugin/src/internal/ExampleView.cpp b/Plugins/org.mitk.gui.qt.exampleplugin/src/internal/ExampleView.cpp index 46e29b79f8..f4376ff3a7 100644 --- a/Plugins/org.mitk.gui.qt.exampleplugin/src/internal/ExampleView.cpp +++ b/Plugins/org.mitk.gui.qt.exampleplugin/src/internal/ExampleView.cpp @@ -1,271 +1,272 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ //#include <-research // Blueberry #include #include // Qmitk #include "ExampleView.h" // Qt #include #include #include #include // mitk image #include #include #include #include #include #include #include #include #include #include #include #include const std::string ExampleView::VIEW_ID = "org.mitk.views.exampleview"; void ExampleView::SetFocus() { m_Controls.performImageStatisticsButton->setFocus(); } void ExampleView::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); mitk::TNodePredicateDataType::Pointer isImage = mitk::TNodePredicateDataType::New(); mitk::NodePredicateDimension::Pointer is3D = mitk::NodePredicateDimension::New(3); m_Controls.imageSelectionComboBox->SetDataStorage(GetDataStorage()); mitk::NodePredicateAnd::Pointer isAvailable = mitk::NodePredicateAnd::New(); isAvailable->AddPredicate(isImage); isAvailable->AddPredicate(is3D); m_Controls.imageSelectionComboBox->SetPredicate(isAvailable); connect(m_Controls.performImageStatisticsButton, &QPushButton::clicked, this, &ExampleView::DoImageStatistics); connect(m_Controls.generateButton, &QPushButton::clicked, this, &ExampleView::DoPixelMasking); connect(m_Controls.imageSelectionComboBox, SIGNAL(OnSelectionChanged(const mitk::DataNode*)), this, SLOT(OnImageSelectionComboBoxChanged(const mitk::DataNode*))); connect(m_Controls.saveButton, &QPushButton::clicked, this, &ExampleView::DoImageSaving); connect(m_Controls.thresholdSlider, SIGNAL(valueChanged(int)), this, SLOT(OnSliderValueChanged())); connect(m_Controls.thresholdSpinbox, SIGNAL(valueChanged(int)), this, SLOT(OnSpinboxValueChanged())); } void ExampleView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*source*/, const QList &nodes) { } void ExampleView::OnSpinboxValueChanged() { m_Controls.thresholdSlider->setValue(m_Controls.thresholdSpinbox->value()); } void ExampleView::OnSliderValueChanged() { m_Controls.thresholdSpinbox->setValue(m_Controls.thresholdSlider->value()); } void ExampleView::OnImageSelectionComboBoxChanged(const mitk::DataNode *node) { if (node == nullptr) { + m_Controls.thresholdSpinbox->setValue(0); m_Controls.warningLabel->setVisible(true); m_Controls.performImageStatisticsButton->setEnabled(false); m_Controls.generateButton->setEnabled(false); m_Controls.thresholdSpinbox->setEnabled(false); m_Controls.saveButton->setEnabled(false); m_Controls.thresholdSlider->setEnabled(false); return; } m_Controls.warningLabel->setVisible(false); m_Controls.performImageStatisticsButton->setEnabled(true); m_Controls.generateButton->setEnabled(true); m_Controls.thresholdSpinbox->setEnabled(true); m_Controls.saveButton->setEnabled(true); m_Controls.thresholdSlider->setEnabled(true); m_Controls.tableWidgetStatistics->clearContents(); } void ExampleView::DoImageStatistics() { auto node = m_Controls.imageSelectionComboBox->GetSelectedNode(); if (node == nullptr) { MITK_WARN << "no node selected"; } if (node == nullptr) { // Nothing selected. Inform the user and return QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing."); return; } // here we have a valid mitk::DataNode // a node itself is not very useful, we need its data item (the image) mitk::BaseData *data = node->GetData(); if (data) { // test if this data item is an image or not (could also be a surface or something totally different) mitk::Image *image = dynamic_cast(data); if (image) { mitk::ImageStatisticsCalculator::Pointer imgStatisticsCalc= mitk::ImageStatisticsCalculator::New(); imgStatisticsCalc->SetInputImage(image); auto imgStatisticsContained = imgStatisticsCalc->GetStatistics()->GetStatisticsForTimeStep(0); auto stringMedian = mitk::ImageStatisticsConstants::MEDIAN(); auto medianPixelValue = imgStatisticsContained.GetValueConverted(stringMedian); auto stringUniformity = mitk::ImageStatisticsConstants::UNIFORMITY(); auto uniformityPixelValue = imgStatisticsContained.GetValueConverted(stringUniformity); auto stringMax = mitk::ImageStatisticsConstants::MAXIMUM(); auto maxPixelValue = imgStatisticsContained.GetValueConverted(stringMax); auto stringMin = mitk::ImageStatisticsConstants::MINIMUM(); auto minPixelValue = imgStatisticsContained.GetValueConverted(stringMin); unsigned int rowCount = 0; //Output max QString maxPixelValueString = QString::number(maxPixelValue); QTableWidgetItem *max = new QTableWidgetItem(maxPixelValueString); m_Controls.tableWidgetStatistics->setItem(rowCount++, 0, max); //Output min QString minPixelValueString = QString::number(minPixelValue); QTableWidgetItem *min = new QTableWidgetItem(minPixelValueString); m_Controls.tableWidgetStatistics->setItem(rowCount++, 0, min); //Output avg QString medianPixelValueString = QString::number(medianPixelValue); QTableWidgetItem *median = new QTableWidgetItem(medianPixelValueString); m_Controls.tableWidgetStatistics->setItem(rowCount++, 0, median); //Output dev QString uniformityPixelValueString = QString::number(uniformityPixelValue); QTableWidgetItem *uniformity = new QTableWidgetItem(uniformityPixelValueString); m_Controls.tableWidgetStatistics->setItem(rowCount, 0, uniformity); } } } void ExampleView::DoPixelMasking() { int pixelValueMask = m_Controls.thresholdSpinbox->value(); this->ProcessImage(pixelValueMask); } void ExampleView::ProcessImage(int pixelValueMask) { // check for valid node selected auto node = m_Controls.imageSelectionComboBox->GetSelectedNode(); if (node == nullptr) { // Nothing selected. Inform the user and return QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing."); return; } mitk::BaseData* data = node->GetData(); //get data from node if (data != nullptr) { //Ask for the name of the mask bool ok = false; QString name = QInputDialog::getText(QApplication::activeWindow() , tr("Add masked image..."), tr("Enter name for the new masked image"), QLineEdit::Normal, tr("maskedImage"), &ok); if (!ok || name.isEmpty()) return; //Create cloned image mitk::Image::Pointer image = dynamic_cast(data); if (!image) { QMessageBox::information(nullptr, "Warning", "Please load and select an image before starting image processing."); return; } mitk::Image::Pointer maskedImage = image->Clone(); //Get pixel value mitk::ImagePixelWriteAccessor maskedImagePixelAccessor(maskedImage); mitk::ImagePixelReadAccessor imagePixelAccessor(image); int imageXLength = image->GetDimension(0); int imageYLength = image->GetDimension(1); int imageZLength = image->GetDimension(2); itk::Index<3> index; for (int x = 0; x < imageXLength; x++) { for (int y = 0; y < imageYLength; y++) { for (int z = 0; z < imageZLength; z++) { index[0] = x; index[1] = y; index[2] = z; if (imagePixelAccessor.GetPixelByIndex(index) >= pixelValueMask) { maskedImagePixelAccessor.SetPixelByIndex(index, 0); } } } } // Create a new data tree node // mitk::DataNode::Pointer maskedImageNode = mitk::DataNode::New(); // // fill the data tree node with the appropriate information // maskedImageNode->SetData(maskedImage); maskedImageNode->SetProperty("name", mitk::StringProperty::New(name.toStdString())); maskedImageNode->SetProperty("opacity", mitk::FloatProperty::New(1)); // // add the node to the ds // this->GetDataStorage()->Add(maskedImageNode); } } void ExampleView::DoImageSaving() { auto selectedImageNode = m_Controls.imageSelectionComboBox->GetSelectedNode(); if (selectedImageNode == nullptr) return; std::string selectedImageNodeName = selectedImageNode->GetName(); selectedImageNodeName = "/" + selectedImageNodeName + ".mps"; QString fileNameProposal = QString(); fileNameProposal.append(selectedImageNodeName.c_str()); QString filter="NRRD (*.nrrd *.nhdr)"; QString filename = QFileDialog::getSaveFileName(nullptr, "Save image", QDir::currentPath()+ fileNameProposal, "All (*.*);;NRRD (*.nrrd *.nhdr);;Nifti (*.nii *.nii.gz *.hdr *.hdr.gz *.img *.img.gz *.nia);;VTK Image (*.vti);;VTK Legacy Image (*.vtk);;mnc File (*.mnc);;mha File(*.mha *.mhd)",&filter); if (filename.isEmpty()) return; mitk::IOUtil::Save(selectedImageNode->GetData(), filename.toStdString()); }