Skip to content

Commit b441fc7

Browse files
acoussatSimon Rit
authored andcommitted
ENH: First simple test for iteration reporting
1 parent 0965dfe commit b441fc7

6 files changed

Lines changed: 154 additions & 70 deletions

File tree

applications/CMakeLists.txt

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ add_subdirectory(rtkspectraldenoiseprojections)
9090
add_subdirectory(rtkprojectionmatrix)
9191
add_subdirectory(rtkvectorconjugategradient)
9292

93+
add_subdirectory(rtkcheckimagequality)
94+
9395
#All the executables below are meant to create RTK ThreeDCircularProjectionGeometry files
9496
add_subdirectory(rtkvarianobigeometry)
9597
add_subdirectory(rtkvarianprobeamgeometry)
@@ -108,24 +110,33 @@ if(BUILD_TESTING)
108110

109111
add_test(rtkappsimulatedgeometrytest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtksimulatedgeometry -n 180 --sid 1000 --sdd 1500 -o geo)
110112

113+
add_test(rtkdrawshepploganphantomtest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkdrawshepploganphantom -o reference.mha --dimension 84 --phantomscale 40)
114+
111115
add_test(rtkappprojectshepploganphantomtest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkprojectshepploganphantom -o sheppy.mha -g geo --phantomscale 40 --dimension 128)
112116
set_tests_properties(rtkappprojectshepploganphantomtest PROPERTIES DEPENDS rtkappsimulatedgeometrytest)
113117

114118
if(RTK_USE_CUDA AND CUDA_HAVE_GPU)
115-
add_test(rtkappfdkcudatest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkfdk -g geo -p . -r sheppy.mha -o fdk_gpu.mha --hardware cuda)
119+
add_test(rtkappfdkcudatest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkfdk -g geo -p . -r sheppy.mha -o fdk_gpu.mha --hardware cuda --dimension 84)
116120
set_tests_properties(rtkappfdkcudatest PROPERTIES DEPENDS rtkappprojectshepploganphantomtest)
117121

118-
add_test(rtkappfdkchecktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkcheckimagequality fdk_gpu.mha)
119-
set_tests_properties(rtkappfdkchecktest PROPERTIES DEPENDS rtkappfdkcudatest)
122+
add_test(rtkappfdkchecktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkcheckimagequality -i reference.mha -j fdk_gpu.mha -t 7000)
123+
set_tests_properties(rtkappfdkchecktest PROPERTIES DEPENDS "rtkdrawshepploganphantomtest,rtkappfdkcudatest")
120124
else()
121125
# Only run the software version if
122126
if(NOT FAST_TESTS_NO_CHECKS)
123-
add_test(rtkappfdktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkfdk -g geo -p . -r sheppy.mha -o fdk_gpu.mha)
127+
add_test(rtkappfdktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkfdk -g geo -p . -r sheppy.mha -o fdk_gpu.mha --dimension 84)
124128
set_tests_properties(rtkappfdktest PROPERTIES DEPENDS rtkappprojectshepploganphantomtest)
125129

126-
add_test(rtkappfdkchecktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkcheckimagequality fdk_gpu.mha)
127-
set_tests_properties(rtkappfdkchecktest PROPERTIES DEPENDS rtkappfdktest)
130+
add_test(rtkappfdkchecktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkcheckimagequality -i reference.mha -j fdk_gpu.mha -t 7000)
131+
set_tests_properties(rtkappfdkchecktest PROPERTIES DEPENDS "rtkdrawshepploganphantomtest,rtkappfdktest")
128132
endif()
129133
endif()
130134

