Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkTransferFunction.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #include "mitkTransferFunction.h"
14 #include "mitkHistogramGenerator.h"
15 #include "mitkImageToItk.h"
16 
17 #include <itkRGBPixel.h>
18 
19 #include <vector>
20 
21 namespace mitk
22 {
23  TransferFunction::TransferFunction() : m_Min(0), m_Max(0)
24  {
25  m_ScalarOpacityFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
26  m_ColorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New();
27  m_GradientOpacityFunction = vtkSmartPointer<vtkPiecewiseFunction>::New();
28 
29  m_ScalarOpacityFunction->Initialize();
30  m_ScalarOpacityFunction->AddPoint(0, 1);
31 
32  m_GradientOpacityFunction->Initialize();
33  m_GradientOpacityFunction->AddPoint(0, 1);
34 
35  m_ColorTransferFunction->RemoveAllPoints();
36  m_ColorTransferFunction->SetColorSpaceToHSV();
37  m_ColorTransferFunction->AddRGBPoint(0, 1, 1, 1);
38  }
39 
41  : itk::Object(),
45  m_Min(other.m_Min),
46  m_Max(other.m_Max),
47  m_Histogram(other.m_Histogram),
48  m_ScalarOpacityPoints(other.m_ScalarOpacityPoints),
49  m_GradientOpacityPoints(other.m_GradientOpacityPoints),
50  m_RGBPoints(other.m_RGBPoints)
51  {
55  }
56 
59  {
60  if ((m_Min != other.m_Min) || (m_Max != other.m_Max))
61  return false;
62 
63  bool sizes = (m_ScalarOpacityFunction->GetSize() == other.m_ScalarOpacityFunction->GetSize()) &&
64  (m_GradientOpacityFunction->GetSize() == other.m_GradientOpacityFunction->GetSize()) &&
65  (m_ColorTransferFunction->GetSize() == other.m_ColorTransferFunction->GetSize());
66  if (sizes == false)
67  return false;
68 
69  for (int i = 0; i < m_ScalarOpacityFunction->GetSize(); i++)
70  {
71  double myVal[4];
72  double otherVal[4];
73  m_ScalarOpacityFunction->GetNodeValue(i, myVal);
74  other.m_ScalarOpacityFunction->GetNodeValue(i, otherVal);
75  bool equal = (myVal[0] == otherVal[0]) && (myVal[1] == otherVal[1]) && (myVal[2] == otherVal[2]) &&
76  (myVal[3] == otherVal[3]);
77  if (equal == false)
78  return false;
79  }
80  for (int i = 0; i < m_GradientOpacityFunction->GetSize(); i++)
81  {
82  double myVal[4];
83  double otherVal[4];
84  m_GradientOpacityFunction->GetNodeValue(i, myVal);
85  other.m_GradientOpacityFunction->GetNodeValue(i, otherVal);
86  bool equal = (myVal[0] == otherVal[0]) && (myVal[1] == otherVal[1]) && (myVal[2] == otherVal[2]) &&
87  (myVal[3] == otherVal[3]);
88  if (equal == false)
89  return false;
90  }
91  for (int i = 0; i < m_ColorTransferFunction->GetSize(); i++)
92  {
93  double myVal[6];
94  double otherVal[6];
95  m_ColorTransferFunction->GetNodeValue(i, myVal);
96  other.m_ColorTransferFunction->GetNodeValue(i, otherVal);
97  bool equal = (myVal[0] == otherVal[0]) // X
98  && (myVal[1] == otherVal[1]) // R
99  && (myVal[2] == otherVal[2]) // G
100  && (myVal[3] == otherVal[3]) // B
101  && (myVal[4] == otherVal[4]) // midpoint
102  && (myVal[5] == otherVal[5]); // sharpness
103  if (equal == false)
104  return false;
105  }
106  return true;
107  }
108 
110  {
111  m_ScalarOpacityFunction->RemoveAllPoints();
112  for (unsigned int i = 0; i <= points.size() - 1; i++)
113  {
114  this->AddScalarOpacityPoint(points[i].first, points[i].second);
115  }
116  }
117 
119  {
120  m_GradientOpacityFunction->RemoveAllPoints();
121  for (unsigned int i = 0; i <= points.size() - 1; i++)
122  {
123  this->AddGradientOpacityPoint(points[i].first, points[i].second);
124  }
125  }
126 
128  {
129  m_ColorTransferFunction->RemoveAllPoints();
130  for (unsigned int i = 0; i <= rgbpoints.size() - 1; i++)
131  {
132  this->AddRGBPoint(rgbpoints[i].first, rgbpoints[i].second[0], rgbpoints[i].second[1], rgbpoints[i].second[2]);
133  }
134  }
135 
136  void TransferFunction::AddScalarOpacityPoint(double x, double value) { m_ScalarOpacityFunction->AddPoint(x, value); }
137  void TransferFunction::AddGradientOpacityPoint(double x, double value)
138  {
139  m_GradientOpacityFunction->AddPoint(x, value);
140  }
141 
142  void TransferFunction::AddRGBPoint(double x, double r, double g, double b)
143  {
144  m_ColorTransferFunction->AddRGBPoint(x, r, g, b);
145  }
146 
148  {
149  // Retrieve data points from VTK transfer function and store them in a vector
150  m_ScalarOpacityPoints.clear();
151  double *data = m_ScalarOpacityFunction->GetDataPointer();
152  for (int i = 0; i < m_ScalarOpacityFunction->GetSize(); ++i)
153  {
154  m_ScalarOpacityPoints.push_back(std::make_pair(data[i * 2], data[i * 2 + 1]));
155  }
156 
157  return m_ScalarOpacityPoints;
158  }
159 
161  {
162  // Retrieve data points from VTK transfer function and store them in a vector
163  m_GradientOpacityPoints.clear();
164  double *data = m_GradientOpacityFunction->GetDataPointer();
165  for (int i = 0; i < m_GradientOpacityFunction->GetSize(); ++i)
166  {
167  m_GradientOpacityPoints.push_back(std::make_pair(data[i * 2], data[i * 2 + 1]));
168  }
169 
170  return m_GradientOpacityPoints;
171  }
172 
174  {
175  // Retrieve data points from VTK transfer function and store them in a vector
176  m_RGBPoints.clear();
177  double *data = m_ColorTransferFunction->GetDataPointer();
178  for (int i = 0; i < m_ColorTransferFunction->GetSize(); ++i)
179  {
180  double rgb[] = {data[i * 4 + 1], data[i * 4 + 2], data[i * 4 + 3]};
181  m_RGBPoints.push_back(std::make_pair(data[i * 4], rgb));
182  }
183 
184  return m_RGBPoints;
185  }
186 
187  int TransferFunction::RemoveScalarOpacityPoint(double x) { return m_ScalarOpacityFunction->RemovePoint(x); }
189  int TransferFunction::RemoveRGBPoint(double x) { return m_ColorTransferFunction->RemovePoint(x); }
193  void TransferFunction::InitializeByItkHistogram(const itk::Statistics::Histogram<double> *histogram)
194  {
195  m_Histogram = histogram;
196  m_Min = (int)GetHistogram()->GetBinMin(0, 0);
197  m_Max = (int)GetHistogram()->GetBinMax(0, GetHistogram()->Size() - 1);
198 
199  /*
200  m_ScalarOpacityFunction->Initialize();
201  m_ScalarOpacityFunction->AddPoint(m_Min,0.0);
202  m_ScalarOpacityFunction->AddPoint(0.0,0.0);
203  m_ScalarOpacityFunction->AddPoint(m_Max,1.0);
204  m_GradientOpacityFunction->Initialize();
205  m_GradientOpacityFunction->AddPoint(m_Min,0.0);
206  m_GradientOpacityFunction->AddPoint(0.0,1.0);
207  m_GradientOpacityFunction->AddPoint((m_Max*0.125),1.0);
208  m_GradientOpacityFunction->AddPoint((m_Max*0.2),1.0);
209  m_GradientOpacityFunction->AddPoint((m_Max*0.25),1.0);
210  m_GradientOpacityFunction->AddPoint(m_Max,1.0);
211  m_ColorTransferFunction->RemoveAllPoints();
212  m_ColorTransferFunction->AddRGBPoint(m_Min,1,0,0);
213  m_ColorTransferFunction->AddRGBPoint(m_Max,1,1,0);
214  m_ColorTransferFunction->SetColorSpaceToHSV();
215  MITK_INFO << "min/max in tf-c'tor:" << m_Min << "/" << m_Max << std::endl;
216  */
217  }
218 
220  {
222  histGen->SetImage(image);
223  histGen->SetSize(256);
224  histGen->ComputeHistogram();
225  m_Histogram = histGen->GetHistogram();
226  m_Min = (int)GetHistogram()->GetBinMin(0, 0);
227  m_Max = (int)GetHistogram()->GetBinMax(0, GetHistogram()->Size() - 1);
228  m_ScalarOpacityFunction->Initialize();
229  m_ScalarOpacityFunction->AddPoint(m_Min, 0.0);
230  m_ScalarOpacityFunction->AddPoint(0.0, 0.0);
231  m_ScalarOpacityFunction->AddPoint(m_Max, 1.0);
232  m_GradientOpacityFunction->Initialize();
233  m_GradientOpacityFunction->AddPoint(m_Min, 0.0);
234  m_GradientOpacityFunction->AddPoint(0.0, 1.0);
235  m_GradientOpacityFunction->AddPoint((m_Max * 0.125), 1.0);
236  m_GradientOpacityFunction->AddPoint((m_Max * 0.2), 1.0);
237  m_GradientOpacityFunction->AddPoint((m_Max * 0.25), 1.0);
238  m_GradientOpacityFunction->AddPoint(m_Max, 1.0);
239  m_ColorTransferFunction->RemoveAllPoints();
240  m_ColorTransferFunction->AddRGBPoint(m_Min, 1, 0, 0);
241  m_ColorTransferFunction->AddRGBPoint(m_Max, 1, 1, 0);
242  m_ColorTransferFunction->SetColorSpaceToHSV();
243  // MITK_INFO << "min/max in tf-c'tor:" << m_Min << "/" << m_Max << std::endl;
244  }
245 
247  {
249  histGen->SetImage(image);
250  histGen->SetSize(256);
251  histGen->ComputeHistogram();
252  m_Histogram = histGen->GetHistogram();
253  m_Min = (int)GetHistogram()->GetBinMin(0, 0);
254  m_Max = (int)GetHistogram()->GetBinMax(0, GetHistogram()->Size() - 1);
255  }
256 
257  void TransferFunction::PrintSelf(std::ostream &os, itk::Indent indent) const
258  {
259  os << indent << "ScalarOpacity: ";
260  m_ScalarOpacityFunction->PrintHeader(os, vtkIndent());
261  os << indent << "GradientOpacity: ";
262  m_GradientOpacityFunction->PrintHeader(os, vtkIndent());
263  os << indent << "ColorTransfer: ";
264  m_ColorTransferFunction->PrintHeader(os, vtkIndent());
265  os << indent << "Min: " << m_Min << ", Max: " << m_Max << std::endl;
266  }
267 
268  itk::LightObject::Pointer mitk::TransferFunction::InternalClone() const
269  {
270  itk::LightObject::Pointer result(new Self(*this));
271  result->UnRegister();
272  return result;
273  }
274 
275 } // namespace
void InitializeByMitkImage(const mitk::Image *image)
Initialize transfer function based on the histogram of an mitk::Image.
void ClearGradientOpacityPoints()
Removes all control points from the gradient opacity transfer function.
vtkSmartPointer< vtkColorTransferFunction > m_ColorTransferFunction
void SetGradientOpacityPoints(TransferFunction::ControlPoints points)
Insert control points and values into the gradient opacity transfer function.
itk::LightObject::Pointer InternalClone() const override
TransferFunction::RGBControlPoints & GetRGBPoints()
Get a copy of the color transfer function control-points.
vtkSmartPointer< vtkPiecewiseFunction > m_GradientOpacityFunction
void InitializeByItkHistogram(const itk::Statistics::Histogram< double > *histogram)
Initialize transfer function based on the specified histogram.
The TransferFunction class A wrapper class for VTK scalar opacity, gradient opacity, and color transfer functions.Holds a copy of each of the three standard VTK transfer functions (scalar opacity, gradient opacity, color) and provides an interface for manipulating their control points. Each original function can be retrieved by a Get() method.
DataCollection - Class to facilitate loading/accessing structured data.
void ClearScalarOpacityPoints()
Removes all control points from the scalar opacity transfer function.
void SetScalarOpacityPoints(TransferFunction::ControlPoints points)
Insert control points and values into the scalar opacity transfer function.
std::vector< std::pair< double, itk::RGBPixel< double > > > RGBControlPoints
void AddRGBPoint(double x, double r, double g, double b)
Add a single control point to the color opacity transfer function.
int RemoveScalarOpacityPoint(double x)
Remove the specified control point from the scalar opacity transfer function.
void SetRGBPoints(TransferFunction::RGBControlPoints rgbpoints)
Insert control points and RGB values into the color transfer function.
mitk::HistogramGenerator::HistogramType::ConstPointer m_Histogram
TransferFunction::ControlPoints & GetScalarOpacityPoints()
Get a copy of the scalar opacity transfer function control-points.
void ClearRGBPoints()
Removes all control points from the color transfer function.
static Pointer New()
Image class for storing images.
Definition: mitkImage.h:72
vtkSmartPointer< vtkPiecewiseFunction > m_ScalarOpacityFunction
int RemoveRGBPoint(double x)
Remove the specified control point from the color transfer function.
static Pointer New()
mitk::Image::Pointer image
void InitializeHistogram(const mitk::Image *image)
Initialize the internal histogram and min/max range based on the specified mitk::Image.
std::vector< std::pair< double, double > > ControlPoints
TransferFunction::ControlPoints & GetGradientOpacityPoints()
Get a copy of the gradient opacity transfer function control-points.
void AddScalarOpacityPoint(double x, double value)
Add a single control point to the scalar opacity transfer function.
virtual const HistogramGenerator::HistogramType * GetHistogram()
Get histogram used for transfer function initialization.
void AddGradientOpacityPoint(double x, double value)
Add a single control point to the gradient opacity transfer function.
void PrintSelf(std::ostream &os, itk::Indent indent) const override
int RemoveGradientOpacityPoint(double x)
Remove the specified control point from the gradient opacity transfer function.