Pārlūkot izejas kodu

Fix window/level calculation for dicom dataset

Use the auto calculated window/level unless the user
has manually set one by dragging the mouse in the viewer
Steve Pieper 13 gadi atpakaļ
vecāks
revīzija
a155a33f59
1 mainītis faili ar 21 papildinājumiem un 10 dzēšanām
  1. 21 10
      Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

+ 21 - 10
Libs/DICOM/Widgets/ctkDICOMDatasetView.cpp

@@ -67,6 +67,7 @@ public:
   QPoint OldMousePos;
   double DicomIntensityLevel;
   double DicomIntensityWindow;
+  bool AutoWindowLevel;
 
   void init();
 
@@ -96,6 +97,8 @@ void ctkDICOMDatasetViewPrivate::init()
 
   this->DicomIntensityWindow = 0;
 
+  this->AutoWindowLevel = true;
+
   /*
   this->Window->setParent(q);
   QHBoxLayout* layout = new QHBoxLayout(q);
@@ -271,17 +274,24 @@ void ctkDICOMDatasetView::addImage( DicomImage & dcmImage, bool defaultIntensity
     }
     // Select first window defined in image. If none, compute min/max window as best guess.
     // Only relevant for monochrome
-    // TODO: Re-Use code from ctkDICOMThumbnailGenerator by re-factoring it to a function?
-    if (dcmImage.isMonochrome())
+    if (d->AutoWindowLevel)
     {
-        if (defaultIntensity && dcmImage.getWindowCount() > 0)
-        {
-          dcmImage.setWindow(0);
-        }
-        else
-        {
-          dcmImage.setWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
-        }
+      if (dcmImage.isMonochrome())
+      {
+          if (defaultIntensity && dcmImage.getWindowCount() > 0)
+          {
+            dcmImage.setWindow(0);
+          }
+          else
+          {
+            dcmImage.setMinMaxWindow(OFTrue /* ignore extreme values */);
+            dcmImage.getWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
+          }
+      }
+    } 
+    else 
+    {
+      dcmImage.setWindow(d->DicomIntensityLevel, d->DicomIntensityWindow);
     }
     /* get image extension and prepare image header */
     const unsigned long width = dcmImage.getWidth();
@@ -363,6 +373,7 @@ void ctkDICOMDatasetView::mouseMoveEvent(QMouseEvent* event){
 
         d->DicomIntensityWindow += (5*(nowPos.x()-d->OldMousePos.x()));
         d->DicomIntensityLevel -= (5*(nowPos.y()-d->OldMousePos.y()));
+        d->AutoWindowLevel = false;
 
         d->setImage(d->CurrentImageIndex, false);