135+
# Iteration reporting testing
136+
add_test(rtkapposemtest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkosem -g geo -p . -r sheppy.mha -o osem.mha -n 3 --dimension 84 --output-every 1 --nprojpersubset 45 --iteration-file-name osem%d.mha)
137+
set_tests_properties(rtkapposemtest PROPERTIES DEPENDS rtkappprojectshepploganphantomtest)
138+
139+
add_test(rtkapposemchecktest ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/rtkcheckimagequality -i reference.mha -j osem1.mha,osem2.mha,osem3.mha -t 35000,16000,10000)
140+
set_tests_properties(rtkapposemchecktest PROPERTIES DEPENDS "rtkapposemtest,rtkdrawshepploganphantomtest")
141+
131142
endif()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
WRAP_GGO(rtkcheckimagequality_GGO_C rtkcheckimagequality.ggo ${RTK_BINARY_DIR}/rtkVersion.ggo)
2+
add_executable(rtkcheckimagequality rtkcheckimagequality.cxx ${rtkcheckimagequality_GGO_C})
3+
target_link_libraries(rtkcheckimagequality RTK)
4+
5+
# Installation code
6+
if(NOT RTK_INSTALL_NO_EXECUTABLES)
7+
foreach(EXE_NAME rtkcheckimagequality)
8+
install(TARGETS ${EXE_NAME}
9+
RUNTIME DESTINATION ${RTK_INSTALL_RUNTIME_DIR} COMPONENT Runtime
10+
LIBRARY DESTINATION ${RTK_INSTALL_LIB_DIR} COMPONENT RuntimeLibraries
11+
ARCHIVE DESTINATION ${RTK_INSTALL_ARCHIVE_DIR} COMPONENT Development)
12+
endforeach()
13+
endif()
14+
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#include "rtkcheckimagequality_ggo.h"
2+
#include "rtkConfiguration.h"
3+
#include "rtkMacro.h"
4+
#include "itkImage.h"
5+
#include "itkImageFileReader.h"
6+
#include "itkImageRegionConstIterator.h"
7+
8+
/**
9+
* \file rtkcheckimagequality.cxx
10+
*
11+
* \brief Checks that an image has a satisfactory MSE against a reference.
12+
*
13+
* \author Aurélien Coussat
14+
*/
15+
16+
template <class TImage>
17+
double
18+
MSE(typename TImage::Pointer reference, typename TImage::Pointer reconstruction)
19+
{
20+
using ImageIteratorType = itk::ImageRegionConstIterator<TImage>;
21+
ImageIteratorType itTest(reconstruction, reconstruction->GetBufferedRegion());
22+
ImageIteratorType itRef(reference, reference->GetBufferedRegion());
23+
24+
using ErrorType = double;
25+
ErrorType EnerError = 0.;
26+
27+
itTest.GoToBegin();
28+
itRef.GoToBegin();
29+
30+
while (!itRef.IsAtEnd())
31+
{
32+
typename TImage::PixelType TestVal = itTest.Get();
33+
typename TImage::PixelType RefVal = itRef.Get();
34+
EnerError += std::pow(ErrorType(RefVal - TestVal), 2.);
35+
++itTest;
36+
++itRef;
37+
}
38+
39+
return EnerError;
40+
}
41+
42+
int
43+
main(int argc, char ** argv)
44+
{
45+
46+
args_info_rtkcheckimagequality args_info;
47+
cmdline_parser_rtkcheckimagequality_params args_params;
48+
cmdline_parser_rtkcheckimagequality_params_init(&args_params);
49+
args_params.print_errors = 1;
50+
args_params.check_required = 1;
51+
args_params.override = 1;
52+
args_params.initialize = 1;
53+
if (0 != cmdline_parser_rtkcheckimagequality_ext(argc, argv, &args_info, &args_params))
54+
{
55+
std::cerr << "Error in cmdline_parser_rtkcheckimagequality_ext" << std::endl;
56+
exit(1);
57+
}
58+
59+
constexpr unsigned int Dimension = 3;
60+
using PixelType = float;
61+
using ImageType = itk::Image<PixelType, Dimension>;
62+
63+
using ReaderType = itk::ImageFileReader<ImageType>;
64+
ReaderType::Pointer reader;
65+
66+
// Maximum number of comparisons to perform (depends on the number of inputs)
67+
unsigned int n_max =
68+
std::max({ args_info.reference_given, args_info.reconstruction_given, args_info.threshold_given });
69+
70+
for (unsigned int i = 0; i < n_max; i++)
71+
{
72+
unsigned int reference_index = std::min(args_info.reference_given - 1, i);
73+
unsigned int reconstruction_index = std::min(args_info.reconstruction_given - 1, i);
74+
unsigned int threshold_index = std::min(args_info.threshold_given - 1, i);
75+
76+
reader = ReaderType::New();
77+
reader->SetFileName(args_info.reference_arg[reference_index]);
78+
79+
try
80+
{
81+
reader->Update();
82+
}
83+
catch (::itk::ExceptionObject & e)
84+
{
85+
std::cerr << e.GetDescription();
86+
return EXIT_FAILURE;
87+
}
88+
89+
ImageType::Pointer reference = reader->GetOutput();
90+
91+
reader = ReaderType::New();
92+
reader->SetFileName(args_info.reconstruction_arg[reconstruction_index]);
93+
94+
try
95+
{
96+
reader->Update();
97+
}
98+
catch (::itk::ExceptionObject & e)
99+
{
100+
std::cerr << e.GetDescription();
101+
return EXIT_FAILURE;
102+
}
103+
104+
ImageType::Pointer reconstruction = reader->GetOutput();
105+
106+
double mse = MSE<ImageType>(reference, reconstruction);
107+
108+
if (mse > args_info.threshold_arg[threshold_index])
109+
{
110+
std::cerr << "Error comparing " << args_info.reference_arg[reference_index] << " and "
111+
<< args_info.reconstruction_arg[reconstruction_index] << ":" << std::endl
112+
<< "MSE " << mse << " above given threshold " << args_info.threshold_arg[threshold_index] << std::endl;
113+
return EXIT_FAILURE;
114+
}
115+
}
116+
return EXIT_SUCCESS;
117+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package "rtkcheckimagequality"
2+
purpose "Checks the MSE of a reconstructed image against a reference."
3+
4+
option "reference" i "Reference volume" string multiple yes
5+
option "reconstruction" j "Reconstructed volume" string multiple yes
6+
option "threshold" t "MSE threshold" int multiple yes

test/CMakeLists.txt

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,6 @@ if(NOT ITK_SOURCE_DIR)
4747
set(ExternalData_LINK_CONTENT SHA512)
4848
endif()
4949

50-
#-----------------------------------------------------------------------------
51-
# Executable to check the image quality
52-
add_executable(rtkcheckimagequality rtkcheckimagequality.cxx)
53-
target_link_libraries(rtkcheckimagequality ${ITK_LIBRARIES} ${RTK_LIBRARIES} ${RTK-Test_LIBRARIES})
54-
5550
rtk_add_test(rtkFDKTest rtkfdktest.cxx)
5651
rtk_add_cuda_test(rtkFDKCudaTest rtkfdktest.cxx)
5752

test/rtkcheckimagequality.cxx

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)