Skip to content

Commit a381139

Browse files
committed
ENH: Add template parameter to specify the mask image type
Add 3rd template argument to the CoocurrenceTextureFeaturesImageFilter and the RunLengthTextureFeaturesImageFilter to allow the specification of the Mask image type. Because the mask image essentially contains boolean values using an unsigned byte type, maybe more memory efficient if the primary input image is a larger pixel type. Also it is sometime a convention to only use unsigned byte pixel for mask images.
1 parent 624000d commit a381139

6 files changed

+79
-69
lines changed

include/itkCoocurrenceTextureFeaturesImageFilter.h

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ namespace Statistics
8282
**/
8383

8484
template< typename TInputImage,
85-
typename TOutputImage>
85+
typename TOutputImage,
86+
typename TMaskImage = TInputImage>
8687
class ITK_TEMPLATE_EXPORT CoocurrenceTextureFeaturesImageFilter:public ImageToImageFilter< TInputImage, TOutputImage >
8788
{
8889
public:
@@ -100,7 +101,7 @@ class ITK_TEMPLATE_EXPORT CoocurrenceTextureFeaturesImageFilter:public ImageToIm
100101

101102
typedef TInputImage InputImageType;
102103
typedef TOutputImage OutputImageType;
103-
typedef TInputImage MaskImageType;
104+
typedef TMaskImage MaskImageType;
104105
typedef TInputImage DigitizedImageType;
105106

106107
typedef typename InputImageType::PixelType PixelType;
@@ -128,10 +129,10 @@ class ITK_TEMPLATE_EXPORT CoocurrenceTextureFeaturesImageFilter:public ImageToIm
128129
itkGetConstMacro(NeighborhoodRadius, NeighborhoodRadiusType);
129130

130131
/** Method to set the mask image */
131-
itkSetInputMacro(MaskImage, InputImageType);
132+
itkSetInputMacro(MaskImage, MaskImageType);
132133

133134
/** Method to get the mask image */
134-
itkGetInputMacro(MaskImage, InputImageType);
135+
itkGetInputMacro(MaskImage, MaskImageType);
135136

136137

137138
/** Specify the default number of bins per axis */
@@ -182,8 +183,8 @@ class ITK_TEMPLATE_EXPORT CoocurrenceTextureFeaturesImageFilter:public ImageToIm
182183
* Set the pixel value of the mask that should be considered "inside" the
183184
* object. Defaults to 1.
184185
*/
185-
itkSetMacro( InsidePixelValue, PixelType );
186-
itkGetConstMacro( InsidePixelValue, PixelType );
186+
itkSetMacro( InsidePixelValue, MaskPixelType );
187+
itkGetConstMacro( InsidePixelValue, MaskPixelType );
187188

188189
/** Set the calculator to normalize the histogram (divide all bins by the
189190
total frequency). Normalization is off by default. */
@@ -234,7 +235,7 @@ class ITK_TEMPLATE_EXPORT CoocurrenceTextureFeaturesImageFilter:public ImageToIm
234235
unsigned int m_NumberOfBinsPerAxis;
235236
PixelType m_HistogramMinimum;
236237
PixelType m_HistogramMaximum;
237-
PixelType m_InsidePixelValue;
238+
MaskPixelType m_InsidePixelValue;
238239
bool m_Normalize;
239240

240241

include/itkCoocurrenceTextureFeaturesImageFilter.hxx

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ namespace itk
2828
{
2929
namespace Statistics
3030
{
31-
template< typename TInputImage, typename TOutputImage>
32-
CoocurrenceTextureFeaturesImageFilter< TInputImage, TOutputImage >
31+
template< typename TInputImage, typename TOutputImage, typename TMaskImage>
32+
CoocurrenceTextureFeaturesImageFilter< TInputImage, TOutputImage, TMaskImage>
3333
::CoocurrenceTextureFeaturesImageFilter() :
3434
m_NumberOfBinsPerAxis( itkGetStaticConstMacro( DefaultBinsPerAxis ) ),
3535
m_HistogramMinimum( NumericTraits<PixelType>::NonpositiveMin() ),
3636
m_HistogramMaximum( NumericTraits<PixelType>::max() ),
37-
m_InsidePixelValue( NumericTraits<PixelType>::OneValue() )
37+
m_InsidePixelValue( NumericTraits<MaskPixelType>::OneValue() )
3838
{
3939
this->SetNumberOfRequiredInputs( 1 );
4040
this->SetNumberOfRequiredOutputs( 1 );
@@ -70,19 +70,19 @@ CoocurrenceTextureFeaturesImageFilter< TInputImage, TOutputImage >
7070
this->m_Normalize = false;
7171
}
7272

73-
template<typename TInputImage, typename TOutputImage>
73+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
7474
void
75-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
75+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
7676
::SetOffset( const OffsetType offset )
7777
{
7878
OffsetVectorPointer offsetVector = OffsetVector::New();
7979
offsetVector->push_back( offset );
8080
this->SetOffsets( offsetVector );
8181
}
8282

83-
template<typename TInputImage, typename TOutputImage>
83+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
8484
void
85-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
85+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
8686
::BeforeThreadedGenerateData()
8787
{
8888

@@ -100,8 +100,8 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
100100
typename FilterType::Pointer filter = FilterType::New();
101101
if (this->GetMaskImage() != ITK_NULLPTR)
102102
{
103-
typename TInputImage::Pointer mask = MaskImageType::New();
104-
mask->Graft(const_cast<TInputImage *>(this->GetMaskImage()));
103+
typename TMaskImage::Pointer mask = MaskImageType::New();
104+
mask->Graft(const_cast<TMaskImage *>(this->GetMaskImage()));
105105
filter->SetInput1(mask);
106106
}
107107
else
@@ -116,19 +116,19 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
116116
m_DigitizedInputImage = filter->GetOutput();
117117
}
118118

119-
template<typename TInputImage, typename TOutputImage>
119+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
120120
void
121-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
121+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
122122
::AfterThreadedGenerateData()
123123
{
124124
// Free internal image
125125
this->m_DigitizedInputImage = ITK_NULLPTR;
126126
}
127127

128128

129-
template<typename TInputImage, typename TOutputImage>
129+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
130130
void
131-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
131+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
132132
::ThreadedGenerateData(const OutputRegionType & outputRegionForThread,
133133
ThreadIdType threadId)
134134
{
@@ -250,9 +250,9 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
250250
}
251251
}
252252

253-
template<typename TInputImage, typename TOutputImage>
253+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
254254
void
255-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
255+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
256256
::GenerateOutputInformation()
257257
{
258258
// Call superclass's version
@@ -269,9 +269,9 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
269269
}
270270
}
271271

272-
template<typename TInputImage, typename TOutputImage>
272+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
273273
bool
274-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
274+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
275275
::IsInsideNeighborhood(const OffsetType &iteratedOffset)
276276
{
277277
bool insideNeighborhood = true;
@@ -287,9 +287,9 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
287287
return insideNeighborhood;
288288
}
289289

290-
template<typename TInputImage, typename TOutputImage>
290+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
291291
void
292-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
292+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
293293
::ComputeFeatures( const vnl_matrix<unsigned int> &hist, const unsigned int totalNumberOfFreq,
294294
typename TOutputImage::PixelType &outputPixel)
295295
{
@@ -364,9 +364,9 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
364364
outputPixel[7] = haralickCorrelation;
365365
}
366366

367-
template<typename TInputImage, typename TOutputImage>
367+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
368368
void
369-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
369+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
370370
::ComputeMeansAndVariances(const vnl_matrix<unsigned int> &hist,
371371
const unsigned int totalNumberOfFreq,
372372
double & pixelMean,
@@ -441,9 +441,9 @@ CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
441441
delete[] marginalSums;
442442
}
443443

444-
template<typename TInputImage, typename TOutputImage>
444+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
445445
void
446-
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage>
446+
CoocurrenceTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
447447
::PrintSelf(std::ostream & os, Indent indent) const
448448
{
449449

include/itkRunLengthTextureFeaturesImageFilter.h

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ namespace Statistics
9595
*/
9696

9797
template< typename TInputImage,
98-
typename TOutputImage>
99-
class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter:public ImageToImageFilter< TInputImage, TOutputImage >
98+
typename TOutputImage,
99+
typename TMaskImage = TInputImage>
100+
class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter
101+
: public ImageToImageFilter< TInputImage, TOutputImage >
100102
{
101103
public:
102104
/** Standard typedefs */
@@ -113,10 +115,11 @@ class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter:public ImageToImag
113115

114116
typedef TInputImage InputImageType;
115117
typedef TOutputImage OutputImageType;
116-
typedef TInputImage MaskImageType;
118+
typedef TMaskImage MaskImageType;
117119
typedef TInputImage DigitizedImageType;
118120

119121
typedef typename InputImageType::PixelType PixelType;
122+
typedef typename MaskImageType::PixelType MaskPixelType;
120123
typedef typename InputImageType::IndexType IndexType;
121124
typedef typename InputImageType::PointType PointType;
122125

@@ -140,10 +143,10 @@ class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter:public ImageToImag
140143
itkGetConstMacro(NeighborhoodRadius, NeighborhoodRadiusType);
141144

142145
/** Method to set the mask image */
143-
itkSetInputMacro(MaskImage, InputImageType);
146+
itkSetInputMacro(MaskImage, MaskImageType);
144147

145148
/** Method to get the mask image */
146-
itkGetInputMacro(MaskImage, InputImageType);
149+
itkGetInputMacro(MaskImage, MaskImageType);
147150

148151

149152
/** Specify the default number of bins per axis */
@@ -211,8 +214,8 @@ class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter:public ImageToImag
211214
* Set the pixel value of the mask that should be considered "inside" the
212215
* object. Defaults to 1.
213216
*/
214-
itkSetMacro( InsidePixelValue, PixelType );
215-
itkGetConstMacro( InsidePixelValue, PixelType );
217+
itkSetMacro( InsidePixelValue, MaskPixelType );
218+
itkGetConstMacro( InsidePixelValue, MaskPixelType );
216219

217220
typedef typename OutputImageType::PixelType OutputPixelType;
218221
typedef typename NumericTraits< OutputPixelType >::ScalarRealType OutputRealType;
@@ -256,7 +259,7 @@ class ITK_TEMPLATE_EXPORT RunLengthTextureFeaturesImageFilter:public ImageToImag
256259
PixelType m_HistogramValueMaximum;
257260
RealType m_HistogramDistanceMinimum;
258261
RealType m_HistogramDistanceMaximum;
259-
PixelType m_InsidePixelValue;
262+
MaskPixelType m_InsidePixelValue;
260263
typename TInputImage::SpacingType m_Spacing;
261264
};
262265
} // end of namespace Statistics

include/itkRunLengthTextureFeaturesImageFilter.hxx

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,15 @@ namespace itk
2828
{
2929
namespace Statistics
3030
{
31-
template< typename TInputImage, typename TOutputImage>
32-
RunLengthTextureFeaturesImageFilter< TInputImage, TOutputImage >
31+
template< typename TInputImage, typename TOutputImage, typename TMaskImage>
32+
RunLengthTextureFeaturesImageFilter< TInputImage, TOutputImage, TMaskImage>
3333
::RunLengthTextureFeaturesImageFilter() :
3434
m_NumberOfBinsPerAxis( itkGetStaticConstMacro( DefaultBinsPerAxis ) ),
3535
m_HistogramValueMinimum( NumericTraits<PixelType>::NonpositiveMin() ),
3636
m_HistogramValueMaximum( NumericTraits<PixelType>::max() ),
3737
m_HistogramDistanceMinimum( NumericTraits<RealType>::ZeroValue() ),
3838
m_HistogramDistanceMaximum( NumericTraits<RealType>::max() ),
39-
m_InsidePixelValue( NumericTraits<PixelType>::OneValue() ),
39+
m_InsidePixelValue( NumericTraits<MaskPixelType>::OneValue() ),
4040
m_Spacing( 1.0 )
4141
{
4242
this->SetNumberOfRequiredInputs( 1 );
@@ -71,19 +71,19 @@ RunLengthTextureFeaturesImageFilter< TInputImage, TOutputImage >
7171
this->m_NeighborhoodRadius = nhood.GetRadius( );
7272
}
7373

74-
template<typename TInputImage, typename TOutputImage>
74+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
7575
void
76-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
76+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
7777
::SetOffset( const OffsetType offset )
7878
{
7979
OffsetVectorPointer offsetVector = OffsetVector::New();
8080
offsetVector->push_back( offset );
8181
this->SetOffsets( offsetVector );
8282
}
8383

84-
template<typename TInputImage, typename TOutputImage>
84+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
8585
void
86-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
86+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
8787
::BeforeThreadedGenerateData()
8888
{
8989

@@ -101,8 +101,8 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
101101
typename FilterType::Pointer filter = FilterType::New();
102102
if (this->GetMaskImage() != ITK_NULLPTR)
103103
{
104-
typename TInputImage::Pointer mask = MaskImageType::New();
105-
mask->Graft(const_cast<TInputImage *>(this->GetMaskImage()));
104+
typename TMaskImage::Pointer mask = MaskImageType::New();
105+
mask->Graft(const_cast<TMaskImage *>(this->GetMaskImage()));
106106
filter->SetInput1(mask);
107107
}
108108
else
@@ -120,19 +120,19 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
120120
}
121121

122122

123-
template<typename TInputImage, typename TOutputImage>
123+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
124124
void
125-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
125+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
126126
::AfterThreadedGenerateData()
127127
{
128128
// free internal image
129129
this->m_DigitizedInputImage = ITK_NULLPTR;
130130
}
131131

132132

133-
template<typename TInputImage, typename TOutputImage>
133+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
134134
void
135-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
135+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
136136
::ThreadedGenerateData(const OutputRegionType & outputRegionForThread,
137137
ThreadIdType threadId)
138138
{
@@ -295,9 +295,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
295295

296296
}
297297

298-
template<typename TInputImage, typename TOutputImage>
298+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
299299
void
300-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
300+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
301301
::GenerateOutputInformation()
302302
{
303303
Superclass::GenerateOutputInformation();
@@ -313,9 +313,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
313313
}
314314
}
315315

316-
template<typename TInputImage, typename TOutputImage>
316+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
317317
void
318-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
318+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
319319
::NormalizeOffsetDirection(OffsetType &offset)
320320
{
321321
itkDebugMacro("old offset = " << offset << std::endl);
@@ -337,9 +337,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
337337
itkDebugMacro("new offset = " << offset << std::endl);
338338
}
339339

340-
template<typename TInputImage, typename TOutputImage>
340+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
341341
bool
342-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
342+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
343343
::IsInsideNeighborhood(const OffsetType &iteratedOffset)
344344
{
345345
bool insideNeighborhood = true;
@@ -355,9 +355,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
355355
return insideNeighborhood;
356356
}
357357

358-
template<typename TInputImage, typename TOutputImage>
358+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
359359
void
360-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
360+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
361361
::IncreaseHistogram(vnl_matrix<unsigned int> &histogram, unsigned int &totalNumberOfRuns,
362362
const PixelType &currentInNeighborhoodPixelIntensity,
363363
const OffsetType &offset, const unsigned int &pixelDistance)
@@ -377,9 +377,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
377377
}
378378
}
379379

380-
template<typename TInputImage, typename TOutputImage>
380+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
381381
void
382-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
382+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
383383
::ComputeFeatures( vnl_matrix<unsigned int> &histogram, const unsigned int &totalNumberOfRuns,
384384
typename TOutputImage::PixelType &outputPixel)
385385
{
@@ -464,9 +464,9 @@ RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
464464

465465
}
466466

467-
template<typename TInputImage, typename TOutputImage>
467+
template<typename TInputImage, typename TOutputImage, typename TMaskImage>
468468
void
469-
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage>
469+
RunLengthTextureFeaturesImageFilter<TInputImage, TOutputImage, TMaskImage>
470470
::PrintSelf(std::ostream & os, Indent indent) const
471471
{
472472
Superclass::PrintSelf( os, indent );

0 commit comments

Comments
 (0)