Skip to content

Commit 3915420

Browse files
authored
Merge pull request #6254 from hjmjohnson/rgbgibbs-shadow-fix
BUG: Remove shadow declarations of NumberOfClasses in RGBGibbsPriorFilter
2 parents 527c4d0 + c9e5538 commit 3915420

4 files changed

Lines changed: 114 additions & 48 deletions

File tree

Modules/Segmentation/MarkovRandomFieldsClassifiers/include/itkRGBGibbsPriorFilter.h

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -130,45 +130,6 @@ class ITK_TEMPLATE_EXPORT RGBGibbsPriorFilter : public MRFImageFilter<TInputImag
130130
void
131131
SetClassifier(typename ClassifierType::Pointer ptrToClassifier);
132132

133-
/** Set the number of classes. */
134-
void
135-
SetNumberOfClasses(const unsigned int numberOfClasses) override
136-
{
137-
itkDebugMacro("setting NumberOfClasses to " << numberOfClasses);
138-
if (this->m_NumberOfClasses != numberOfClasses)
139-
{
140-
this->m_NumberOfClasses = numberOfClasses;
141-
this->Modified();
142-
}
143-
}
144-
145-
/** Get the number of classes. */
146-
[[nodiscard]] unsigned int
147-
GetNumberOfClasses() const override
148-
{
149-
return this->m_NumberOfClasses;
150-
}
151-
152-
/** Set/Get the number of iteration of the Iterated Conditional Mode
153-
* (ICM) algorithm. A default value is set at 50 iterations. */
154-
void
155-
SetMaximumNumberOfIterations(const unsigned int numberOfIterations) override
156-
{
157-
itkDebugMacro("setting MaximumNumberOfIterations to " << numberOfIterations);
158-
if (this->m_MaximumNumberOfIterations != numberOfIterations)
159-
{
160-
this->m_MaximumNumberOfIterations = numberOfIterations;
161-
this->Modified();
162-
}
163-
}
164-
165-
/** Get the number of iterations of the Iterated Conditional Mode
166-
* (ICM) algorithm. */
167-
[[nodiscard]] unsigned int
168-
GetMaximumNumberOfIterations() const override
169-
{
170-
return this->m_MaximumNumberOfIterations;
171-
}
172133

173134
/** Set/Get the threshold for the object size. */
174135
/** @ITKStartGrouping */
@@ -252,12 +213,6 @@ class ITK_TEMPLATE_EXPORT RGBGibbsPriorFilter : public MRFImageFilter<TInputImag
252213
/** Output. */
253214
LabelledImageType m_LabelledImage{};
254215

255-
/** Number of classes that need to be classified. */
256-
unsigned int m_NumberOfClasses{ 0 };
257-
258-
/** Maximum number of iterations. */
259-
unsigned int m_MaximumNumberOfIterations{ 10 };
260-
261216
typename ClassifierType::Pointer m_ClassifierPtr{};
262217

263218
/** Threshold for the existence of a boundary. */

Modules/Segmentation/MarkovRandomFieldsClassifiers/include/itkRGBGibbsPriorFilter.hxx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ RGBGibbsPriorFilter<TInputImage, TClassifiedImage>::RGBGibbsPriorFilter()
4141

4242
{
4343
m_StartPoint.Fill(0);
44+
this->SetMaximumNumberOfIterations(10);
4445
}
4546

4647
template <typename TInputImage, typename TClassifiedImage>
@@ -165,7 +166,7 @@ void
165166
RGBGibbsPriorFilter<TInputImage, TClassifiedImage>::SetClassifier(typename ClassifierType::Pointer ptrToClassifier)
166167
{
167168
m_ClassifierPtr = ptrToClassifier;
168-
m_ClassifierPtr->SetNumberOfClasses(m_NumberOfClasses);
169+
m_ClassifierPtr->SetNumberOfClasses(this->GetNumberOfClasses());
169170
}
170171

