Skip to content

Commit 6d6bb4a

Browse files
authored
Merge pull request #254 from tbirdso/scale-an-image
ENH: `ScaleAnImage` Python example and input data update
2 parents 1284f09 + bed0f6b commit 6d6bb4a

File tree

8 files changed

+75
-69
lines changed

8 files changed

+75
-69
lines changed

src/Core/Transform/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ compare_to_baseline(
1515

1616
add_example(ScaleAnImage)
1717
compare_to_baseline(EXAMPLE_NAME ScaleAnImage
18-
BASELINE_PREFIX ScaleAnImageOutput
18+
BASELINE_PREFIX ScaleAnImageOutputBaseline
1919
)
2020

2121
add_example(TranslateAVectorImage)

src/Core/Transform/ScaleAnImage/CMakeLists.txt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,24 @@ install(TARGETS ScaleAnImage
1313
DESTINATION bin/ITKSphinxExamples/Core/Transform
1414
COMPONENT Runtime
1515
)
16-
17-
install(FILES Code.cxx CMakeLists.txt
16+
17+
install(FILES Code.cxx Code.py CMakeLists.txt
1818
DESTINATION share/ITKSphinxExamples/Code/Core/Transform/ScaleAnImage/
1919
COMPONENT Code
2020
)
2121

2222

2323
enable_testing()
24-
set(input_image ${CMAKE_CURRENT_BINARY_DIR}/input.png)
25-
set(output_image Output.png)
26-
set(test_options)
2724

2825
add_test(NAME ScaleAnImageTest
2926
COMMAND ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/ScaleAnImage
30-
${input_image}
31-
${output_image}
32-
${test_options}
27+
${CMAKE_CURRENT_BINARY_DIR}/ScaleAnImageInput.png
28+
${CMAKE_CURRENT_BINARY_DIR}/ScaleAnImageOutput.png
3329
)
30+
31+
if(ITK_WRAP_PYTHON)
32+
add_test(NAME ScaleAnImageTestPython
33+
COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/Code.py
34+
${CMAKE_CURRENT_BINARY_DIR}/ScaleAnImageInput.png
35+
${CMAKE_CURRENT_BINARY_DIR}/ScaleAnImageOutputPython.png)
36+
endif()

src/Core/Transform/ScaleAnImage/Code.cxx

Lines changed: 14 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,25 @@
1717
*=========================================================================*/
1818
#include "itkImage.h"
1919
#include "itkScaleTransform.h"
20+
#include "itkImageFileReader.h"
2021
#include "itkImageFileWriter.h"
2122
#include "itkResampleImageFilter.h"
2223

23-
using ImageType = itk::Image<unsigned char, 2>;
24-
25-
static void
26-
CreateImage(ImageType::Pointer image);
27-
2824
int
29-
main()
25+
main(int argc, char * argv[])
3026
{
31-
auto image = ImageType::New();
32-
CreateImage(image);
27+
if (argc < 3)
28+
{
29+
std::cerr << "Usage: " << argv[0] << " inputFile outputFile" << std::endl;
30+
}
3331

34-
itk::WriteImage(image, "input.png");
32+
using PixelType = unsigned char;
33+
constexpr unsigned int ImageDimension = 2;
34+
using ImageType = itk::Image<PixelType, ImageDimension>;
35+
auto image = itk::ReadImage<ImageType>(argv[1]);
3536

36-
// using TransformType = itk::ScaleTransform<float, 2>; // If you want to use float here, you must use:
37-
// using ResampleImageFilterType = itk::ResampleImageFilter<ImageType, ImageType, float>; later.
38-
using TransformType = itk::ScaleTransform<double, 2>;
37+
using MetricValueType = double;
38+
using TransformType = itk::ScaleTransform<MetricValueType, 2>;
3939
auto scaleTransform = TransformType::New();
4040
itk::FixedArray<float, 2> scale;
4141
scale[0] = 1.5; // newWidth/oldWidth
@@ -48,57 +48,14 @@ main()
4848

4949
scaleTransform->SetCenter(center);
5050

51-
using ResampleImageFilterType = itk::ResampleImageFilter<ImageType, ImageType>;
51+
using ResampleImageFilterType = itk::ResampleImageFilter<ImageType, ImageType, MetricValueType>;
5252
auto resampleFilter = ResampleImageFilterType::New();
5353
resampleFilter->SetTransform(scaleTransform);
5454
resampleFilter->SetInput(image);
5555
resampleFilter->SetSize(image->GetLargestPossibleRegion().GetSize());
5656
resampleFilter->Update();
5757

58-
itk::WriteImage(resampleFilter->GetOutput(), "output.png");
58+
itk::WriteImage(resampleFilter->GetOutput(), argv[2]);
5959

6060
return EXIT_SUCCESS;
6161
}
62-
63-
void
64-
CreateImage(ImageType::Pointer image)
65-
{
66-
itk::Index<2> start;
67-
start.Fill(0);
68-
69-
itk::Size<2> size;
70-
size.Fill(101);
71-
72-
ImageType::RegionType region(start, size);
73-
image->SetRegions(region);
74-
image->Allocate();
75-
image->FillBuffer(0);
76-
77-
// Make a white square
78-
for (unsigned int r = 40; r < 60; ++r)
79-
{
80-
for (unsigned int c = 40; c < 60; ++c)
81-
{
82-
ImageType::IndexType pixelIndex;
83-
pixelIndex[0] = r;
84-
pixelIndex[1] = c;
85-
86-
image->SetPixel(pixelIndex, 255);
87-
}
88-
}
89-
90-
itk::ImageRegionIterator<ImageType> imageIterator(image, image->GetLargestPossibleRegion());
91-
92-
// Draw a white border
93-
while (!imageIterator.IsAtEnd())
94-
{
95-
if (imageIterator.GetIndex()[0] == 0 ||
96-
imageIterator.GetIndex()[0] == static_cast<int>(image->GetLargestPossibleRegion().GetSize()[0]) - 1 ||
97-
imageIterator.GetIndex()[1] == 0 ||
98-
imageIterator.GetIndex()[1] == static_cast<int>(image->GetLargestPossibleRegion().GetSize()[1]) - 1)
99-
{
100-
imageIterator.Set(255);
101-
}
102-
++imageIterator;
103-
}
104-
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#!/usr/bin/env python
2+
3+
# =========================================================================
4+
#
5+
# Copyright NumFOCUS
6+
#
7+
# Licensed under the Apache License, Version 2.0 (the "License");
8+
# you may not use this file except in compliance with the License.
9+
# You may obtain a copy of the License at
10+
#
11+
# http://www.apache.org/licenses/LICENSE-2.0.txt
12+
#
13+
# Unless required by applicable law or agreed to in writing, software
14+
# distributed under the License is distributed on an "AS IS" BASIS,
15+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16+
# See the License for the specific language governing permissions and
17+
# limitations under the License.
18+
#
19+
# =========================================================================*/
20+
21+
import sys
22+
23+
import itk
24+
25+
if len(sys.argv) < 3:
26+
raise Exception(f"Usage: {sys.argv[0]} inputFile outputFile")
27+
28+
image = itk.imread(sys.argv[1], itk.UC)
29+
30+
image_dimension = image.GetImageDimension()
31+
32+
transform = itk.ScaleTransform[itk.D, 2].New(
33+
scale=[1.5] * image_dimension, center=[x / 2 for x in itk.size(image)]
34+
)
35+
36+
scaled_image = itk.resample_image_filter(
37+
image, transform=transform, size=itk.size(image)
38+
)
39+
40+
itk.imwrite(scaled_image, sys.argv[2])

src/Core/Transform/ScaleAnImage/Documentation.rst

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Results
2020

2121
Input Image
2222

23-
.. figure:: ScaleAnImageOutput.png
23+
.. figure:: ScaleAnImageOutputBaseline.png
2424
:scale: 70%
2525
:alt: Generated Output Image
2626

@@ -36,6 +36,12 @@ C++
3636
.. literalinclude:: Code.cxx
3737
:lines: 18-
3838

39+
Python
40+
...
41+
42+
.. literalinclude:: Code.py
43+
:lines: 21-
44+
3945
Classes demonstrated
4046
--------------------
4147

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a2af37927b6e67dd7a1eceaa8b2b15837a872a91d04ad7df15d59e57c61d5ac1ce4ff11409de048c9d7a066adbbe4225af38d156e586dfead3c49059f1f2e581
1+
3751db8b668657ed157daa5f7472ba2775feefbed331d8cd45c867089c5b5a535a10d55ec02cbf7c6cf73309f06636bc4001080b8bbc4f53dec205addd0ee41f

src/Core/Transform/ScaleAnImage/ScaleAnImageOutput.png.sha512

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
7ec9d81518d26754151a112affbe24a0f206b307aaa8c8bf8241a954e0974b6ea31a8b2982ce26d9de8eb4eeacba4003e16badfc9dd39aa7cd8827080360eb39

0 commit comments

Comments
 (0)