diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/QmitkPartialVolumeAnalysisWidget.cpp b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/QmitkPartialVolumeAnalysisWidget.cpp index f362604cd0..137b295c9f 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/QmitkPartialVolumeAnalysisWidget.cpp +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/QmitkPartialVolumeAnalysisWidget.cpp @@ -1,127 +1,156 @@ /*========================================================================= Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #include "QmitkPartialVolumeAnalysisWidget.h" #include "mitkHistogramGenerator.h" #include "mitkPartialVolumeAnalysisClusteringCalculator.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //#include QmitkPartialVolumeAnalysisWidget::QmitkPartialVolumeAnalysisWidget( QWidget * parent ) : QmitkPlotWidget(parent) { // this->SetAxisTitle( QwtPlot::xBottom, "Grayvalue" ); // this->SetAxisTitle( QwtPlot::yLeft, "Probability" ); // this->Replot(); m_Plot->setCanvasLineWidth(0); m_Plot->setMargin(0); } QmitkPartialVolumeAnalysisWidget::~QmitkPartialVolumeAnalysisWidget() { } void QmitkPartialVolumeAnalysisWidget::DrawGauss() { } void QmitkPartialVolumeAnalysisWidget::ClearItemModel() { } void QmitkPartialVolumeAnalysisWidget::SetParameters( ParamsType *params, ResultsType *results, HistType *hist ) { this->Clear(); if(params != 0 && results != 0) { + hist->Print(); params->Print(); + results->Print(); + for(unsigned int i=0; iGetXVals()); m_Vals.push_back(hist->GetHVals()); + + std::vector *xVals = hist->GetXVals(); + std::vector *yVals = hist->GetHVals(); + std::vector *fiberVals = new std::vector(results->GetFiberVals()); + std::vector *nonFiberVals = new std::vector(results->GetNonFiberVals()); + std::vector *mixedVals = new std::vector(results->GetMixedVals()); + std::vector *combiVals = new std::vector(results->GetCombiVals()); + + + double fiberFA = 0.0; + double weights = 0.0; + + std::cout << "x, y, fiber, nonFiber, mixed, combi" << std::endl; + for(int i=0; isize(); ++i) + { + + fiberFA += xVals->at(i) * fiberVals->at(i); + weights += fiberVals->at(i); + + std::cout << xVals->at(i) << " " << yVals->at(i) << " " << fiberVals->at(i) + << " " << nonFiberVals->at(i) << " " << mixedVals->at(i) << " " << combiVals->at(i) << std::endl; + + } + + fiberFA = fiberFA / weights; + + QPen pen( Qt::SolidLine ); pen.setWidth(2); pen.setColor(Qt::black); int curveId = this->InsertCurve( "histogram" ); this->SetCurveData( curveId, (*m_Vals[0]), (*m_Vals[1]) ); this->SetCurvePen( curveId, pen ); // this->SetCurveTitle( curveId, "Image Histogram" ); - std::vector *fiberVals = new std::vector(results->GetFiberVals()); + curveId = this->InsertCurve( "fiber" ); - this->SetCurveData( curveId, (*hist->GetXVals()), (*fiberVals) ); + this->SetCurveData(curveId, (*hist->GetXVals()), (*fiberVals)); this->SetCurvePen( curveId, QPen( Qt::NoPen ) ); this->SetCurveBrush(curveId, QBrush(QColor::fromRgbF(0,1,0,.5), Qt::SolidPattern)); m_Vals.push_back(fiberVals); - std::vector *nonFiberVals = new std::vector(results->GetNonFiberVals()); + curveId = this->InsertCurve( "nonfiber" ); this->SetCurveData( curveId, (*hist->GetXVals()), (*nonFiberVals) ); this->SetCurvePen( curveId, QPen( Qt::NoPen ) ); this->SetCurveBrush(curveId, QBrush(QColor::fromRgbF(1,0,0,.5), Qt::SolidPattern)); m_Vals.push_back(nonFiberVals); - std::vector *mixedVals = new std::vector(results->GetMixedVals()); + curveId = this->InsertCurve( "mixed" ); this->SetCurveData( curveId, (*hist->GetXVals()), (*mixedVals) ); this->SetCurvePen( curveId, QPen( Qt::NoPen ) ); this->SetCurveBrush(curveId, QBrush(QColor::fromRgbF(.7,.7,.7,.5), Qt::SolidPattern)); m_Vals.push_back(mixedVals); pen.setColor(Qt::blue); - std::vector *combiVals = new std::vector(results->GetCombiVals()); curveId = this->InsertCurve( "combi" ); this->SetCurveData( curveId, (*hist->GetXVals()), (*combiVals) ); this->SetCurvePen( curveId, pen ); m_Vals.push_back(combiVals); } this->Replot(); } diff --git a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkPartialVolumeAnalysisViewControls.ui b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkPartialVolumeAnalysisViewControls.ui index 62f1529a98..0056f380df 100644 --- a/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkPartialVolumeAnalysisViewControls.ui +++ b/Modules/Bundles/org.mitk.gui.qt.diffusionimaging/src/internal/QmitkPartialVolumeAnalysisViewControls.ui @@ -1,762 +1,762 @@ QmitkPartialVolumeAnalysisViewControls true 0 0 - 327 - 427 + 343 + 434 Form 0 0 false true QFrame::NoFrame QFrame::Raised 0 QFrame::NoFrame QFrame::Raised 0 0 QFrame::NoFrame QFrame::Raised 6 0 0 0 9 0 0 0 Image: false true 0 0 Mask: false true QFrame::NoFrame QFrame::Raised 0 30 30 - - :/QmitkPartialVolumeAnalysisView/circle.png:/QmitkPartialVolumeAnalysisView/circle.png + + :/QmitkDiffusionImaging/circle.png:/QmitkDiffusionImaging/circle.png 32 32 true true 30 30 - - :/QmitkPartialVolumeAnalysisView/rectangle.png:/QmitkPartialVolumeAnalysisView/rectangle.png + + :/QmitkDiffusionImaging/rectangle.png:/QmitkDiffusionImaging/rectangle.png 32 32 true true 30 30 - - :/QmitkPartialVolumeAnalysisView/polygon.png:/QmitkPartialVolumeAnalysisView/polygon.png + + :/QmitkDiffusionImaging/polygon.png:/QmitkDiffusionImaging/polygon.png 32 32 true true true QFrame::NoFrame QFrame::Raised 0 Upsampling QFrame::NoFrame QFrame::Raised 0 40 1 25 Qt::Horizontal 50 0 2.5 Similar angles QFrame::NoFrame 0 90 0 Qt::Horizontal QSlider::NoTicks 50 0 90° QFrame::NoFrame QFrame::Raised 0 0 display histogram true 0 0 QFrame::NoFrame QFrame::Raised 0 QFrame::NoFrame QFrame::Raised 0 20 20 true true Green Partial Volume Partial Volume Partial Volume Partial Volume PV Red true All QFrame::NoFrame 0 Opacity 10 5 Qt::Horizontal QSlider::TicksBelow Histogram to Clipboard Advanced Qt::Vertical QSizePolicy::Preferred 10 1 QFrame::NoFrame QFrame::Raised QFormLayout::AllNonFixedFieldsGrow 0 Blurring QFrame::NoFrame QFrame::Raised 0 200 1 0 Qt::Horizontal 50 0 0.0 # Bins QFrame::NoFrame 0 100 10 Qt::Horizontal QSlider::NoTicks 50 0 50 quantiles QFrame::StyledPanel QFrame::Raised 0 1.000000000000000 0.010000000000000 0.250000000000000 1.000000000000000 0.010000000000000 0.750000000000000 Estimate circle from binary image Qt::Vertical 20 40 QmitkPartialVolumeAnalysisWidget QWidget
QmitkPartialVolumeAnalysisWidget.h
1
- +
diff --git a/Modules/DiffusionImaging/Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.h b/Modules/DiffusionImaging/Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.h index ff1040ffc9..0f395dadce 100644 --- a/Modules/DiffusionImaging/Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.h +++ b/Modules/DiffusionImaging/Algorithms/mitkPartialVolumeAnalysisClusteringCalculator.h @@ -1,521 +1,521 @@ /*======================================================================== Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. See MITKCopyright.txt or http://www.mitk.org/copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ #ifndef _MITK_PartialVolumeAnalysisClusteringCalculator_H #define _MITK_PartialVolumeAnalysisClusteringCalculator_H #include "MitkDiffusionImagingExports.h" #include "mitkCommon.h" #include "mitkImage.h" #include #include #include #include #include namespace mitk { class MitkDiffusionImaging_EXPORT PartialVolumeAnalysisClusteringCalculator : public itk::Object { public: typedef vnl_vector VecType; typedef mitk::Image::HistogramType MitkHistType; class HistType { public: HistType() { } HistType(const HistType& p) { this->xVals = p.xVals; this->hVals = p.hVals; } ~HistType() { } HistType operator= (const HistType& p) { if (this != &p) // protect against invalid self-assignment { this->xVals = p.xVals; this->hVals = p.hVals; } return *this; } void InitByMitkHistogram(const MitkHistType* histogram) { xVals.set_size(histogram->GetSize()[0]); hVals.set_size(histogram->GetSize()[0]); double sum = histogram->GetTotalFrequency(); MitkHistType::ConstIterator endIt = histogram->End(); MitkHistType::ConstIterator it; bool firstNonEmptyBinFound = false; it = histogram->Begin(); //++it; int i=0; while (it != endIt) { if(it.GetFrequency() || firstNonEmptyBinFound) { firstNonEmptyBinFound = true; xVals(i) = it.GetMeasurementVector().GetElement(0); hVals(i) = it.GetFrequency()/sum; } ++i; ++it; } } void SetXVals(VecType x) {xVals = x;} void SetHVals(VecType h) {hVals = h;} void SetXVals(std::vector x) { int s = x.size(); xVals.set_size(s); for(int i=0; i h) { int s = h.size(); hVals.set_size(s); for(int i=0; i* GetXVals() { int s = xVals.size(); std::vector* retval = new std::vector(s); for(int i=0; i* GetHVals() { int s = hVals.size(); std::vector* retval = new std::vector(s); for(int i=0; ivals.clear(); // this->mixedVals.clear(); // int s = p.vals.size(); // for(int i=0; ivals.push_back(v); // } // s = p.mixedVals.size(); // for(int i=0; imixedVals.push_back(v); // } // this->combiVals = p.combiVals; // } // return *this; // } void Initialize (const ClusterResultType *p) { if (this != p) // protect against invalid self-assignment { this->vals.clear(); this->mixedVals.clear(); int s = p->vals.size(); for(int i=0; ivals[i]; this->vals.push_back(v); } s = p->mixedVals.size(); for(int i=0; imixedVals[i]; this->mixedVals.push_back(v); } this->combiVals = p->combiVals; } } std::vector GetFiberVals() { - if(vals.size()==2 && vals[0].data_block()) + if(vals.size()==2 && vals[1].data_block()) { - int s = vals[0].size(); + int s = vals[1].size(); std::vector retval(s); for(int i=0; i(0); } } std::vector GetNonFiberVals() { - if(vals.size()==2 && vals[1].data_block()) + if(vals.size()==2 && vals[0].data_block()) { - int s = vals[1].size(); + int s = vals[0].size(); std::vector retval(s); for(int i=0; i(0); } } std::vector GetMixedVals() { if(mixedVals.size()==1 && mixedVals[0].data_block()) { int s = mixedVals[0].size(); std::vector retval(s); for(int i=0; i(0); } } std::vector GetCombiVals() { if(combiVals.data_block()) { int s = combiVals.size(); std::vector retval(s); for(int i=0; i(0); } } void Print(VecType vec, int nr=10) { int sz = vec.size(); int incr = (int)((1.0*sz)/(1.0*nr)); for(int i=0; i vals; std::vector mixedVals; VecType combiVals; }; class ParamsType { public: ParamsType() { } ~ParamsType() { } void Initialize(const ParamsType *p) { if (this != p) // protect against invalid self-assignment { means[0] = p->means[0]; means[1] = p->means[1]; sigmas[0] = p->sigmas[0]; sigmas[1] = p->sigmas[1]; ps[0] = p->ps[0]; ps[1] = p->ps[1]; } } void Print() { MITK_INFO << "PARAMS" << std::endl; MITK_INFO << "Class 1: " << means[0] << " +- " << sqrt(sigmas[0]) << " (p=" << ps[0] << ")" << std::endl; MITK_INFO << "Class 2: " << means[1] << " +- " << sqrt(sigmas[1]) << " (p=" << ps[1] << ")" << std::endl; MITK_INFO << "Partial V: p=" << 1.0-ps[0]-ps[1] << std::endl; } double means[2]; double sigmas[2]; double ps[2]; }; struct HelperStructClusteringResults { MitkHistType *interestingHist; MitkHistType *totalHist; double p_interesting; }; struct HelperStructRGBChannels { mitk::Image::Pointer r; mitk::Image::Pointer g; mitk::Image::Pointer b; ~HelperStructRGBChannels() { r = 0; g = 0; b = 0; } }; struct HelperStructPerformRGBClusteringRetval { HelperStructRGBChannels *rgbChannels; mitk::Image::Pointer rgb; ParamsType *params; ClusterResultType *result; HistType *hist; HelperStructPerformRGBClusteringRetval() : rgbChannels(0), params(0), result(0), hist(0) { } ~HelperStructPerformRGBClusteringRetval() { rgb = 0; delete rgbChannels; } }; struct HelperStructPerformClusteringRetval { mitk::Image::Pointer clusteredImage; mitk::Image::Pointer displayImage; ParamsType *params; ClusterResultType *result; HistType *hist; HelperStructPerformClusteringRetval() : clusteredImage(0), displayImage(0), params(0), result(0), hist(0) { } ~HelperStructPerformClusteringRetval() { clusteredImage = 0; displayImage = 0; } }; mitkClassMacro( PartialVolumeAnalysisClusteringCalculator, itk::Object ) itkNewMacro( PartialVolumeAnalysisClusteringCalculator ) ParamsType *InitialGuess(HistType h) const; ParamsType *Cluster(const HistType h, ParamsType* initialGuess) const; ClusterResultType CalculateCurves(ParamsType params, VecType xVals) const; void Normalize(ParamsType params, ClusterResultType* curves) const; HelperStructPerformClusteringRetval* PerformClustering(mitk::Image::ConstPointer image, const MitkHistType *histogram, int classIdent, HelperStructPerformClusteringRetval* precResult = 0) const; HelperStructPerformRGBClusteringRetval* PerformRGBClustering(mitk::Image::ConstPointer image, const MitkHistType *histogram) const; HelperStructPerformClusteringRetval* PerformQuantiles(mitk::Image::ConstPointer image, const MitkHistType *histogram, double p1, double p2) const; HelperStructPerformRGBClusteringRetval* PerformRGBQuantiles(mitk::Image::ConstPointer image, const MitkHistType *histogram, double p1, double p2 ) const; double* PerformQuantification(mitk::Image::ConstPointer image, mitk::Image::Pointer clusteredImage, mitk::Image::Pointer mask = 0) const; mitk::Image::Pointer CaculateAngularErrorImage( mitk::Image::Pointer comp1, mitk::Image::Pointer comp2, mitk::Image::Pointer probImg) const; template < typename TPixel, unsigned int VImageDimension > void InternalGenerateRGB( const itk::Image< TPixel, VImageDimension > *image, HelperStructRGBChannels *rgb, mitk::Image::Pointer retval ) const; template < typename TPixel, unsigned int VImageDimension > void InternalGenerateProbabilityImage( const itk::Image< TPixel, VImageDimension > *image, const HelperStructClusteringResults clusterResults, mitk::Image::Pointer outImage1, mitk::Image::Pointer outImage2 ) const; template < typename TPixel, unsigned int VImageDimension > void InternalQuantify( const itk::Image< TPixel, VImageDimension > *image, mitk::Image::ConstPointer clusteredImage, double* retval, mitk::Image::Pointer mask ) const; template < typename TPixel, unsigned int VImageDimension > void InternalGenerateQuantileImage( const itk::Image< TPixel, VImageDimension > *image, double* q, mitk::Image::Pointer outImage1, mitk::Image::Pointer outImage2 ) const; ParamsType* Cluster(const HistType h) const {return Cluster(h, InitialGuess(h));} void SetMaxIt(unsigned int it) { m_MaxIt = it; } unsigned int GetMaxIt() { return m_MaxIt; } void SetStepsNumIntegration(unsigned int n) { m_StepsNumIntegration = n; } unsigned int GetStepsNumIntegration() { return m_StepsNumIntegration; } protected: PartialVolumeAnalysisClusteringCalculator(); virtual ~PartialVolumeAnalysisClusteringCalculator(); unsigned int m_MaxIt; unsigned int m_StepsNumIntegration; }; } #endif // #define _MITK_PartialVolumeAnalysisClusteringCalculator_H