171172
template <typename TInputImage, typename TClassifiedImage>
@@ -683,8 +684,6 @@ RGBGibbsPriorFilter<TInputImage, TClassifiedImage>::PrintSelf(std::ostream & os,
683684
{
684685
Superclass::PrintSelf(os, indent);
685686

686-
os << indent << "NumberOfClasses: " << m_NumberOfClasses << std::endl;
687-
os << indent << "MaximumNumberOfIterations: " << m_MaximumNumberOfIterations << std::endl;
688687
os << indent << "ObjectThreshold: " << m_ObjectThreshold << std::endl;
689688
os << indent << "BoundaryGradient: " << m_BoundaryGradient << std::endl;
690689
os << indent << "CliqueWeight_1: " << m_CliqueWeight_1 << std::endl;

Modules/Segmentation/MarkovRandomFieldsClassifiers/test/CMakeLists.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,11 @@ itk_add_test(
2121
ITKMarkovRandomFieldsClassifiersTestDriver
2222
itkRGBGibbsPriorFilterTest
2323
)
24+
25+
set(ITKMarkovRandomFieldsClassifiersGTests itkRGBGibbsPriorFilterGTest.cxx)
26+
27+
creategoogletestdriver(
28+
ITKMarkovRandomFieldsClassifiers
29+
"${ITKMarkovRandomFieldsClassifiers-Test_LIBRARIES}"
30+
"${ITKMarkovRandomFieldsClassifiersGTests}"
31+
)
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*=========================================================================
2+
*
3+
* Copyright NumFOCUS
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* https://www.apache.org/licenses/LICENSE-2.0.txt
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*=========================================================================*/
18+
19+
#include "itkGTest.h"
20+
#include "itkMRFImageFilter.h"
21+
#include "itkRGBGibbsPriorFilter.h"
22+
#include "itkImage.h"
23+
#include "itkVector.h"
24+
25+
namespace
26+
{
27+
constexpr unsigned int NumberOfBands{ 1 };
28+
constexpr unsigned int ImageDimension{ 3 };
29+
using PixelType = itk::Vector<unsigned short, NumberOfBands>;
30+
using InputImageType = itk::Image<PixelType, ImageDimension>;
31+
using LabelImageType = itk::Image<unsigned short, ImageDimension>;
32+
using BaseFilterType = itk::MRFImageFilter<InputImageType, LabelImageType>;
33+
using GibbsFilterType = itk::RGBGibbsPriorFilter<InputImageType, LabelImageType>;
34+
} // namespace
35+
36+
TEST(RGBGibbsPriorFilter, DefaultNumberOfClassesIsZero)
37+
{
38+
auto filter = GibbsFilterType::New();
39+
EXPECT_EQ(filter->GetNumberOfClasses(), 0u);
40+
}
41+
42+
TEST(RGBGibbsPriorFilter, DefaultMaximumNumberOfIterationsIsTen)
43+
{
44+
auto filter = GibbsFilterType::New();
45+
EXPECT_EQ(filter->GetMaximumNumberOfIterations(), 10u);
46+
}
47+
48+
TEST(MRFImageFilter, DefaultMaximumNumberOfIterationsIsFifty)
49+
{
50+
auto filter = BaseFilterType::New();
51+
EXPECT_EQ(filter->GetMaximumNumberOfIterations(), 50u);
52+
}
53+
54+
TEST(RGBGibbsPriorFilter, SetGetNumberOfClassesViaSubclass)
55+
{
56+
auto filter = GibbsFilterType::New();
57+
filter->SetNumberOfClasses(7u);
58+
EXPECT_EQ(filter->GetNumberOfClasses(), 7u);
59+
}
60+
61+
TEST(RGBGibbsPriorFilter, SetGetMaximumNumberOfIterationsViaSubclass)
62+
{
63+
auto filter = GibbsFilterType::New();
64+
filter->SetMaximumNumberOfIterations(25u);
65+
EXPECT_EQ(filter->GetMaximumNumberOfIterations(), 25u);
66+
}
67+
68+
TEST(RGBGibbsPriorFilter, SetGetNumberOfClassesViaBasePointer)
69+
{
70+
auto gibbs = GibbsFilterType::New();
71+
const BaseFilterType * basePtr = gibbs;
72+
BaseFilterType * baseMutable = gibbs;
73+
baseMutable->SetNumberOfClasses(5u);
74+
EXPECT_EQ(basePtr->GetNumberOfClasses(), 5u);
75+
EXPECT_EQ(gibbs->GetNumberOfClasses(), 5u);
76+
}
77+
78+
TEST(RGBGibbsPriorFilter, SetGetMaximumNumberOfIterationsViaBasePointer)
79+
{
80+
auto gibbs = GibbsFilterType::New();
81+
const BaseFilterType * basePtr = gibbs;
82+
BaseFilterType * baseMutable = gibbs;
83+
baseMutable->SetMaximumNumberOfIterations(33u);
84+
EXPECT_EQ(basePtr->GetMaximumNumberOfIterations(), 33u);
85+
EXPECT_EQ(gibbs->GetMaximumNumberOfIterations(), 33u);
86+
}
87+
88+
TEST(RGBGibbsPriorFilter, ModifiedTimeAdvancesOnNumberOfClassesChange)
89+
{
90+
auto filter = GibbsFilterType::New();
91+
filter->SetNumberOfClasses(3u);
92+
const auto t1 = filter->GetMTime();
93+
filter->SetNumberOfClasses(4u);
94+
EXPECT_GT(filter->GetMTime(), t1);
95+
}
96+
97+
TEST(RGBGibbsPriorFilter, ModifiedTimeUnchangedOnIdenticalAssignment)
98+
{
99+
auto filter = GibbsFilterType::New();
100+
filter->SetNumberOfClasses(3u);
101+
const auto t1 = filter->GetMTime();
102+
filter->SetNumberOfClasses(3u);
103+
EXPECT_EQ(filter->GetMTime(), t1);
104+
}

0 commit comments

Comments
 (0)