Slicer 5.6
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
9template <typename pixel_t>
10typename itk::Image<pixel_t, 3>::Pointer
11preprocessLabelMap(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)