Skip to content

Commit 1d529f0

Browse files
authored
Merge pull request InsightSoftwareConsortium#5730 from N-Dekker/Use-std-array-for-HessianRecursiveGaussianImageFilter-m_SmoothingFilters
RecursiveGaussian filters: Use `std::array` for m_SmoothingFilters, remove GaussianFiltersArray alias
2 parents 5d4f27e + cefbf03 commit 1d529f0

File tree

5 files changed

+44
-23
lines changed

5 files changed

+44
-23
lines changed

Modules/Core/Common/include/itkPrintHelper.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#ifndef itkPrintHelper_h
2020
#define itkPrintHelper_h
2121

22+
#include <array>
2223
#include <iostream>
2324
#include <iterator>
2425
#include <list>
@@ -66,6 +67,22 @@ operator<<(std::ostream & os, const std::list<T> & l)
6667
return os << l.back() << ']';
6768
}
6869

70+
template <typename T, size_t VLength>
71+
std::ostream &
72+
operator<<(std::ostream & os, [[maybe_unused]] const std::array<T, VLength> & container)
73+
{
74+
if constexpr (VLength == 0)
75+
{
76+
return os << "()";
77+
}
78+
else
79+
{
80+
os << '(';
81+
std::copy(container.cbegin(), std::prev(container.cend()), std::ostream_iterator<T>(os, ", "));
82+
return os << container.back() << ')';
83+
}
84+
}
85+
6986
// Stream insertion operator for C-style arrays, excluding character arrays (strings)
7087
template <typename T, size_t VLength, typename = std::enable_if_t<!std::is_same_v<T, char>>>
7188
std::ostream &

Modules/Filtering/ImageFeature/include/itkHessianRecursiveGaussianImageFilter.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "itkImage.h"
2424
#include "itkSymmetricSecondRankTensor.h"
2525
#include "itkPixelTraits.h"
26+
#include <array>
2627

