diff --git a/Modules/ImageStatisticsUI/CMakeLists.txt b/Modules/ImageStatisticsUI/CMakeLists.txt new file mode 100644 index 0000000000..e485f5c3d3 --- /dev/null +++ b/Modules/ImageStatisticsUI/CMakeLists.txt @@ -0,0 +1,5 @@ +MITK_CREATE_MODULE( + INCLUDE_DIRS Qmitk + DEPENDS MitkCore MitkChart + PACKAGE_DEPENDS PRIVATE Qt5|WebEngineWidgets +) \ No newline at end of file diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp new file mode 100644 index 0000000000..b6d877b6b6 --- /dev/null +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp @@ -0,0 +1,127 @@ +/*=================================================================== + +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 "QmitkHistogramVisualizationWidget.h" + +#include + +QmitkHistogramVisualizationWidget::QmitkHistogramVisualizationWidget(QWidget* parent) : QWidget(parent) +{ + m_Controls.setupUi(this); + CreateConnections(); +} + +void QmitkHistogramVisualizationWidget::setHistogram(itk::Statistics::Histogram::ConstPointer histogram, const std::string& dataLabel) +{ + if (histogram == nullptr) + return; + + m_Histogram = histogram; + m_Controls.chartWidget->AddData2D(ConvertHistogramToMap(m_Histogram), dataLabel); + m_Controls.chartWidget->SetChartType(dataLabel, QmitkChartWidget::ChartType::bar); + m_Controls.chartWidget->SetXAxisLabel("Gray value"); + m_Controls.chartWidget->SetYAxisLabel("Frequency"); + + m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked()); + SetGUIElementsEnabled(true); +} + +void QmitkHistogramVisualizationWidget::Reset() +{ + m_Controls.chartWidget->Clear(); + SetGUIElementsEnabled(false); +} + +void QmitkHistogramVisualizationWidget::CreateConnections() +{ + connect(m_Controls.buttonCopyHistogramToClipboard, &QPushButton::clicked, this, &QmitkHistogramVisualizationWidget::OnClipboardButtonClicked); + connect(m_Controls.checkBoxUseDefaultNBins, &QCheckBox::clicked, this, &QmitkHistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged); + connect(m_Controls.spinBoxNBins, &QSpinBox::editingFinished, this, &QmitkHistogramVisualizationWidget::OnNBinsSpinBoxValueChanged); + connect(m_Controls.checkBoxShowSubchart, &QCheckBox::clicked, this, &QmitkHistogramVisualizationWidget::OnShowSubchartCheckBoxChanged); +} + +void QmitkHistogramVisualizationWidget::SetGUIElementsEnabled(bool enabled) +{ + this->setEnabled(enabled); + m_Controls.groupBoxHistogram->setEnabled(enabled); + m_Controls.groupBoxPlot->setEnabled(enabled); + m_Controls.checkBoxShowSubchart->setEnabled(enabled); + m_Controls.checkBoxUseDefaultNBins->setEnabled(enabled); + m_Controls.spinBoxNBins->setEnabled(!m_Controls.checkBoxUseDefaultNBins->isChecked()); + m_Controls.buttonCopyHistogramToClipboard->setEnabled(enabled); +} + +std::map QmitkHistogramVisualizationWidget::ConvertHistogramToMap(itk::Statistics::Histogram::ConstPointer histogram) const +{ + std::map histogramMap; + if (histogram) + { + auto endIt = histogram->End(); + auto it = histogram->Begin(); + + // generating Lists of measurement and frequencies + for (; it != endIt; ++it) + { + double frequency = it.GetFrequency(); + double measurement = it.GetMeasurementVector()[0]; + histogramMap.emplace(measurement, frequency); + } + + } + return histogramMap; +} + +void QmitkHistogramVisualizationWidget::OnClipboardButtonClicked() +{ + if (m_Histogram) + { + QApplication::clipboard()->clear(); + QString clipboard("Measurement \t Frequency\n"); + auto iter = m_Histogram->Begin(); + auto iterEnd = m_Histogram->End(); + for (; iter != iterEnd; ++iter) + { + clipboard = clipboard.append("%L1 \t %L2\n") + .arg(iter.GetMeasurementVector()[0], 0, 'f', 2) + .arg(iter.GetFrequency()); + } + + QApplication::clipboard()->setText(clipboard, QClipboard::Clipboard); + } +} + +void QmitkHistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged() +{ + if (m_Controls.checkBoxUseDefaultNBins->isChecked()) + { + m_Controls.spinBoxNBins->setEnabled(false); + m_Controls.spinBoxNBins->setValue(100); + } + else + { + m_Controls.spinBoxNBins->setEnabled(true); + } +} + +void QmitkHistogramVisualizationWidget::OnNBinsSpinBoxValueChanged() +{ + emit RequestHistogramUpdate(m_Controls.spinBoxNBins->value()); +} + +void QmitkHistogramVisualizationWidget::OnShowSubchartCheckBoxChanged() +{ + m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked()); +} \ No newline at end of file diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h new file mode 100644 index 0000000000..3f3c2885ae --- /dev/null +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h @@ -0,0 +1,71 @@ +/*=================================================================== + +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. + +===================================================================*/ +#ifndef QmitkHistogramVisualizationWidget_H__INCLUDED +#define QmitkHistogramVisualizationWidget_H__INCLUDED + +//Qt +#include + +#include +#include + +//itk +#include + +/** +* \brief Widget for displaying Histograms. +*/ + +class MITKIMAGESTATISTICSUI_EXPORT QmitkHistogramVisualizationWidget : public QWidget +{ + Q_OBJECT + +public: + QmitkHistogramVisualizationWidget(QWidget* parent = nullptr); + /** \brief Draws the histogram and enables the GUI elements. */ + void setHistogram(itk::Statistics::Histogram::ConstPointer histogram, const std::string& dataLabel); + /** \brief Clears the histogram and disables all GUI elements. */ + void Reset(); + +signals: + /** \brief Signal to be emitted when the number of bins is changed by the user. The HistogramCalculator should connect to this signal and recalculate the data accordingly. */ + void RequestHistogramUpdate(unsigned int nBins); + +private: + + void CreateConnections(); + + void SetGUIElementsEnabled(bool enabled); + /** \brief Helper function to convert the histogram in order to forward it to the ChartWidget. */ + std::map ConvertHistogramToMap(itk::Statistics::Histogram::ConstPointer histogram) const; + +//slots + /** \brief Saves the histogram to the clipboard. */ + void OnClipboardButtonClicked(); + /** \brief Enables / Disables SpinBox to change the number of bins. */ + void OnDefaultNBinsCheckBoxChanged(); + /** \brief Emits the signal RequestHistogramUpdate(unsigned int nBins) with the updated value. */ + void OnNBinsSpinBoxValueChanged(); + /** \brief Shows / Hides the subchart. */ + void OnShowSubchartCheckBoxChanged(); + +private: + Ui::QmitkHistogramVisualizationControls m_Controls; + + itk::Statistics::Histogram::ConstPointer m_Histogram; +}; + +#endif //QmitkHistogramVisualizationWidget_H__INCLUDED \ No newline at end of file diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.ui b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.ui new file mode 100644 index 0000000000..d96c7cb2bf --- /dev/null +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.ui @@ -0,0 +1,332 @@ + + + QmitkHistogramVisualizationControls + + + + 0 + 0 + 540 + 460 + + + + + 540 + 460 + + + + Form + + + + false + + + + 0 + 0 + 530 + 450 + + + + + 400 + 450 + + + + + + + false + + + + + + false + + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + 255 + 0 + 0 + + + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + 120 + 120 + 120 + + + + + + + + + + + + + + + false + + + + 0 + 0 + + + + + 0 + 0 + + + + + 16777215 + 16777215 + + + + Plot + + + + + + Show Subchart + + + true + + + + + + + Use default #bins + + + true + + + + + + + QFrame::NoFrame + + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 60 + 0 + + + + + 100 + 16777215 + + + + # bins: + + + + + + + false + + + Press enter to recalculate statistics with new bin size. + + + 1 + + + 10000 + + + 100 + + + + + + + + + + + + + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Copy to Clipboard + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + QmitkChartWidget + QWidget +
QmitkChartWidget.h
+
+
+ + +
diff --git a/Modules/ImageStatisticsUI/files.cmake b/Modules/ImageStatisticsUI/files.cmake new file mode 100644 index 0000000000..29fbf68799 --- /dev/null +++ b/Modules/ImageStatisticsUI/files.cmake @@ -0,0 +1,17 @@ +set(CPP_FILES + Qmitk/QmitkHistogramVisualizationWidget.cpp +) + +set(H_FILES +) + +set(TPP_FILES +) + +set(UI_FILES + Qmitk/QmitkHistogramVisualizationWidget.ui +) + +set(MOC_H_FILES + Qmitk/QmitkHistogramVisualizationWidget.h +) diff --git a/Modules/ModuleList.cmake b/Modules/ModuleList.cmake index 220afef5f0..3dc7dd1186 100644 --- a/Modules/ModuleList.cmake +++ b/Modules/ModuleList.cmake @@ -1,77 +1,78 @@ # The entries in the mitk_modules list must be # ordered according to their dependencies. set(MITK_MODULES Core CommandLine AppUtil RDF LegacyIO DataTypesExt Annotation LegacyGL AlgorithmsExt MapperExt DICOMReader DICOMReaderServices DICOMTesting SceneSerializationBase PlanarFigure ImageDenoising ImageExtraction SceneSerialization Gizmo GraphAlgorithms Multilabel + Chart ImageStatistics + ImageStatisticsUI ContourModel SurfaceInterpolation Segmentation PlanarFigureSegmentation QtWidgets QtWidgetsExt - Chart SegmentationUI Classification GPGPU OpenIGTLink IGTBase IGT CameraCalibration OpenCL OpenCVVideoSupport QtOverlays ToFHardware ToFProcessing ToFUI PhotoacousticsHardware PhotoacousticsAlgorithms PhotoacousticsLib US USUI DicomUI Remeshing Python QtPython Persistence OpenIGTLinkUI IGTUI DicomRT RTUI IOExt XNAT TubeGraph BiophotonicsHardware MatchPointRegistration MatchPointRegistrationUI DiffusionImaging TumorInvasionAnalysis BoundingShape RenderWindowManager RenderWindowManagerUI CEST ) if(MITK_ENABLE_PIC_READER) list(APPEND MITK_MODULES IpPicSupportIO) endif() diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/CMakeLists.txt b/Plugins/org.mitk.gui.qt.measurementtoolbox/CMakeLists.txt index 9af2e00fda..8403f27fb6 100644 --- a/Plugins/org.mitk.gui.qt.measurementtoolbox/CMakeLists.txt +++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/CMakeLists.txt @@ -1,9 +1,9 @@ # The project name must correspond to the directory name of your plug-in # and must not contain periods. project(org_mitk_gui_qt_measurementtoolbox) mitk_create_plugin( EXPORT_DIRECTIVE MITK_QT_MEASUREMENTTOOLBOX EXPORTED_INCLUDE_SUFFIXES src - MODULE_DEPENDS MitkQtWidgetsExt MitkImageStatistics MitkPlanarFigure MitkChart -) + MODULE_DEPENDS MitkQtWidgetsExt MitkImageStatistics MitkImageStatisticsUI MitkPlanarFigure MitkChart +) \ No newline at end of file diff --git a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsReloadedViewControls.ui b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsReloadedViewControls.ui index 87070af49e..9e5df4577f 100644 --- a/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsReloadedViewControls.ui +++ b/Plugins/org.mitk.gui.qt.measurementtoolbox/src/internal/QmitkImageStatisticsReloadedViewControls.ui @@ -1,221 +1,231 @@ QmitkImageStatisticsReloadedViewControls true 0 0 548 853 Form QLayout::SetMinimumSize 4 0 0 false 0 0 0 0 0 0 0 0 120 120 120 Image: 0 0 0 0 0 0 0 0 120 120 120 Mask image: 0 0 false false Statistics 9 9 9 false 400 450 Histogram false - + + + + + Qt::Vertical 20 40 QmitkDataStorageComboBox QComboBox
QmitkDataStorageComboBox.h
+ + QmitkHistogramVisualizationWidget + QWidget +
QmitkHistogramVisualizationWidget.h
+ 1 +