23 #include <itkCommand.h> 25 #include <itkImageSliceConstIteratorWithIndex.h> 55 if (iter->second ==
this)
69 for (
unsigned int timeStep = 0; timeStep <
m_WorkingImage->GetTimeSteps(); ++timeStep)
72 for (
unsigned int dim = 0; dim < 3; ++dim)
76 for (
unsigned int slice = 0; slice <
m_WorkingImage->GetDimension(dim); ++slice)
133 MITK_WARN <<
"Segmentation image has different image characteristics than reference image." << std::endl;
138 for (
unsigned int dim = 0; dim <
m_WorkingImage->GetDimension(); ++dim)
142 MITK_WARN <<
"original patient image does not match segmentation (different extent in dimension " << dim
143 <<
"), ignoring patient image" << std::endl;
151 unsigned int sliceDimension,
152 unsigned int sliceIndex,
153 unsigned int timeStep)
159 if (sliceDimension > 2)
169 unsigned int dim0(0);
170 unsigned int dim1(1);
173 switch (sliceDimension)
196 template <
typename PixelType>
200 unsigned int timeStep = options.
timeStep;
204 if (sliceDimension > 2)
209 unsigned int dim0(options.
dim0);
210 unsigned int dim1(options.
dim1);
212 std::vector<int> numberOfPixels;
213 unsigned int numberOfLabels =
m_WorkingImage->GetNumberOfLabels();
214 numberOfPixels.resize(numberOfLabels);
216 typedef itk::Image<PixelType, 2>
ImageType;
217 typedef itk::ImageRegionConstIteratorWithIndex<ImageType> IteratorType;
219 IteratorType iter(input, input->GetLargestPossibleRegion());
222 typename IteratorType::IndexType index;
224 while (!iter.IsAtEnd())
226 index = iter.GetIndex();
227 auto value =
static_cast<int>(iter.Get());
230 ++numberOfPixels[value];
234 for (
unsigned int label = 0; label < numberOfLabels; ++label)
240 template <
typename TPixel,
unsigned int VImageDimension>
242 unsigned int timeStep)
244 typedef itk::ImageSliceConstIteratorWithIndex<itk::Image<TPixel, VImageDimension>> IteratorType;
246 IteratorType iter(input, input->GetLargestPossibleRegion());
247 iter.SetFirstDirection(0);
248 iter.SetSecondDirection(1);
250 typename IteratorType::IndexType index;
255 std::vector<int> numberOfPixels;
256 unsigned int numberOfLabels =
m_WorkingImage->GetNumberOfLabels();
257 numberOfPixels.resize(numberOfLabels);
260 while (!iter.IsAtEnd())
262 while (!iter.IsAtEndOfSlice())
264 while (!iter.IsAtEndOfLine())
266 index = iter.GetIndex();
271 int value =
static_cast<unsigned int>(iter.Get());
274 ++numberOfPixels[value];
281 for (
unsigned int label = 0; label < numberOfLabels; ++label)
285 numberOfPixels.assign(numberOfLabels, 0);
291 unsigned int sliceIndex,
293 unsigned int timeStep)
301 if (sliceDimension > 2)
304 if (sliceIndex >= upperLimit - 1)
315 unsigned int lowerBound(0);
316 unsigned int upperBound(0);
319 for (lowerBound = sliceIndex - 1; ; --lowerBound)
335 for (upperBound = sliceIndex + 1; upperBound < upperLimit; ++upperBound)
352 extractor->SetTimeStep(timeStep);
353 extractor->SetResliceTransformByGeometry(
m_WorkingImage->GetTimeGeometry()->GetGeometryForTimeStep(timeStep));
354 extractor->SetVtkOutputRequest(
false);
357 extractor->SetWorldGeometry(currentPlane);
358 extractor->Modified();
364 catch (
const std::exception &e)
366 MITK_ERROR <<
"Error in 2D interpolation: " << e.what();
371 resultImage->DisconnectPipeline();
378 m_WorkingImage->GetSlicedGeometry()->WorldToIndex(origin, origin);
379 origin[sliceDimension] = lowerBound;
380 m_WorkingImage->GetSlicedGeometry()->IndexToWorld(origin, origin);
381 reslicePlane->SetOrigin(origin);
384 extractor->SetWorldGeometry(reslicePlane);
385 extractor->Modified();
391 catch (
const std::exception &e)
393 MITK_ERROR <<
"Error in 2D interpolation: " << e.what();
398 lowerMITKSlice->DisconnectPipeline();
401 m_WorkingImage->GetSlicedGeometry()->WorldToIndex(origin, origin);
402 origin[sliceDimension] = upperBound;
403 m_WorkingImage->GetSlicedGeometry()->IndexToWorld(origin, origin);
404 reslicePlane->SetOrigin(origin);
407 extractor->SetWorldGeometry(reslicePlane);
408 extractor->Modified();
414 catch (
const std::exception &e)
416 MITK_ERROR <<
"Error in 2D interpolation: " << e.what();
421 upperMITKSlice->DisconnectPipeline();
423 if (lowerMITKSlice.IsNull() || upperMITKSlice.IsNull())
435 mitk::SegmentationInterpolationAlgorithm::Pointer algorithm =
438 algorithm->Interpolate(
439 lowerMITKSlice.GetPointer(), lowerBound, upperMITKSlice.GetPointer(), upperBound, sliceIndex, 0, resultImage);
void ResetLabelCount()
Initializes the internal container with the number of voxels per label.
void SetWorkingImage(LabelSetImage *image)
Initialize with a whole volume.
Image::Pointer Interpolate(unsigned int sliceDimension, unsigned int sliceIndex, const mitk::PlaneGeometry *currentPlane, unsigned int timeStep)
Update after changing the whole working image.
itk::Image< unsigned char, 3 > ImageType
static SliceBasedInterpolationController * InterpolatorForImage(const Image *)
Find interpolator for a given image.
void SetChangedSlice(const Image *image, unsigned int sliceDimension, unsigned int sliceIndex, unsigned int timeStep)
Update after changing a single slice in the working image.
unsigned int sliceDimension
LabelCounterSliceTimeVectorType m_LabelCountInSlice
LabelSetImage::Pointer m_WorkingImage
~SliceBasedInterpolationController() override
Generates interpolations of 2D slices.
std::map< const Image *, SliceBasedInterpolationController * > InterpolatorMapType
static InterpolatorMapType s_InterpolatorForImage
unsigned int GetDimension() const
Get dimension of the image.
SliceBasedInterpolationController()
Image class for storing images.
void ScanImageITKProcessing(itk::Image< TPixel, VImageDimension > *, unsigned int timeStep)
internal scan of the whole image
mitk::Image::Pointer image
void ScanSliceITKProcessing(const itk::Image< PixelType, 2 > *, const SetChangedSliceOptions &options)
internal scan of a single slice
const Point3D GetOrigin() const
Get the origin, e.g. the upper-left corner of the plane.
#define AccessFixedDimensionByItk_1(mitkImage, itkImageTypeFunction, dimension, arg1)
LabelSetImage class for handling labels and layers in a segmentation session.
Describes a two-dimensional, rectangular plane.
void SetReferenceImage(Image *image)
Set a reference image (original patient image) - optional.
Image::Pointer m_ReferenceImage
Protected class of mitk::SliceBasedInterpolationController. Don't use (you shouldn't be able to do so...