Slicer 5.11
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
labelMapPreprocessor.h
Go to the documentation of this file.
1#ifndef LABELMAPPREPROCESSOR_H
2#define LABELMAPPREPROCESSOR_H
3
4#include "itkImage.h"
5#include "itkImageRegionIterator.h"
6
7#include <algorithm>
8#include <iostream>
9
10template <typename pixel_t>
11typename itk::Image<pixel_t, 3>::Pointer preprocessLabelMap(typename itk::Image<pixel_t, 3>::Pointer originalLabelMap, pixel_t desiredLabel)
12{
13 /*
14 If there is a single non-zero label in the originalLabelMap, then
15 use that as the label map to feed the segmentor.
16
17 If originalLabelMap contains multiple labels, extract
18 desiredLabel, forms a new label map containing only desiredLabel
19 to feed the segmentor.
20
21 If originalLabelMap contains multiple labels, but do NOT contain
22 desiredLabel, then use all the non-zero labels as a single label
23 and output label value is desiredLabel.
24
25 1. count number of different labels in the originalLabelMap
26
27 2. if #= 1, return it
28
29 3. if #= 2, if desiredLabel is not there, then return originalLabelMap itself
30
31 4. if #= 2, go thru originalLabelMap and fill in a new label map
32 with 1 where the label matches.
33
34
35 */
36
37 typedef itk::Image<pixel_t, 3> image_t;
38
39 typedef itk::ImageRegionIterator<image_t> imageRegionIterator_t;
40
41 // 1.
42 imageRegionIterator_t iter(originalLabelMap, originalLabelMap->GetLargestPossibleRegion());
43 iter.GoToBegin();
44
45 typename image_t::SizeType sz = originalLabelMap->GetLargestPossibleRegion().GetSize();
46
47 std::vector<pixel_t> uniqueLabels(sz[0] * sz[1] * sz[2]);
48 long i = 0;
49 for (; !iter.IsAtEnd(); ++iter)
50 {
51 uniqueLabels[i++] = iter.Get();
52 }
53
54 std::sort(uniqueLabels.begin(), uniqueLabels.end());
55 typename std::vector<pixel_t>::iterator itl = std::unique(uniqueLabels.begin(), uniqueLabels.end());
56 uniqueLabels.resize(itl - uniqueLabels.begin());
57
58 if (uniqueLabels[0] != 0)
59 {
60 std::cerr << "Error: least label is not 0? no background?\n";
61 raise(SIGABRT);
62 }
63
64 short numOfLabels = uniqueLabels.size() - 1; // 0 not count
65
66 // 2.
67 if (1 == numOfLabels)
68 {
69 return originalLabelMap;
70 }
71
72 // 3.
73 if (!std::binary_search(uniqueLabels.begin(), uniqueLabels.end(), desiredLabel))
74 {
75 return originalLabelMap;
76 }
77
78 // 4.
79 typename image_t::Pointer newLabelMap = image_t::New();
80 newLabelMap->CopyInformation(originalLabelMap);
81 newLabelMap->SetRegions(originalLabelMap->GetLargestPossibleRegion());
82 newLabelMap->Allocate();
83 newLabelMap->FillBuffer(0);
84
85 imageRegionIterator_t iterNew(newLabelMap, newLabelMap->GetLargestPossibleRegion());
86 iterNew.GoToBegin();
87 iter.GoToBegin();
88 for (; !iter.IsAtEnd(); ++iter, ++iterNew)
89 {
90 if (iter.Get() == desiredLabel)
91 {
92 iterNew.Set(1);
93 }
94 }
95
96 return newLabelMap;
97}
98
99#endif
itk::Image< pixel_t, 3 >::Pointer preprocessLabelMap(typename itk::Image< pixel_t, 3 >::Pointer originalLabelMap, pixel_t desiredLabel)