2728
namespace itk
2829
{
@@ -92,7 +93,11 @@ class ITK_TEMPLATE_EXPORT HessianRecursiveGaussianImageFilter : public ImageToIm
9293

9394
/** Pointer to a gaussian filter. */
9495
using GaussianFilterPointer = typename GaussianFilterType::Pointer;
95-
using GaussianFiltersArray = std::vector<GaussianFilterPointer>;
96+
97+
#ifndef ITK_FUTURE_LEGACY_REMOVE
98+
using GaussianFiltersArray [[deprecated("This type alias is deprecated from ITK 6!")]] =
99+
std::vector<GaussianFilterPointer>;
100+
#endif
96101

97102
/** Pointer to a derivative filter. */
98103
using DerivativeFilterAPointer = typename DerivativeFilterAType::Pointer;
@@ -154,10 +159,10 @@ class ITK_TEMPLATE_EXPORT HessianRecursiveGaussianImageFilter : public ImageToIm
154159
EnlargeOutputRequestedRegion(DataObject * output) override;
155160

156161
private:
157-
GaussianFiltersArray m_SmoothingFilters{};
158-
DerivativeFilterAPointer m_DerivativeFilterA{};
159-
DerivativeFilterBPointer m_DerivativeFilterB{};
160-
OutputImageAdaptorPointer m_ImageAdaptor{};
162+
std::array<GaussianFilterPointer, NumberOfSmoothingFilters> m_SmoothingFilters{};
163+
DerivativeFilterAPointer m_DerivativeFilterA{};
164+
DerivativeFilterBPointer m_DerivativeFilterB{};
165+
OutputImageAdaptorPointer m_ImageAdaptor{};
161166

162167
/** Normalize the image across scale space */
163168
bool m_NormalizeAcrossScale{};

Modules/Filtering/ImageFeature/include/itkHessianRecursiveGaussianImageFilter.hxx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "itkImageRegionIteratorWithIndex.h"
2222
#include "itkProgressAccumulator.h"
23+
#include <algorithm> // For generate.
2324

2425
namespace itk
2526
{
@@ -31,15 +32,14 @@ HessianRecursiveGaussianImageFilter<TInputImage, TOutputImage>::HessianRecursive
3132
// note: this is not constant to suppress a warning
3233
const unsigned int numberOfSmoothingFilters = NumberOfSmoothingFilters;
3334

34-
for (unsigned int i = 0; i < numberOfSmoothingFilters; ++i)
35-
{
35+
std::generate(m_SmoothingFilters.begin(), m_SmoothingFilters.end(), [this] {
3636
const GaussianFilterPointer filter = GaussianFilterType::New();
3737
filter->SetOrder(GaussianOrderEnum::ZeroOrder);
3838
filter->SetNormalizeAcrossScale(m_NormalizeAcrossScale);
3939
filter->InPlaceOn();
4040
filter->ReleaseDataFlagOn();
41-
m_SmoothingFilters.push_back(filter);
42-
}
41+
return filter;
42+
});
4343

4444
m_DerivativeFilterA = DerivativeFilterAType::New();
4545
m_DerivativeFilterB = DerivativeFilterBType::New();

Modules/Filtering/ImageGradient/include/itkGradientRecursiveGaussianImageFilter.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include "itkProgressAccumulator.h"
2727
#include "itkImageRegionIterator.h"
2828
#include "itkVectorImage.h"
29-
#include <vector>
29+
#include <array>
3030

3131
namespace itk
3232
{
@@ -246,9 +246,9 @@ class ITK_TEMPLATE_EXPORT GradientRecursiveGaussianImageFilter : public ImageToI
246246
}
247247

248248

249-
std::vector<GaussianFilterPointer> m_SmoothingFilters{};
250-
DerivativeFilterPointer m_DerivativeFilter{};
251-
OutputImageAdaptorPointer m_ImageAdaptor{};
249+
std::array<GaussianFilterPointer, ImageDimension - 1> m_SmoothingFilters{};
250+
DerivativeFilterPointer m_DerivativeFilter{};
251+
OutputImageAdaptorPointer m_ImageAdaptor{};
252252

253253
/** Normalize the image across scale space */
254254
bool m_NormalizeAcrossScale{};

Modules/Filtering/ImageGradient/include/itkGradientRecursiveGaussianImageFilter.hxx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "itkImageRegionIterator.h"
2323
#include "itkImageRegionConstIterator.h"
2424
#include "itkPrintHelper.h"
25+
#include <algorithm> // For generate.
2526

2627
namespace itk
2728
{
@@ -34,16 +35,14 @@ GradientRecursiveGaussianImageFilter<TInputImage, TOutputImage>::GradientRecursi
3435
const unsigned int imageDimensionMinus1 = ImageDimension - 1;
3536
if constexpr (ImageDimension > 1)
3637
{
37-
m_SmoothingFilters.resize(imageDimensionMinus1);
38-
39-
for (unsigned int i = 0; i != imageDimensionMinus1; ++i)
40-
{
41-
m_SmoothingFilters[i] = GaussianFilterType::New();
42-
m_SmoothingFilters[i]->SetOrder(GaussianOrderEnum::ZeroOrder);
43-
m_SmoothingFilters[i]->SetNormalizeAcrossScale(m_NormalizeAcrossScale);
44-
m_SmoothingFilters[i]->InPlaceOn();
45-
m_SmoothingFilters[i]->ReleaseDataFlagOn();
46-
}
38+
std::generate(m_SmoothingFilters.begin(), m_SmoothingFilters.end(), [this] {
39+
const GaussianFilterPointer filter = GaussianFilterType::New();
40+
filter->SetOrder(GaussianOrderEnum::ZeroOrder);
41+
filter->SetNormalizeAcrossScale(m_NormalizeAcrossScale);
42+
filter->InPlaceOn();
43+
filter->ReleaseDataFlagOn();
44+
return filter;
45+
});
4746
}
4847

4948
m_DerivativeFilter = DerivativeFilterType::New();

0 commit comments

Comments
 (0)