diff --git a/Modules/Registration/Montage/CMakeLists.txt b/Modules/Registration/Montage/CMakeLists.txt new file mode 100644 index 000000000000..7581e9511335 --- /dev/null +++ b/Modules/Registration/Montage/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.16.3) + +if(CMAKE_CXX_STANDARD EQUAL "98") + message( + FATAL_ERROR + "CMAKE_CXX_STANDARD:STRING=98 is not supported in ITK version 5 and greater." + ) +endif() + +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 17) # Supported values are ``17``, ``20``, and ``23``. +endif() +if(NOT CMAKE_CXX_STANDARD_REQUIRED) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() +if(NOT CMAKE_CXX_EXTENSIONS) + set(CMAKE_CXX_EXTENSIONS OFF) +endif() + +project(Montage) + +set(Montage_LIBRARIES Montage) + +# Suppress warnings about potentially uninstantiated static members +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag( + "-Wno-undefined-var-template" + COMPILER_HAS_NO_UNDEFINED_VAR_TEMPLATE + ) + if(COMPILER_HAS_NO_UNDEFINED_VAR_TEMPLATE) + set(CMAKE_CXX_FLAGS "-Wno-undefined-var-template ${CMAKE_CXX_FLAGS}") + endif() +endif() + +if(NOT ITK_SOURCE_DIR) + find_package(ITK REQUIRED) + list(APPEND CMAKE_MODULE_PATH ${ITK_CMAKE_DIR}) + include(ITKModuleExternal) +else() + set(ITK_DIR ${CMAKE_BINARY_DIR}) + itk_module_impl() +endif() + +itk_module_examples() diff --git a/Modules/Registration/Montage/README.md b/Modules/Registration/Montage/README.md new file mode 100644 index 000000000000..2701ec891615 --- /dev/null +++ b/Modules/Registration/Montage/README.md @@ -0,0 +1,60 @@ +# Montage + +Mosaic-stitching and 3D reconstruction of large datasets from a +collection of partially-overlapping 2D slices, built around phase +correlation image registration. Core classes: + +- `itk::PhaseCorrelationImageRegistrationMethod` +- `itk::PhaseCorrelationOperator` +- `itk::PhaseCorrelationOptimizer` +- `itk::TileMontage` +- `itk::TileMergeImageFilter` +- `itk::TileConfiguration` +- `itk::NMinimaMaximaImageCalculator` + +## Upstream + +This module was originally developed and maintained as a standalone +remote module at +. The +contents of `include/`, `src/`, `test/`, `wrapping/`, and the two +CMake build descriptors (`CMakeLists.txt`, `itk-module.cmake`) were +ingested into ITK via `Utilities/Maintenance/RemoteModuleIngest/` +(see PR #6098 for the tooling). + +The standalone upstream repository should be treated as archived +once this ingest lands. Refer to its tags and release history for +provenance, but future development happens in-tree here. + +## What is intentionally NOT ingested + +The whitelist-based ingest deliberately excludes the following +upstream content from ITK: + +- `examples/` — applied demonstration code and sample datasets; + lives with the archived upstream (and selectively relocated to + [`Examples/`](https://github.com/InsightSoftwareConsortium/ITK/tree/main/Examples) + in a follow-up PR if broadly useful). +- `.github/workflows/` — upstream-specific CI configuration; ITK's + in-tree CI covers the module via the central pipeline. +- `CTestConfig.cmake` — pointed at a standalone CDash project that + no longer applies in-tree. +- `README.md`, `LICENSE`, `requirements.txt`, `pyproject.toml` and + similar scaffolding — top-level packaging files that are either + inherited from ITK's own policy (Apache 2.0 license, etc.) or + irrelevant in-tree. + +If you need any of the above, consult the archived upstream. + +## Compliance level + +Previously tracked as a level-3 remote module (see the superseded +`Modules/Remote/Montage.remote.cmake`). In-tree placement does not +automatically raise the compliance level; continued stewardship is +needed to reach levels 4 and 5. + +## Contact + +Originally authored and maintained by Dženan Zukić +<dzenan.zukic@kitware.com>. In-tree maintenance follows ITK's +standard review process. diff --git a/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.h b/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.h new file mode 100644 index 000000000000..7ec4535d9940 --- /dev/null +++ b/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.h @@ -0,0 +1,158 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkNMinimaMaximaImageCalculator_h +#define itkNMinimaMaximaImageCalculator_h + +#include "itkMacro.h" +#include "itkObject.h" +#include "itkObjectFactory.h" +#include +#include + +namespace itk +{ +/** \class NMinimaMaximaImageCalculator + * \brief Computes the N highest and/or lowest intensity values of an image. + * + * This class is templated over input image type. If only Maxima or + * Minima are needed, just call ComputeMaxima() or ComputeMinima(). + * Compute() will compute both. + * + * \ingroup Operators + * \ingroup ITKCommon + * \ingroup Montage + */ +template +class ITK_TEMPLATE_EXPORT NMinimaMaximaImageCalculator : public Object +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(NMinimaMaximaImageCalculator); + + /** Standard class type aliases. */ + using Self = NMinimaMaximaImageCalculator; + using Superclass = Object; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(NMinimaMaximaImageCalculator); + + /** Type definition for the input image. */ + using ImageType = TInputImage; + + /** Pointer type for the image. */ + using ImagePointer = typename TInputImage::Pointer; + + /** Const Pointer type for the image. */ + using ImageConstPointer = typename TInputImage::ConstPointer; + + /** Type definition for the input image pixel type. */ + using PixelType = typename TInputImage::PixelType; + + /** Image dimensionality */ + static constexpr unsigned int ImageDimension = TInputImage::ImageDimension; + // constexpr unsigned ImageDimension = TInputImage::VImageDimension; + + /** Type definition for the input image index type. */ + using IndexType = typename TInputImage::IndexType; + + /** Type definition for the input image region type. */ + using RegionType = typename TInputImage::RegionType; + + /** Sorted vector of minima or maxima. */ + using ValueVector = std::vector; + + /** Sorted vector of pixel indices of minima or maxima. */ + using IndexVector = std::vector; + + + /** Set the input image. */ + itkSetConstObjectMacro(Image, ImageType); + + /** Compute the minimum value of intensity of the input image. */ + void + ComputeMinima(); + + /** Compute the maximum value of intensity of the input image. */ + void + ComputeMaxima(); + + /** Compute the minimum and maximum values of intensity of the input image. */ + void + Compute(); + + /** Return the N minimum intensity values. */ + itkGetConstReferenceMacro(Minima, ValueVector); + + /** Return the N maximum intensity values. */ + itkGetConstReferenceMacro(Maxima, ValueVector); + + /** Return the indices of the N minimum intensity values. */ + itkGetConstReferenceMacro(IndicesOfMinima, IndexVector); + + /** Return the indices of the N maximum intensity values. */ + itkGetConstReferenceMacro(IndicesOfMaxima, IndexVector); + + /** Set the region over which the values will be computed */ + void + SetRegion(const RegionType & region); + + /** Get/Set the number of extreme intensity values to keep. */ + itkGetConstMacro(N, SizeValueType); + itkSetMacro(N, SizeValueType); + +protected: + NMinimaMaximaImageCalculator(); + ~NMinimaMaximaImageCalculator() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + template > + void + SortedInsert(ValueVector & vals, + IndexVector & indices, + const PixelType & val, + const IndexType & ind, + TComparator comp = TComparator()); + void + InternalCompute(); + +private: + ImageConstPointer m_Image; + ValueVector m_Minima; + ValueVector m_Maxima; + IndexVector m_IndicesOfMinima; + IndexVector m_IndicesOfMaxima; + SizeValueType m_N{ 7 }; + + RegionType m_Region; + bool m_RegionSetByUser{ false }; + bool m_ComputeMaxima{ true }; + bool m_ComputeMinima{ true }; + std::mutex m_Mutex; +}; +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkNMinimaMaximaImageCalculator.hxx" +#endif + +#endif /* itkNMinimaMaximaImageCalculator_h */ diff --git a/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.hxx b/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.hxx new file mode 100644 index 000000000000..de5df9f8a127 --- /dev/null +++ b/Modules/Registration/Montage/include/itkNMinimaMaximaImageCalculator.hxx @@ -0,0 +1,215 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkNMinimaMaximaImageCalculator_hxx +#define itkNMinimaMaximaImageCalculator_hxx + + +#include "itkImageRegionConstIteratorWithIndex.h" +#include "itkMultiThreaderBase.h" +#include "itkNumericTraits.h" +#include + +namespace itk +{ + +template +NMinimaMaximaImageCalculator::NMinimaMaximaImageCalculator() +{ + m_Image = TInputImage::New(); +} + +template +template +inline void +NMinimaMaximaImageCalculator::SortedInsert(ValueVector & vals, + IndexVector & indices, + const PixelType & val, + const IndexType & ind, + TComparator comp) +{ + auto ub = std::upper_bound(vals.begin(), vals.end(), val, comp); + if (ub != vals.end()) + { + unsigned i = ub - vals.begin(); + vals.insert(ub, val); + vals.pop_back(); + indices.insert(indices.begin() + i, ind); + indices.pop_back(); + } +} + +template +void +NMinimaMaximaImageCalculator::InternalCompute() +{ + if (!m_RegionSetByUser) + { + m_Region = m_Image->GetRequestedRegion(); + } + + m_Minima.clear(); + m_Minima.reserve(m_N + 1); // for overflow during insertion + m_Minima.resize(m_N, NumericTraits::max()); + m_Maxima.clear(); + m_Maxima.reserve(m_N + 1); // for overflow during insertion + m_Maxima.resize(m_N, NumericTraits::NonpositiveMin()); + + m_IndicesOfMinima.reserve(m_N + 1); // for overflow during insertion + m_IndicesOfMinima.resize(m_N); + m_IndicesOfMaxima.reserve(m_N + 1); // for overflow during insertion + m_IndicesOfMaxima.resize(m_N); + + typename MultiThreaderBase::Pointer mt = MultiThreaderBase::New(); + mt->template ParallelizeImageRegion( + m_Region, + [this](const RegionType & region) { + thread_local ValueVector mins; + thread_local ValueVector maxs; + thread_local IndexVector minInd; + thread_local IndexVector maxInd; + if (m_ComputeMinima) + { + mins.clear(); + mins.reserve(m_N + 1); // for overflow during insertion + mins.resize(m_N, NumericTraits::max()); + minInd.reserve(m_N + 1); // for overflow during insertion + minInd.resize(m_N); + } + if (m_ComputeMaxima) + { + maxs.clear(); + maxs.reserve(m_N + 1); // for overflow during insertion + maxs.resize(m_N, NumericTraits::NonpositiveMin()); + maxInd.reserve(m_N + 1); // for overflow during insertion + maxInd.resize(m_N); + } + + std::greater compGreater; + ImageRegionConstIteratorWithIndex iIt(this->m_Image, region); + for (; !iIt.IsAtEnd(); ++iIt) + { + const IndexType & ind = iIt.GetIndex(); + const PixelType & val = iIt.Get(); + if (m_ComputeMinima) + { + SortedInsert(mins, minInd, val, ind); + } + if (m_ComputeMaxima) + { + SortedInsert(maxs, maxInd, val, ind, compGreater); + } + } + + // merge + std::lock_guard mutexHolder(m_Mutex); + if (m_ComputeMinima) + { + for (unsigned i = 0; i < m_N; i++) + { + SortedInsert(m_Minima, m_IndicesOfMinima, mins[i], minInd[i]); + } + } + if (m_ComputeMaxima) + { + for (unsigned i = 0; i < m_N; i++) + { + SortedInsert(m_Maxima, m_IndicesOfMaxima, maxs[i], maxInd[i], compGreater); + } + } + }, + nullptr); +} + +template +void +NMinimaMaximaImageCalculator::Compute() +{ + m_ComputeMinima = true; + m_ComputeMaxima = true; + this->InternalCompute(); +} + +template +void +NMinimaMaximaImageCalculator::ComputeMinima() +{ + m_ComputeMinima = true; + m_ComputeMaxima = false; + this->InternalCompute(); +} + +template +void +NMinimaMaximaImageCalculator::ComputeMaxima() +{ + m_ComputeMinima = false; + m_ComputeMaxima = true; + this->InternalCompute(); +} + +template +void +NMinimaMaximaImageCalculator::SetRegion(const RegionType & region) +{ + m_Region = region; + m_RegionSetByUser = true; +} + +template +void +NMinimaMaximaImageCalculator::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + + os << indent << "Minima:"; + for (unsigned i = 0; i < m_Minima.size(); i++) + { + os << " " << static_cast::PrintType>(m_Minima[i]); + } + os << std::endl; + + os << indent << "Indices of Minima:"; + for (unsigned i = 0; i < m_IndicesOfMinima.size(); i++) + { + os << " " << m_IndicesOfMinima[i]; + } + os << std::endl; + + os << indent << "Maxima:"; + for (unsigned i = 0; i < m_Maxima.size(); i++) + { + os << " " << static_cast::PrintType>(m_Maxima[i]); + } + os << std::endl; + + os << indent << "Indices of Maxima:"; + for (unsigned i = 0; i < m_IndicesOfMaxima.size(); i++) + { + os << " " << m_IndicesOfMaxima[i]; + } + os << std::endl; + + itkPrintSelfObjectMacro(Image); + os << indent << "Region: " << std::endl; + m_Region.Print(os, indent.GetNextIndent()); + os << indent << "Region set by User: " << m_RegionSetByUser << std::endl; +} + +} // end namespace itk + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.h b/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.h new file mode 100644 index 000000000000..a8d2ad053212 --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.h @@ -0,0 +1,502 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationImageRegistrationMethod_h +#define itkPhaseCorrelationImageRegistrationMethod_h + +#include "itkConstantPadImageFilter.h" +#include "itkDataObjectDecorator.h" +#include "itkFrequencyHalfHermitianFFTLayoutImageRegionIteratorWithIndex.h" +#include "itkHalfHermitianToRealInverseFFTImageFilter.h" +#include "itkImage.h" +#include "itkMirrorPadImageFilter.h" +#include "itkProcessObject.h" +#include "itkRealToHalfHermitianForwardFFTImageFilter.h" +#include "itkRegionOfInterestImageFilter.h" +#include "itkTranslationTransform.h" +#include "itkUnaryFrequencyDomainFilter.h" +#include +#include + +#include "itkPhaseCorrelationOperator.h" +#include "itkPhaseCorrelationOptimizer.h" + +namespace itk +{ + +/** \class PhaseCorrelationImageRegistrationMethodEnums + * \ingroup Montage + */ +class PhaseCorrelationImageRegistrationMethodEnums +{ +public: + /** \class PaddingMethod + * \brief Different methods of padding the images to satisfy FFT size requirements. + * \ingroup Montage */ + enum class PaddingMethod : uint8_t + { + Zero = 0, + Mirror, + MirrorWithExponentialDecay, + Last = MirrorWithExponentialDecay + }; +}; + +extern Montage_EXPORT std::ostream & +operator<<(std::ostream & out, const PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod value); + +/** \class PhaseCorrelationImageRegistrationMethod + * \brief Base class for phase-correlation-based image registration. + * + * Phase Correlation Method (PCM) estimates shift between the Fixed image and + * Moving image. See C. D. Kuglin and D. C. Hines, The phase correlation + * image alignment method, in Proc. Int. Conf. on Cybernetics and Society, + * pp. 163-165, IEEE, Sep. 1975 for method description. + * + * The method consists of 6 steps: + * 0. Resampling and padding the images to the same spacing and size. + * 1. Compute FFT of the two images. + * 2. Compute the ratio of the two spectrums. + * 3. Apply Butterworth band-pass filter in frequency domain + * 4. Compute the inverse FFT of the cross-power spectrum. + * 5. Find the maximum peak in cross-power spectrum and estimate the shift. + * + * Resampling (step 0) is not included in the method itself - it is a prerequisite of PCM. + * It is required that the input itk::Image's have the same Spacing and + * Direction. If that is not the case, resample one of the images with the + * ResampleImageFilter prior to applying this method. + * + * This class will zero-pad the images so they have the same real size + * (in all dimensions) and are multiples of FFT's supported prime factors. + * + * Step 1. is performed by this class too using FFT filters supplied by + * itk::RealToHalfHermitianForwardFFTImageFilter::New() factory. + * + * Step 2. is performed by generic PhaseCorrelationOperator supplied at + * run-time. PhaseCorrelationOperator can be derived to implement some special + * filtering during this phase. + * + * As some special techniques (e.g. to compute subpixel shifts) require complex + * correlation surface, while the others compute the shift from real + * correlation surface. + * + * Step 3. is there to ease registration in case of significant + * low and/or high frequency artifcats, such as uneven lighting or high noise. + * + * Step 4. is carried by this class only when necessary. + * The IFFT filter is created using + * itk::HalfHermitianToRealInverseFFTImageFilter::New() factory. + * + * Step 5. is performed with the run-time supplied PhaseCorrelationOptimizer. It has + * to determine the shift from the real or complex correlation surface + * and fixed and moving image's origins. + * + * + * First, plug in the operator, optimizer and the input images. The method + * is executed by calling Update() (or updating some downstream filter). + * + * The output shift can be passed downstream in the form of + * TranslationTransform or can be obtained as transform parameters vector. The + * transform can be directly used to resample the Moving image to match the + * Fixed image. + * + * This class allows caching of image FFTs, because image montaging usually + * requires a single tile to participate in multiple image registrations. + * + * TInternalPixelTypePixel will be used by internal filters. It should be + * float for integral and float inputs, and double for double inputs. + * + * \author Jakub Bican, jakub.bican@matfyz.cz, Department of Image Processing, + * Institute of Information Theory and Automation, + * Academy of Sciences of the Czech Republic. + * + * \ingroup Montage + */ +template < + typename TFixedImage, + typename TMovingImage, + typename TInternalPixelType = + typename std::conditional::value, double, float>::type> +class ITK_TEMPLATE_EXPORT PhaseCorrelationImageRegistrationMethod : public ProcessObject +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(PhaseCorrelationImageRegistrationMethod); + + /** Standard class type aliases. */ + using Self = PhaseCorrelationImageRegistrationMethod; + using Superclass = ProcessObject; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(PhaseCorrelationImageRegistrationMethod); + + /** Type of the Fixed image. */ + using FixedImageType = TFixedImage; + using FixedImagePixelType = typename FixedImageType::PixelType; + using FixedImageConstPointer = typename FixedImageType::ConstPointer; + + /** Type of the Moving image. */ + using MovingImageType = TMovingImage; + using MovingImagePixelType = typename MovingImageType::PixelType; + using MovingImageConstPointer = typename MovingImageType::ConstPointer; + + /** Dimensionality of input and output data is assumed to be the same. */ + static constexpr unsigned int ImageDimension = FixedImageType::ImageDimension; + + /** Image and region size type. */ + using SizeType = Size; + + /** Pixel type, that will be used by internal filters. + * It should be float for integral and float inputs and it should + * be double for double inputs */ + using InternalPixelType = TInternalPixelType; + + /** Type of the image, that is passed between the internal components. */ + using RealImageType = Image; + + /** Type of the image, that is passed between the internal components. */ + using ComplexConjugateImageType = Image, Self::ImageDimension>; + + /** Type of the Operator */ + using OperatorType = PhaseCorrelationOperator; + using OperatorPointer = typename OperatorType::Pointer; + + /** Type of the Optimizer */ + using OptimizerType = PhaseCorrelationOptimizer; + using OptimizerPointer = typename OptimizerType::Pointer; + + /** Type for the transform. */ + using TransformType = TranslationTransform; + using TransformPointer = typename TransformType::Pointer; + + /** Type for the output transform parameters (the shift). */ + using ParametersType = typename TransformType::ParametersType; + + /** Type for the output: Using Decorator pattern for enabling + * the Transform to be passed in the data pipeline */ + using TransformOutputType = DataObjectDecorator; + using TransformOutputPointer = typename TransformOutputType::Pointer; + using TransformOutputConstPointer = typename TransformOutputType::ConstPointer; + + /** Smart Pointer type to a DataObject. */ + using DataObjectPointer = typename DataObject::Pointer; + + /** Set/Get the Fixed image. */ + void + SetFixedImage(const FixedImageType * fixedImage); + itkGetConstObjectMacro(FixedImage, FixedImageType); + + /** Set/Get the Moving image. */ + void + SetMovingImage(const MovingImageType * movingImage); + itkGetConstObjectMacro(MovingImage, MovingImageType); + + /** Internal FFT filter type. */ + using FFTFilterType = RealToHalfHermitianForwardFFTImageFilter; + + /** Image's FFT type. */ + using ComplexImageType = typename FFTFilterType::OutputImageType; + + /** Set the fixed image's cached FFT. */ + void + SetFixedImageFFT(const ComplexImageType * fixedImageFFT); + + /** Get the fixed image's FFT (useful for caching). + * Available after Update() has been called. */ + itkGetConstObjectMacro(FixedImageFFT, ComplexImageType); + + /** Set the moving image's cached FFT. */ + void + SetMovingImageFFT(const ComplexImageType * movingImageFFT); + + /** Get the moving image's FFT (useful for caching). + * Available after Update() has been called. */ + itkGetConstObjectMacro(MovingImageFFT, ComplexImageType); + + /** Passes ReleaseDataFlag to internal filters. */ + void + SetReleaseDataFlag(bool flag) override; + + /** Passes ReleaseDataBeforeUpdateFlag to internal filters. */ + void + SetReleaseDataBeforeUpdateFlag(const bool flag) override; + + /** Set/Get the Operator. */ + itkSetObjectMacro(Operator, OperatorType); + itkGetConstObjectMacro(Operator, OperatorType); + + /** Set/Get the Optimizer. */ + virtual void + SetOptimizer(OptimizerType *); + itkGetConstObjectMacro(Optimizer, OptimizerType); + + /** Given an image size, returns the smallest size + * which factorizes using FFT's prime factors. */ + SizeType + RoundUpToFFTSize(SizeType inSize); + + /** Set/Get the PadToSize. + * Unset by setting a size of all zeroes. + * + * If PadToSize is set, image sizes are ignored and this size is used. + * + * If used in a montage, a maximum image size can be determined, + * RoundUpToFFTSize() called and the resulting size set as PadToSize. */ + itkSetMacro(PadToSize, SizeType); + itkGetConstMacro(PadToSize, SizeType); + + /** Set/Get obligatory padding. + * If set, padding of this many pixels is added on both beginning and end + * sides of each dimension of the image. */ + itkSetMacro(ObligatoryPadding, SizeType); + itkGetConstMacro(ObligatoryPadding, SizeType); + + using PaddingMethodEnum = PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod; + // itkGetConstMacro(PaddingMethod, PaddingMethodEnum); + void + SetPaddingMethod(const PaddingMethodEnum paddingMethod); + + /** Set/Get tile cropping. Should tiles be cropped to overlapping + * region for computing the cross correlation? Default: True. + * + * This improves results, and in case overlaps are less than 25% + * computation is also faster. */ + itkSetMacro(CropToOverlap, bool); + itkGetConstMacro(CropToOverlap, bool); + + /** Set/Get the order for Butterworth band-pass filtering + * of complex correlation surface. Greater than zero. Default is 3. */ + itkSetMacro(ButterworthOrder, unsigned); + itkGetConstMacro(ButterworthOrder, unsigned); + + /** Set/Get low frequency threshold for Butterworth band-pass. + * Expressed in Hertz. Valid range (0.0, 1.0). + * If equal to 0.0 it means low pass filtering is disabled.*/ + virtual void + SetButterworthLowFrequency(double f_Hz) + { + double f2 = f_Hz * f_Hz; // square of frequency + // we save per-pixel computation by recording the square + if (this->m_LowFrequency2 != f2) + { + this->m_LowFrequency2 = f2; + this->Modified(); + } + } + virtual double + GetButterworthLowFrequency() const + { + return std::sqrt(m_LowFrequency2); + } + + /** Set/Get high frequency threshold for Butterworth band-pass. + * Expressed in Hertz. Valid range (0.0, 1.0). + * If equal to 0.0 it means high pass filtering is disabled.*/ + virtual void + SetButterworthHighFrequency(double f_Hz) + { + double f2 = f_Hz * f_Hz; // square of frequency + // we save per-pixel computation by recording the square + if (this->m_HighFrequency2 != f2) + { + this->m_HighFrequency2 = f2; + this->Modified(); + } + } + virtual double + GetButterworthHighFrequency() const + { + return std::sqrt(m_HighFrequency2); + } + + /** Get the correlation surface. + * + * Use method appropriate to the type (real/complex) of optimizer. If the + * complex optimizer is used, the real correlation surface is not available + * or is not up-to-date. + */ + virtual RealImageType * + GetRealCorrelationSurface() + { + itkDebugMacro("returning RealCorrelationSurface address " << this->m_IFFT->GetOutput()); + if (m_IFFT.IsNotNull()) + { + return m_IFFT->GetOutput(); + } + else + { + return nullptr; + } + } + virtual ComplexConjugateImageType * + GetComplexCorrelationSurface() + { + itkDebugMacro("returning ComplexCorrelationSurface address " << this->m_Operator->GetOutput()); + if (m_Operator.IsNotNull()) + { + return m_Operator->GetOutput(); + } + else + { + return nullptr; + } + } + + /** Get the computed transformation parameters. */ + itkGetConstReferenceMacro(TransformParameters, ParametersType); + + /** Returns the transform resulting from the registration process */ + const TransformOutputType * + GetOutput() const; + + /** Returns the phase correlation image from the registration process */ + const RealImageType * + GetPhaseCorrelationImage() const; + + /** Resulting vector of offsets. */ + using OffsetVector = typename OptimizerType::OffsetVector; + + /** Get the computed offsets. */ + virtual const OffsetVector & + GetOffsets() const + { + return m_Optimizer->GetOffsets(); + } + + /** Confidences corresponding to offsets. */ + using ConfidencesVector = typename OptimizerType::ConfidenceVector; + + /** Get the confidences corresponding to offsets. */ + virtual const ConfidencesVector & + GetConfidences() const + { + return m_Optimizer->GetConfidences(); + } + +#ifdef ITK_USE_CONCEPT_CHECKING + static constexpr unsigned int MovingImageDimension = FixedImageType::ImageDimension; + /** Start concept checking */ + itkConceptMacro(SameDimensionCheck, (Concept::SameDimension)); +#endif + +protected: + PhaseCorrelationImageRegistrationMethod(); + ~PhaseCorrelationImageRegistrationMethod() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + using Superclass::MakeOutput; + + /** Make a DataObject of the correct type to be used as the specified + * output. */ + DataObjectPointer + MakeOutput(DataObjectPointerArraySizeType idx) override; + + /** Initialize by setting the interconnects between the components. */ + virtual void + Initialize(); + + /** Determine the correct padding for the fixed image and moving image. */ + void + DeterminePadding(); + + /** Method that initiates the optimization process. */ + void + StartOptimization(); + + /** Method invoked by the pipeline in order to trigger the computation of + * the registration. */ + void + GenerateData() override; + + /** Method invoked by the pipeline to determine the output information. */ + void + GenerateOutputInformation() override; + + /** Provides derived classes with the ability to set this private var */ + itkSetMacro(TransformParameters, ParametersType); + + + /** Types for internal componets. */ + using FixedRoIType = RegionOfInterestImageFilter; + using MovingRoIType = RegionOfInterestImageFilter; + using FixedPadderImageFilter = PadImageFilter; + using MovingPadderImageFilter = PadImageFilter; + using FixedConstantPadderType = ConstantPadImageFilter; + using MovingConstantPadderType = ConstantPadImageFilter; + using FixedMirrorPadderType = MirrorPadImageFilter; + using MovingMirrorPadderType = MirrorPadImageFilter; + using IFFTFilterType = HalfHermitianToRealInverseFFTImageFilter; + using BandBassFilterType = + UnaryFrequencyDomainFilter>; + using FrequencyFunctorType = std::function; + + const FrequencyFunctorType m_IdentityFunctor = [](typename BandBassFilterType::FrequencyIteratorType &) {}; + FrequencyFunctorType m_BandPassFunctor; + FrequencyFunctorType m_HighPassFunctor; + FrequencyFunctorType m_LowPassFunctor; + +private: + OperatorPointer m_Operator = nullptr; + OptimizerPointer m_Optimizer = nullptr; + + MovingImageConstPointer m_MovingImage = nullptr; + FixedImageConstPointer m_FixedImage = nullptr; + + typename ComplexImageType::Pointer m_FixedImageFFT = nullptr; + typename ComplexImageType::Pointer m_MovingImageFFT = nullptr; + + ParametersType m_TransformParameters; + SizeType m_PadToSize; + SizeType m_ObligatoryPadding; + PaddingMethodEnum m_PaddingMethod = PaddingMethodEnum::MirrorWithExponentialDecay; + + typename FixedRoIType::Pointer m_FixedRoI = FixedRoIType::New(); + typename MovingRoIType::Pointer m_MovingRoI = MovingRoIType::New(); + typename FixedPadderImageFilter::Pointer m_FixedPadder = FixedPadderImageFilter::New(); + typename MovingPadderImageFilter::Pointer m_MovingPadder = MovingPadderImageFilter::New(); + typename FixedConstantPadderType::Pointer m_FixedConstantPadder = FixedConstantPadderType::New(); + typename MovingConstantPadderType::Pointer m_MovingConstantPadder = MovingConstantPadderType::New(); + typename FixedMirrorPadderType::Pointer m_FixedMirrorPadder = FixedMirrorPadderType::New(); + typename MovingMirrorPadderType::Pointer m_MovingMirrorPadder = MovingMirrorPadderType::New(); + typename FixedMirrorPadderType::Pointer m_FixedMirrorWEDPadder = FixedMirrorPadderType::New(); + typename MovingMirrorPadderType::Pointer m_MovingMirrorWEDPadder = MovingMirrorPadderType::New(); + typename BandBassFilterType::Pointer m_BandPassFilter = BandBassFilterType::New(); + + bool m_CropToOverlap = true; + unsigned m_ButterworthOrder = 3; + double m_LowFrequency2 = 0.0004; // 0.02^2 // square of low frequency threshold + double m_HighFrequency2 = 0.09; // 0.3^2 // square of high frequency threshold + + typename FFTFilterType::Pointer m_FixedFFT = FFTFilterType::New(); + typename FFTFilterType::Pointer m_MovingFFT = FFTFilterType::New(); + typename IFFTFilterType::Pointer m_IFFT = IFFTFilterType::New(); +}; + +} // end namespace itk + + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkPhaseCorrelationImageRegistrationMethod.hxx" +#endif + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.hxx b/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.hxx new file mode 100644 index 000000000000..3a871a1e994f --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationImageRegistrationMethod.hxx @@ -0,0 +1,723 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationImageRegistrationMethod_hxx +#define itkPhaseCorrelationImageRegistrationMethod_hxx + + +#include "itkMath.h" +#include "itkNumericTraits.h" + +#include +#include + +namespace itk +{ +template +PhaseCorrelationImageRegistrationMethod:: + PhaseCorrelationImageRegistrationMethod() +{ + this->SetNumberOfRequiredInputs(2); + this->SetNumberOfRequiredOutputs(2); // for 0-the Transform, 1-the phase correlation image + + m_BandPassFilter->SetFunctor(m_IdentityFunctor); + + m_FixedConstantPadder->SetConstant(NumericTraits::Zero); + m_MovingConstantPadder->SetConstant(NumericTraits::Zero); + m_FixedMirrorWEDPadder->SetDecayBase(0.75); + m_MovingMirrorWEDPadder->SetDecayBase(0.75); + + m_BandPassFunctor = [this](typename BandBassFilterType::FrequencyIteratorType & freqIt) { + double f2 = freqIt.GetFrequencyModuloSquare(); // square of scalar frequency + freqIt.Value() *= 1.0 - 1.0 / (1.0 + std::pow(f2 / this->m_LowFrequency2, this->m_ButterworthOrder)); + freqIt.Value() /= 1.0 + std::pow(f2 / this->m_HighFrequency2, this->m_ButterworthOrder); + }; + m_HighPassFunctor = [this](typename BandBassFilterType::FrequencyIteratorType & freqIt) { + double f2 = freqIt.GetFrequencyModuloSquare(); // square of scalar frequency + freqIt.Value() *= 1.0 - 1.0 / (1.0 + std::pow(f2 / this->m_LowFrequency2, this->m_ButterworthOrder)); + }; + m_LowPassFunctor = [this](typename BandBassFilterType::FrequencyIteratorType & freqIt) { + double f2 = freqIt.GetFrequencyModuloSquare(); // square of scalar frequency + freqIt.Value() /= 1.0 + std::pow(f2 / this->m_HighFrequency2, this->m_ButterworthOrder); + }; + + m_PadToSize.Fill(0); + m_ObligatoryPadding.Fill(8); + m_PaddingMethod = PaddingMethodEnum::Zero; // make sure the next call does modifications + SetPaddingMethod(PaddingMethodEnum::MirrorWithExponentialDecay); // this initializes a few things + + m_TransformParameters = ParametersType(ImageDimension); + m_TransformParameters.Fill(0.0f); + + TransformOutputPointer transformDecorator = static_cast(this->MakeOutput(0).GetPointer()); + this->ProcessObject::SetNthOutput(0, transformDecorator.GetPointer()); + + typename RealImageType::Pointer phaseCorrelation = static_cast(this->MakeOutput(1).GetPointer()); + this->ProcessObject::SetNthOutput(1, phaseCorrelation.GetPointer()); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetPaddingMethod( + const PaddingMethodEnum paddingMethod) +{ + if (this->m_PaddingMethod != paddingMethod) + { + this->m_PaddingMethod = paddingMethod; + + switch (paddingMethod) + { + case PaddingMethodEnum::Zero: + m_FixedPadder = m_FixedConstantPadder; + m_MovingPadder = m_MovingConstantPadder; + break; + case PaddingMethodEnum::Mirror: + m_FixedPadder = m_FixedMirrorPadder; + m_MovingPadder = m_MovingMirrorPadder; + break; + case PaddingMethodEnum::MirrorWithExponentialDecay: + m_FixedPadder = m_FixedMirrorWEDPadder; + m_MovingPadder = m_MovingMirrorWEDPadder; + break; + default: + itkExceptionMacro("Unknown padding method"); + break; + } + + m_FixedFFT->SetInput(m_FixedPadder->GetOutput()); + m_MovingFFT->SetInput(m_MovingPadder->GetOutput()); + this->Modified(); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::Initialize() +{ + itkDebugMacro("initializing registration"); + if (!m_FixedImage) + { + itkExceptionMacro(<< "FixedImage is not present"); + } + if (!m_MovingImage) + { + itkExceptionMacro(<< "MovingImage is not present"); + } + if (!m_Operator) + { + itkExceptionMacro(<< "Operator is not present"); + } + if (!m_Optimizer) + { + itkExceptionMacro(<< "Optimizer is not present"); + } + + // Connect new transform to the Decorator if necessary. + TransformOutputPointer transformOutput(static_cast(this->ProcessObject::GetOutput(0))); + TransformPointer transform(const_cast(transformOutput->Get())); + + if (transform.IsNull()) + { + transform = TransformType::New(); + transformOutput->Set(transform.GetPointer()); + } + + // set up the pipeline + m_FixedRoI->SetInput(m_FixedImage); + m_MovingRoI->SetInput(m_MovingImage); + if (m_CropToOverlap) + { + m_FixedPadder->SetInput(m_FixedRoI->GetOutput()); + m_MovingPadder->SetInput(m_MovingRoI->GetOutput()); + } + else + { + m_FixedPadder->SetInput(m_FixedImage); + m_MovingPadder->SetInput(m_MovingImage); + } + if (m_FixedImageFFT.IsNull()) + { + m_Operator->SetFixedImage(m_FixedFFT->GetOutput()); + } + else + { + m_Operator->SetFixedImage(m_FixedImageFFT); + } + if (m_MovingImageFFT.IsNull()) + { + m_Operator->SetMovingImage(m_MovingFFT->GetOutput()); + } + else + { + m_Operator->SetMovingImage(m_MovingImageFFT); + } + m_BandPassFilter->SetInput(m_Operator->GetOutput()); + + using ImageFilter = ImageToImageFilter; + ImageFilter * finalOperatorFilter = m_BandPassFilter; + + if (m_LowFrequency2 > 0.0 && m_HighFrequency2 > 0.0) + { + m_BandPassFilter->SetFunctor(m_BandPassFunctor); + } + else if (m_HighFrequency2 > 0.0) + { + m_BandPassFilter->SetFunctor(m_HighPassFunctor); + } + else if (m_LowFrequency2 > 0.0) + { + m_BandPassFilter->SetFunctor(m_LowPassFunctor); + } + else // neither high nor low filtering is set + { + m_BandPassFilter->SetFunctor(m_IdentityFunctor); + finalOperatorFilter = m_Operator; // we skip the band-pass entirely + } + + m_Optimizer->SetComplexInput(finalOperatorFilter->GetOutput()); + m_IFFT->SetInput(finalOperatorFilter->GetOutput()); + m_Optimizer->SetRealInput(m_IFFT->GetOutput()); + if (m_CropToOverlap) + { + m_Optimizer->SetFixedImage(m_FixedRoI->GetOutput()); + m_Optimizer->SetMovingImage(m_MovingRoI->GetOutput()); + } + else + { + m_Optimizer->SetFixedImage(m_FixedImage); + m_Optimizer->SetMovingImage(m_MovingImage); + } +} + + +template +auto +PhaseCorrelationImageRegistrationMethod::RoundUpToFFTSize(SizeType size) + -> SizeType +{ + // FFTs are faster when image size can be factorized using smaller prime numbers + const auto sizeGreatestPrimeFactor = std::min(5, m_FixedFFT->GetSizeGreatestPrimeFactor()); + + for (unsigned int d = 0; d < ImageDimension; ++d) + { + if (sizeGreatestPrimeFactor > 1) + { + while (Math::GreatestPrimeFactor(size[d]) > sizeGreatestPrimeFactor) + { + ++size[d]; + } + } + else if (sizeGreatestPrimeFactor == 1) + { + // make sure the total size is even + size[d] += size[d] % 2; + } + } + + return size; +} + +template +void +PhaseCorrelationImageRegistrationMethod::DeterminePadding() +{ + const SizeType fixedSize = m_FixedImage->GetLargestPossibleRegion().GetSize(); + const SizeType movingSize = m_MovingImage->GetLargestPossibleRegion().GetSize(); + const SizeType size0 = SizeType::Filled(0); + SizeType fftSize, fixedPad, movingPad; + + if (m_CropToOverlap) + { + typename MovingImageType::RegionType fRegion = m_FixedImage->GetLargestPossibleRegion(); + typename MovingImageType::RegionType mRegion = m_MovingImage->GetLargestPossibleRegion(); + typename MovingImageType::SpacingType spacing = m_MovingImage->GetSpacing(); + typename MovingImageType::IndexType shiftIndex, fIndex; + typename MovingImageType::IndexType mIndex = mRegion.GetIndex(); + + auto originShift = m_MovingImage->GetOrigin() - m_FixedImage->GetOrigin(); + for (unsigned int d = 0; d < ImageDimension; ++d) + { + shiftIndex[d] = std::round(originShift[d] / spacing[d]); + mIndex[d] += shiftIndex[d]; + } + mRegion.SetIndex(mIndex); + fRegion.Crop(mRegion); + + // now expand this region somewhat + SizeType iSize = fRegion.GetSize(); + fIndex = fRegion.GetIndex(); + SizeType extraPadding; + std::array padCandidates; + for (unsigned int d = 0; d < ImageDimension; ++d) + { + padCandidates[0] = 16; // a fixed 16-pixel padding + padCandidates[1] = std::ceil(iSize[d] / 2); // 50% of overlapping region + padCandidates[2] = std::min(fixedSize[d], movingSize[d]) / 100; // 1% of smaller image's size + std::sort(padCandidates.begin(), padCandidates.end()); + extraPadding[d] = padCandidates[1]; // pick median + + // clip it to actual image sizes + if (extraPadding[d] + iSize[d] > fixedSize[d]) + { + extraPadding[d] = fixedSize[d] - iSize[d]; + } + if (extraPadding[d] + iSize[d] > movingSize[d]) + { + extraPadding[d] = movingSize[d] - iSize[d]; + } + + // expand regions appropriately + iSize[d] += extraPadding[d]; + if (shiftIndex[d] > 0) // fixed is to the "left" of moving + { + fIndex[d] -= extraPadding[d]; + mIndex[d] = 0; + } + else + { + mIndex[d] = movingSize[d] - iSize[d]; + } + } + + // construct regions from indices and size + fRegion.SetIndex(fIndex); + fRegion.SetSize(iSize); + mRegion.SetIndex(mIndex); + mRegion.SetSize(iSize); + m_FixedRoI->SetRegionOfInterest(fRegion); + m_MovingRoI->SetRegionOfInterest(mRegion); + + for (unsigned int d = 0; d < ImageDimension; ++d) + { + fftSize[d] = iSize[d] + 2 * m_ObligatoryPadding[d]; + } + fftSize = RoundUpToFFTSize(fftSize); + for (unsigned int d = 0; d < ImageDimension; ++d) + { + fixedPad[d] = (fftSize[d] - iSize[d]) - m_ObligatoryPadding[d]; + movingPad[d] = (fftSize[d] - iSize[d]) - m_ObligatoryPadding[d]; + } + } + else // do not crop to overlap + { + if (m_PadToSize == size0) + { + // set up padding to resize the images to the same size + SizeType maxSize; + + for (unsigned int d = 0; d < ImageDimension; ++d) + { + if (fixedSize[d] >= movingSize[d]) + { + maxSize[d] = fixedSize[d]; + } + else + { + maxSize[d] = movingSize[d]; + } + // we need to pad on both ends along this dimension + maxSize[d] += 2 * m_ObligatoryPadding[d]; + } + + fftSize = RoundUpToFFTSize(maxSize); + } + else + { + fftSize = m_PadToSize; + } + + SizeType fftHalf = fftSize; + fftHalf[0] = fftSize[0] / 2 + 1; + if (m_FixedImageFFT.IsNotNull()) + { + SizeType fftCached = m_FixedImageFFT->GetLargestPossibleRegion().GetSize(); + itkAssertOrThrowMacro(fftCached == fftHalf, + "FixedImage's cached FFT (" << fftCached << ") must have the common padded size: " + << fftSize << " halved in first dimension: " << fftHalf); + } + if (m_MovingImageFFT.IsNotNull()) + { + SizeType fftCached = m_MovingImageFFT->GetLargestPossibleRegion().GetSize(); + itkAssertOrThrowMacro(fftCached == fftHalf, + "MovingImage's cached FFT (" << fftCached << ") must have the common padded size: " + << fftSize << " halved in first dimension: " << fftHalf); + } + + for (unsigned int d = 0; d < ImageDimension; ++d) + { + if (fixedSize[d] + 2 * m_ObligatoryPadding[d] > fftSize[d]) + { + itkExceptionMacro("PadToSize(" << fftSize[d] << ") for dimension " << d + << " must be larger than fixed image size (" << fixedSize[d] << ")" + << " and twice the obligatory padding (" << m_ObligatoryPadding[d] << ")"); + } + fixedPad[d] = (fftSize[d] - fixedSize[d]) - m_ObligatoryPadding[d]; + if (movingSize[d] + 2 * m_ObligatoryPadding[d] > fftSize[d]) + { + itkExceptionMacro("PadToSize(" << fftSize[d] << ") for dimension " << d + << " must be larger than moving image size (" << movingSize[d] << ")" + << " and twice the obligatory padding (" << m_ObligatoryPadding[d] << ")"); + } + movingPad[d] = (fftSize[d] - movingSize[d]) - m_ObligatoryPadding[d]; + } + } + + m_FixedPadder->SetPadLowerBound(m_ObligatoryPadding); + m_MovingPadder->SetPadLowerBound(m_ObligatoryPadding); + m_FixedPadder->SetPadUpperBound(fixedPad); + m_MovingPadder->SetPadUpperBound(movingPad); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::StartOptimization() +{ + ParametersType empty(ImageDimension); + empty.Fill(0.0); + m_TransformParameters = empty; + itkDebugMacro("starting optimization"); + using OffsetType = typename OptimizerType::OffsetType; + OffsetType offset; + try + { + if (this->GetDebug()) + { + WriteDebug(m_FixedImage.GetPointer(), "m_FixedImage.nrrd"); + WriteDebug(m_MovingImage.GetPointer(), "m_MovingImage.nrrd"); + WriteDebug(m_FixedPadder->GetOutput(), "m_FixedPadder.nrrd"); + WriteDebug(m_MovingPadder->GetOutput(), "m_MovingPadder.nrrd"); + WriteDebug(m_FixedFFT->GetOutput(), "m_FixedFFT.nrrd"); + WriteDebug(m_MovingFFT->GetOutput(), "m_MovingFFT.nrrd"); + if (m_CropToOverlap) + { + WriteDebug(m_FixedRoI->GetOutput(), "m_FixedRoI.nrrd"); + WriteDebug(m_MovingRoI->GetOutput(), "m_MovingRoI.nrrd"); + } + } + + m_FixedPadder->UpdateOutputInformation(); // to make sure xSize is valid + unsigned xSize = m_FixedPadder->GetOutput()->GetLargestPossibleRegion().GetSize(0); + m_IFFT->SetActualXDimensionIsOdd(xSize % 2 != 0); + auto * phaseCorrelation = static_cast(this->ProcessObject::GetOutput(1)); + phaseCorrelation->Allocate(); + m_IFFT->GraftOutput(phaseCorrelation); + m_IFFT->Update(); + + const unsigned offsetCount = ImageDimension; + m_Optimizer->SetOffsetCount(offsetCount); // update can reduce this, so we have to set it each time + m_Optimizer->Update(); + offset = m_Optimizer->GetOffsets()[0]; + phaseCorrelation->Graft(m_IFFT->GetOutput()); + + if (m_FixedImageFFT.IsNull()) + { + m_FixedImageFFT = m_FixedFFT->GetOutput(); + m_FixedImageFFT->DisconnectPipeline(); + } + if (m_MovingImageFFT.IsNull()) + { + m_MovingImageFFT = m_MovingFFT->GetOutput(); + m_MovingImageFFT->DisconnectPipeline(); + } + + if (this->GetDebug()) + { + WriteDebug(m_IFFT->GetOutput(), "m_IFFT.nrrd"); + WriteDebug(m_BandPassFilter->GetOutput(), "m_BandPassFilter.nrrd"); + WriteDebug(m_Operator->GetOutput(), "m_Operator.nrrd"); + + // now do banpass of input images and inverse FFT + m_IFFT->SetInput(m_BandPassFilter->GetOutput()); + m_BandPassFilter->SetInput(m_FixedFFT->GetOutput()); + typename RealImageType::Pointer invImage = m_IFFT->GetOutput(); + invImage->Update(); + invImage->DisconnectPipeline(); + invImage->CopyInformation(m_FixedPadder->GetOutput()); + WriteDebug(invImage.GetPointer(), "iFixed.nrrd"); + m_BandPassFilter->SetInput(m_MovingFFT->GetOutput()); + invImage = m_IFFT->GetOutput(); + invImage->Update(); + invImage->DisconnectPipeline(); + invImage->CopyInformation(m_MovingPadder->GetOutput()); + WriteDebug(invImage.GetPointer(), "iMoving.nrrd"); + } + } + catch (ExceptionObject & err) + { + // Pass exception to caller + itkDebugMacro("exception caught during optimization - passing"); + throw err; + } + itkDebugMacro("optimization finished"); + + m_TransformParameters = ParametersType(ImageDimension); + for (unsigned int i = 0; i < ImageDimension; ++i) + { + m_TransformParameters[i] = offset[i]; + } + + // set the output transform + auto * transformOutput = static_cast(this->ProcessObject::GetOutput(0)); + TransformPointer transform(const_cast(transformOutput->Get())); + transform->SetParameters(m_TransformParameters); + + itkDebugMacro("output set to " << transform); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::PrintSelf(std::ostream & os, + Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "Operator: " << m_Operator.GetPointer() << std::endl; + os << indent << "Optimizer: " << m_Optimizer.GetPointer() << std::endl; + os << indent << "Fixed Padder: " << m_FixedPadder.GetPointer() << std::endl; + os << indent << "Moving Padder: " << m_MovingPadder.GetPointer() << std::endl; + + os << indent << "Pad To Size: " << m_PadToSize << std::endl; + os << indent << "Obligatory Padding: " << m_ObligatoryPadding << std::endl; + switch (m_PaddingMethod) + { + case PaddingMethodEnum::Zero: + os << indent << "Padding Method: " + << "Zero" << std::endl; + break; + case PaddingMethodEnum::Mirror: + os << indent << "Padding Method: " + << "Mirror" << std::endl; + break; + case PaddingMethodEnum::MirrorWithExponentialDecay: + os << indent << "Padding Method: " + << "MirrorWithExponentialDecay" << std::endl; + break; + default: + os << indent << "Padding Method: " + << "Unknown" << std::endl; + break; + } + + os << indent << "Crop To Overlap: " << m_CropToOverlap << std::endl; + os << indent << "Butterworth Order: " << m_ButterworthOrder << std::endl; + os << indent << "Low Frequency: " << this->GetButterworthLowFrequency() << std::endl; + os << indent << "High Frequency: " << this->GetButterworthHighFrequency() << std::endl; + + os << indent << "Fixed Image: " << m_FixedImage.GetPointer() << std::endl; + os << indent << "Moving Image: " << m_MovingImage.GetPointer() << std::endl; + os << indent << "Fixed Image FFT: " << m_FixedImageFFT.GetPointer() << std::endl; + os << indent << "Moving Image FFT: " << m_MovingImageFFT.GetPointer() << std::endl; + os << indent << "Transform Parameters: " << m_TransformParameters << std::endl; + + typename TransformType::ConstPointer t(this->GetOutput()->Get()); + os << indent << "Output transform: " << t.GetPointer() << std::endl; +} + + +template +void +PhaseCorrelationImageRegistrationMethod::GenerateOutputInformation() +{ + Superclass::GenerateOutputInformation(); + + this->Initialize(); + this->DeterminePadding(); + + if (m_FixedImage->GetSpacing() != m_MovingImage->GetSpacing()) + { + itkExceptionMacro("Fixed image and moving image must have the same spacing!\nFixed spacing: " + << m_FixedImage->GetSpacing() << "\nMoving spacing: " << m_MovingImage->GetSpacing()); + } + if (m_FixedImage->GetDirection() != m_MovingImage->GetDirection()) + { + itkExceptionMacro("Fixed image and moving image must have the same direction!\nFixed direction:\n" + << m_FixedImage->GetDirection() << "\nMoving direction:\n" + << m_MovingImage->GetDirection()); + } + + m_IFFT->UpdateOutputInformation(); + + auto * phaseCorrelation = static_cast(this->ProcessObject::GetOutput(1)); + phaseCorrelation->CopyInformation(m_IFFT->GetOutput()); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::GenerateData() +{ + this->Initialize(); + this->StartOptimization(); +} + + +template +const typename PhaseCorrelationImageRegistrationMethod:: + TransformOutputType * + PhaseCorrelationImageRegistrationMethod::GetOutput() const +{ + return static_cast(this->ProcessObject::GetOutput(0)); +} + + +template +const typename PhaseCorrelationImageRegistrationMethod::RealImageType * +PhaseCorrelationImageRegistrationMethod::GetPhaseCorrelationImage() const +{ + return static_cast(this->ProcessObject::GetOutput(1)); +} + + +template +DataObject::Pointer +PhaseCorrelationImageRegistrationMethod::MakeOutput( + DataObjectPointerArraySizeType output) +{ + switch (output) + { + case 0: + return static_cast(TransformOutputType::New().GetPointer()); + break; + case 1: + return static_cast(RealImageType::New().GetPointer()); + break; + default: + itkExceptionMacro("MakeOutput request for an output number larger than the expected number of outputs"); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetFixedImage( + const FixedImageType * fixedImage) +{ + itkDebugMacro("setting Fixed Image to " << fixedImage); + if (this->m_FixedImage.GetPointer() != fixedImage) + { + this->m_FixedImage = fixedImage; + this->m_FixedImageFFT = nullptr; // clear cached FFT + // Process object is not const-correct so the const_cast is required here + this->ProcessObject::SetNthInput(0, const_cast(fixedImage)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetMovingImage( + const MovingImageType * movingImage) +{ + itkDebugMacro("setting Moving Image to " << movingImage); + if (this->m_MovingImage.GetPointer() != movingImage) + { + this->m_MovingImage = movingImage; + this->m_MovingImageFFT = nullptr; // clear cached FFT + // Process object is not const-correct so the const_cast is required here + this->ProcessObject::SetNthInput(1, const_cast(movingImage)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetFixedImageFFT( + const ComplexImageType * fixedImageFFT) +{ + itkDebugMacro("setting fixedImageFFT Image to " << fixedImageFFT); + if (this->m_FixedImageFFT.GetPointer() != fixedImageFFT) + { + this->m_FixedImageFFT = const_cast(fixedImageFFT); + this->Modified(); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetMovingImageFFT( + const ComplexImageType * movingImageFFT) +{ + itkDebugMacro("setting movingImageFFT Image to " << movingImageFFT); + if (this->m_MovingImageFFT.GetPointer() != movingImageFFT) + { + this->m_MovingImageFFT = const_cast(movingImageFFT); + this->Modified(); + } +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetReleaseDataFlag(bool a_flag) +{ + Superclass::SetReleaseDataFlag(a_flag); + m_FixedRoI->SetReleaseDataFlag(a_flag); + m_MovingRoI->SetReleaseDataFlag(a_flag); + m_FixedConstantPadder->SetReleaseDataFlag(a_flag); + m_MovingConstantPadder->SetReleaseDataFlag(a_flag); + m_FixedMirrorPadder->SetReleaseDataFlag(a_flag); + m_MovingMirrorPadder->SetReleaseDataFlag(a_flag); + m_FixedMirrorWEDPadder->SetReleaseDataFlag(a_flag); + m_MovingMirrorWEDPadder->SetReleaseDataFlag(a_flag); + m_FixedFFT->SetReleaseDataFlag(a_flag); + m_MovingFFT->SetReleaseDataFlag(a_flag); + m_IFFT->SetReleaseDataFlag(a_flag); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetReleaseDataBeforeUpdateFlag( + bool a_flag) +{ + Superclass::SetReleaseDataBeforeUpdateFlag(a_flag); + m_FixedRoI->SetReleaseDataBeforeUpdateFlag(a_flag); + m_MovingRoI->SetReleaseDataBeforeUpdateFlag(a_flag); + m_FixedConstantPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_MovingConstantPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_FixedMirrorPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_MovingMirrorPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_FixedMirrorWEDPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_MovingMirrorWEDPadder->SetReleaseDataBeforeUpdateFlag(a_flag); + m_FixedFFT->SetReleaseDataBeforeUpdateFlag(a_flag); + m_MovingFFT->SetReleaseDataBeforeUpdateFlag(a_flag); + m_IFFT->SetReleaseDataBeforeUpdateFlag(a_flag); +} + + +template +void +PhaseCorrelationImageRegistrationMethod::SetOptimizer( + OptimizerType * optimizer) +{ + itkDebugMacro("setting Optimizer to " << optimizer); + if (this->m_Optimizer != optimizer) + { + this->m_Optimizer = optimizer; + this->Modified(); + } +} + +} // end namespace itk + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.h b/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.h new file mode 100644 index 000000000000..4742a3c8b989 --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.h @@ -0,0 +1,112 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationOperator_h +#define itkPhaseCorrelationOperator_h + +#include "itkImageToImageFilter.h" +#include + +namespace itk +{ +/** \class PhaseCorrelationOperator + * \brief Computes the spectrum ratio in phase correlation method. + * + * The class is templated over the type of the real-valued pixel it will be + * operating on and the image dimension. + * + * This frequency ratio is computed at every index of output correlation + * surface. + * + * \author Jakub Bican, jakub.bican@matfyz.cz, Department of Image Processing, + * Institute of Information Theory and Automation, + * Academy of Sciences of the Czech Republic. + * + * \ingroup Montage + */ +template +class ITK_TEMPLATE_EXPORT PhaseCorrelationOperator + : public ImageToImageFilter, VImageDimension>, + Image, VImageDimension>> +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(PhaseCorrelationOperator); + + using Self = PhaseCorrelationOperator; + using Superclass = ImageToImageFilter, VImageDimension>, + Image, VImageDimension>>; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + using BandPassPointsType = FixedArray; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(PhaseCorrelationOperator); + + /** ImageDimension enumeration. */ + static constexpr unsigned int ImageDimension = VImageDimension; + + /** Image type aliases. */ + using PixelType = TRealPixel; + using ComplexType = std::complex; + using ImageType = Image; + using ImagePointer = typename ImageType::Pointer; + using ImageConstPointer = typename ImageType::ConstPointer; + using OutputImageRegionType = typename Superclass::OutputImageRegionType; + + /** Connect the fixed image. */ + void + SetFixedImage(ImageType * fixedImage); + + /** Connect the moving image. */ + void + SetMovingImage(ImageType * movingImage); + +protected: + PhaseCorrelationOperator(); + ~PhaseCorrelationOperator() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + /** PhaseCorrelationOperator produces an image which is a different + * resolution and with a different pixel spacing than its input + * images. */ + void + GenerateOutputInformation() override; + + /** PhaseCorrelationOperator needs a larger input requested region than the + * output requested region. */ + void + GenerateInputRequestedRegion() override; + void + EnlargeOutputRequestedRegion(DataObject * output) override; + + /** PhaseCorrelationOperator can be implemented as a multithreaded filter. + * This method performs the computation. */ + void + DynamicThreadedGenerateData(const OutputImageRegionType & outputRegionForThread) override; +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkPhaseCorrelationOperator.hxx" +#endif + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.hxx b/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.hxx new file mode 100644 index 000000000000..6394cdf8ecff --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationOperator.hxx @@ -0,0 +1,223 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationOperator_hxx +#define itkPhaseCorrelationOperator_hxx + + +#include "itkImageScanlineIterator.h" +#include "itkMetaDataObject.h" + +namespace itk +{ +/* + * \author Jakub Bican, jakub.bican@matfyz.cz, Department of Image Processing, + * Institute of Information Theory and Automation, + * Academy of Sciences of the Czech Republic. + * + */ + + +template +PhaseCorrelationOperator::PhaseCorrelationOperator() +{ + this->SetNumberOfRequiredInputs(2); +} + + +template +void +PhaseCorrelationOperator::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); +} + + +template +void +PhaseCorrelationOperator::SetFixedImage(ImageType * fixedImage) +{ + this->SetNthInput(0, const_cast(fixedImage)); +} + + +template +void +PhaseCorrelationOperator::SetMovingImage(ImageType * movingImage) +{ + this->SetNthInput(1, const_cast(movingImage)); +} + + +template +void +PhaseCorrelationOperator::DynamicThreadedGenerateData( + const OutputImageRegionType & outputRegionForThread) +{ + // Get the input and output pointers + ImageConstPointer fixed = this->GetInput(0); + ImageConstPointer moving = this->GetInput(1); + ImagePointer output = this->GetOutput(); + + // Define an iterator that will walk the output region for this thread. + using InputIterator = ImageScanlineConstIterator; + using OutputIterator = ImageScanlineIterator; + InputIterator fixedIt(fixed, outputRegionForThread); + InputIterator movingIt(moving, outputRegionForThread); + OutputIterator outIt(output, outputRegionForThread); + + // walk the output region, and sample the input image + while (!outIt.IsAtEnd()) + { + while (!outIt.IsAtEndOfLine()) + { + // compute the phase correlation + const PixelType real = + fixedIt.Value().real() * movingIt.Value().real() + fixedIt.Value().imag() * movingIt.Value().imag(); + const PixelType imag = + fixedIt.Value().imag() * movingIt.Value().real() - fixedIt.Value().real() * movingIt.Value().imag(); + const PixelType magn = std::sqrt(real * real + imag * imag); + + if (magn != 0) + { + outIt.Set(ComplexType(real / magn, imag / magn)); + } + else + { + outIt.Set(ComplexType(0, 0)); + } + + ++fixedIt; + ++movingIt; + ++outIt; + } + fixedIt.NextLine(); + movingIt.NextLine(); + outIt.NextLine(); + } +} + + +template +void +PhaseCorrelationOperator::GenerateInputRequestedRegion() +{ + /** + * Request all available data. This filter is cropping from the center. + */ + + // call the superclass' implementation of this method + Superclass::GenerateInputRequestedRegion(); + + // get pointers to the inputs + ImagePointer fixed = const_cast(this->GetInput(0)); + ImagePointer moving = const_cast(this->GetInput(1)); + + if (!fixed || !moving) + { + return; + } + + fixed->SetRequestedRegion(fixed->GetLargestPossibleRegion()); + moving->SetRequestedRegion(moving->GetLargestPossibleRegion()); +} + + +template +void +PhaseCorrelationOperator::GenerateOutputInformation() +{ + /** + * The output will have the lower size of the two input images in all + * dimensions. + */ + + // call the superclass' implementation of this method + Superclass::GenerateOutputInformation(); + + // get pointers to the inputs and output + ImageConstPointer fixed = this->GetInput(0); + ImageConstPointer moving = this->GetInput(1); + ImagePointer output = this->GetOutput(); + + if (!fixed || !moving || !output) + { + return; + } + + itkDebugMacro("adjusting size of output image"); + // we need to compute the output spacing, the output image size, + // and the output image start index + const typename ImageType::SpacingType & fixedSpacing = fixed->GetSpacing(); + const typename ImageType::SpacingType & movingSpacing = moving->GetSpacing(); + const typename ImageType::SizeType & fixedSize = fixed->GetLargestPossibleRegion().GetSize(); + const typename ImageType::SizeType & movingSize = moving->GetLargestPossibleRegion().GetSize(); + const typename ImageType::IndexType & fixedStartIndex = fixed->GetLargestPossibleRegion().GetIndex(); + + typename ImageType::SpacingType outputSpacing; + typename ImageType::SizeType outputSize; + typename ImageType::IndexType outputStartIndex; + + for (unsigned i = 0; i < ImageType::ImageDimension; i++) + { + outputSpacing[i] = std::max(fixedSpacing[i], movingSpacing[i]); + outputSize[i] = std::min(fixedSize[i], movingSize[i]); + outputStartIndex[i] = fixedStartIndex[i]; + } + + output->SetSpacing(outputSpacing); + + typename ImageType::RegionType outputLargestPossibleRegion; + outputLargestPossibleRegion.SetSize(outputSize); + outputLargestPossibleRegion.SetIndex(outputStartIndex); + + output->SetLargestPossibleRegion(outputLargestPossibleRegion); + + // Pass the metadata with the actual size of the image. + // The size must be adjusted according to the cropping and scaling + // that will be made on the image! + itkDebugMacro("storing size of pre-FFT image in MetaData"); + using SizeScalarType = typename ImageType::SizeValueType; + + SizeScalarType fixedX = NumericTraits::Zero; + SizeScalarType movingX = NumericTraits::Zero; + SizeScalarType outputX = NumericTraits::Zero; + + auto & fixedDic = const_cast(fixed->GetMetaDataDictionary()); + auto & movingDic = const_cast(moving->GetMetaDataDictionary()); + auto & outputDic = const_cast(output->GetMetaDataDictionary()); + + if (ExposeMetaData(fixedDic, std::string("FFT_Actual_RealImage_Size"), fixedX) && + ExposeMetaData(movingDic, std::string("FFT_Actual_RealImage_Size"), movingX)) + { + outputX = std::min(fixedX, movingX); + EncapsulateMetaData(outputDic, std::string("FFT_Actual_RealImage_Size"), outputX); + } +} + + +template +void +PhaseCorrelationOperator::EnlargeOutputRequestedRegion(DataObject * output) +{ + Superclass::EnlargeOutputRequestedRegion(output); + output->SetRequestedRegionToLargestPossibleRegion(); +} + +} // end namespace itk + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.h b/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.h new file mode 100644 index 000000000000..ee97bae2da47 --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.h @@ -0,0 +1,297 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationOptimizer_h +#define itkPhaseCorrelationOptimizer_h + +#include "itkImage.h" +#include "itkNumericTraits.h" +#include "itkProcessObject.h" +#include "itkSimpleDataObjectDecorator.h" +#include +#include "MontageExport.h" +#include "itkNMinimaMaximaImageCalculator.h" +#include "itkCyclicShiftImageFilter.h" +#include "itkRealToHalfHermitianForwardFFTImageFilter.h" +#include "itkFFTPadImageFilter.h" + +namespace itk +{ + +/** \class PhaseCorrelationOptimizerEnums + * \ingroup Montage + */ +class PhaseCorrelationOptimizerEnums +{ +public: + /** \class PeakInterpolationMethodEnum + * \brief Different methods of interpolation the phase correlation peak. + * \ingroup Montage */ + enum class PeakInterpolationMethod : uint8_t + { + None = 0, + Parabolic = 1, + Cosine = 2, + WeightedMeanPhase = 3, + // PhaseFrequencySlope = 4, + }; + + // For iteration + static const std::initializer_list + AllPeakInterpolationMethods() + { + static constexpr std::initializer_list methods{ + PeakInterpolationMethod::None, + PeakInterpolationMethod::Parabolic, + PeakInterpolationMethod::Cosine, + PeakInterpolationMethod::WeightedMeanPhase, + // PeakInterpolationMethod::PhaseFrequencySlope + }; + return methods; + } +}; + +/** Define how to print enumerations */ +extern Montage_EXPORT std::ostream & +operator<<(std::ostream & out, const PhaseCorrelationOptimizerEnums::PeakInterpolationMethod value); + + +/** \class PhaseCorrelationOptimizer + * + * \brief Defines common interface for optimizers, that estimates the shift + * from correlation surface. + * + * The class is templated over the input phase correlation real pixel type. + * As some optimization methods operate on + * real correlation surface and some on complex correlation surface, both + * input phase correlation images can be set with SetRealInput and SetComplexInput. + * + * The peak interpolation method is defined by SetPeakInterpolationMethod. + * More complex peak interpolation methods use simpler methods as preliminary + * steps. + * + * For PeakInterpolationMethod::None the integer pixel-precision max peaks + * are found. This step operates on the real correlation surface. + * The optimizer finds the maximum peak by NMinimaMaximaImageCalculator, and + * applies constraits from the SetMergePeaks, SetZeroSuppression, and + * SetPixelDistanceTolerance parameters. + * + * For PeakInterpolationMethod::Parabolic or PeakInterpolationMethod::Cosine, + * a sub-pixel peak is found by fitting these functions to the real phase + * correlation surface. + * + * For PeakInterpolationMethod::WeightedMeanPhase, for efficiency, the + * weighted mean phase method is used the first PhaseInterpolated + * number of peaks, and Parabolic interpolation is used for the remaining peaks. + * This approach is summarized in: + * + * https://www.ncbi.nlm.nih.gov/pubmed/31352341 + * + * Power spectrum weighted mean. (Eqn. 10) + * + * Future work may add support for the + * slope of the phase-frequency least squares linear regression. (Eqn. 14) + * + * + * \author Matt McCormick, matt.mccormick@kitware.com, Kitware, Inc + * \author Dženan Zukić, dzenan.zukic@kitware.com, Kitware, Inc + * \author Jakub Bican, jakub.bican@matfyz.cz, Department of Image Processing, + * Institute of Information Theory and Automation, + * Academy of Sciences of the Czech Republic. + * + * \ingroup Montage + */ +template +class ITK_TEMPLATE_EXPORT PhaseCorrelationOptimizer : public ProcessObject +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(PhaseCorrelationOptimizer); + + using Self = PhaseCorrelationOptimizer; + using Superclass = ProcessObject; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(PhaseCorrelationOptimizer); + + /** Type of the inputs. */ + static constexpr unsigned int ImageDimension = VImageDimension; + + using RealPixelType = TRealPixel; + using ComplexPixelType = std::complex; + using ImageType = Image; + using ComplexImageType = Image; + + /** Type for the output parameters. + * It defines a position in the optimization search space. */ + using OffsetType = typename ImageType::PointType; + using OffsetScalarType = typename OffsetType::ValueType; + + /** Type for the output: Using Decorator pattern for enabling + * the offset to be passed in the data pipeline */ + using OffsetOutputType = SimpleDataObjectDecorator; + using OffsetOutputPointer = typename OffsetOutputType::Pointer; + using OffsetOutputConstPointer = typename OffsetOutputType::ConstPointer; + + /** Smart Pointer type to a DataObject. */ + using DataObjectPointer = typename DataObject::Pointer; + + /** Resulting vector of offsets. */ + using OffsetVector = std::vector; + + /** Get the computed offsets. */ + itkGetConstReferenceMacro(Offsets, OffsetVector); + + /** Confidences corresponding to offsets. */ + using ConfidenceVector = std::vector::ValueType>; + + /** Get the confidences corresponding to offsets. */ + itkGetConstReferenceMacro(Confidences, ConfidenceVector); + + /** Sets the fixed image to the optimizer. */ + void + SetFixedImage(const ImageBase * image); + + /** Sets the fixed image to the optimizer. */ + void + SetMovingImage(const ImageBase * image); + + /** Sets the real phase correlation input image to the optimizer. */ + void + SetRealInput(const ImageType * image); + + /** Sets the complex phase correlation input image to the optimizer. */ + void + SetComplexInput(const ComplexImageType * image); + + using PeakInterpolationMethodEnum = PhaseCorrelationOptimizerEnums::PeakInterpolationMethod; + itkGetConstMacro(PeakInterpolationMethod, PeakInterpolationMethodEnum); + void + SetPeakInterpolationMethod(const PeakInterpolationMethodEnum peakInterpolationMethod); + + /** Returns the offset resulting from the registration process */ + const OffsetOutputType * + GetOutput(unsigned index) const + { + return static_cast(this->ProcessObject::GetOutput(index)); + } + + /** Get/Set number of maximums to be computed. + * Resulting count could be smaller than requested! + * After Update is called, check count again. */ + virtual void + SetOffsetCount(unsigned count); + virtual unsigned + GetOffsetCount() const + { + return m_Offsets.size(); + } + + using MaxCalculatorType = NMinimaMaximaImageCalculator; + using IndexContainerType = typename MaxCalculatorType::IndexVector; + + /** Get/Set maximum city-block distance for peak merging. Zero disables it. */ + itkGetConstMacro(MergePeaks, unsigned); + itkSetMacro(MergePeaks, unsigned); + + /** Get/Set suppression aggressiveness of trivial [0,0,...] solution. */ + itkGetConstMacro(ZeroSuppression, double); + itkSetClampMacro(ZeroSuppression, double, 0.0, 100.0); + + /** Get/Set expected maximum linear translation needed, in pixels. + * Zero (the default) has a special meaning: sigmoid scaling + * with half-way point at around quarter of image size. + * Translations can plausibly be up to half an image size. */ + itkGetConstMacro(PixelDistanceTolerance, SizeValueType); + itkSetMacro(PixelDistanceTolerance, SizeValueType); + + /** Get correlation image biased towards the expected solution. */ + itkGetConstObjectMacro(AdjustedInput, ImageType); + + /** Indices of the maxima. */ + itkGetConstReferenceMacro(MaxIndices, IndexContainerType); + + /** Number of peaks to use phase-based sub-sample interpolation with the + * WeightedMeanPhase methods. */ + itkGetConstMacro(PhaseInterpolated, unsigned int); + itkSetMacro(PhaseInterpolated, unsigned int); + +#ifdef ITK_USE_CONCEPT_CHECKING + static_assert(!std::is_same::value, "bool is not supported as RealPixelType"); +#endif + +protected: + PhaseCorrelationOptimizer(); + ~PhaseCorrelationOptimizer() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + /** Method invoked by the pipeline in order to trigger the computation of + * the output values. */ + void + GenerateData() override; + + void + ComputeOffset(); + + using Superclass::MakeOutput; + + /** Make a DataObject of the correct type to be used as the specified + * output. */ + DataObjectPointer + MakeOutput(DataObjectPointerArraySizeType itkNotUsed(idx)) override + { + return static_cast(OffsetOutputType::New().GetPointer()); + } + +private: + PeakInterpolationMethodEnum m_PeakInterpolationMethod = PeakInterpolationMethodEnum::Parabolic; + + OffsetVector m_Offsets; + ConfidenceVector m_Confidences; + + typename MaxCalculatorType::Pointer m_MaxCalculator = MaxCalculatorType::New(); + unsigned m_MergePeaks = 1; + double m_ZeroSuppression = 5; + SizeValueType m_PixelDistanceTolerance = 0; + + typename ImageType::Pointer m_AdjustedInput; + IndexContainerType m_MaxIndices; + + using CyclicShiftFilterType = CyclicShiftImageFilter; + typename CyclicShiftFilterType::Pointer m_CyclicShiftFilter = CyclicShiftFilterType::New(); + + unsigned int m_PhaseInterpolated{ 1 }; + + using PadFilterType = FFTPadImageFilter; + typename PadFilterType::Pointer m_PadFilter = PadFilterType::New(); + + using FFTFilterType = RealToHalfHermitianForwardFFTImageFilter; + typename FFTFilterType::Pointer m_FFTFilter = FFTFilterType::New(); +}; + +} // end namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkPhaseCorrelationOptimizer.hxx" +#endif + +#endif diff --git a/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.hxx b/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.hxx new file mode 100644 index 000000000000..b1b670ab829a --- /dev/null +++ b/Modules/Registration/Montage/include/itkPhaseCorrelationOptimizer.hxx @@ -0,0 +1,645 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#ifndef itkPhaseCorrelationOptimizer_hxx +#define itkPhaseCorrelationOptimizer_hxx + + +#include "itkImageRegionConstIterator.h" +#include "itkImageRegionIteratorWithIndex.h" +#include "itkCompensatedSummation.h" + +#include +#include + +// #ifndef NDEBUG +#include "itkImageFileWriter.h" + +namespace +{ +template +void +WriteDebug(const TImage * out, const char * filename) +{ + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer w = WriterType::New(); + w->SetInput(out); + w->SetFileName(filename); + try + { + w->Update(); + } + catch (itk::ExceptionObject & error) + { + std::cerr << error << std::endl; + } +} +} // namespace +// #else +// namespace +//{ +// template +// void +// WriteDebug(TImage *, const char *) +//{} +// } // namespace +// #endif + +namespace itk +{ + +template +PhaseCorrelationOptimizer::PhaseCorrelationOptimizer() +{ + this->SetNumberOfRequiredInputs(3); + this->SetOffsetCount(4); + + this->m_AdjustedInput = ImageType::New(); + + this->m_PadFilter->SetSizeGreatestPrimeFactor(this->m_FFTFilter->GetSizeGreatestPrimeFactor()); + this->m_CyclicShiftFilter->SetInput(this->m_PadFilter->GetOutput()); + this->m_FFTFilter->SetInput(this->m_CyclicShiftFilter->GetOutput()); +} + + +template +void +PhaseCorrelationOptimizer::SetOffsetCount(unsigned count) +{ + if (m_Offsets.size() != count) + { + this->SetNumberOfRequiredOutputs(count); + for (unsigned i = m_Offsets.size(); i < count; i++) + { + OffsetOutputPointer offsetDecorator = static_cast(this->MakeOutput(i).GetPointer()); + this->ProcessObject::SetNthOutput(i, offsetDecorator.GetPointer()); + } + m_Offsets.resize(count); + + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "Offsets:"; + for (unsigned i = 0; i < m_Offsets.size(); i++) + { + os << " " << m_Offsets[i]; + } + os << indent << "PeakInterpolationMethod: " << m_PeakInterpolationMethod << std::endl; + os << indent << "MaxCalculator: " << m_MaxCalculator << std::endl; + os << indent << "MergePeaks: " << m_MergePeaks << std::endl; + os << indent << "ZeroSuppression: " << m_ZeroSuppression << std::endl; + os << indent << "PixelDistanceTolerance: " << m_PixelDistanceTolerance << std::endl; +} + + +template +void +PhaseCorrelationOptimizer::SetPeakInterpolationMethod( + const PeakInterpolationMethodEnum peakInterpolationMethod) +{ + if (this->m_PeakInterpolationMethod != peakInterpolationMethod) + { + this->m_PeakInterpolationMethod = peakInterpolationMethod; + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::GenerateData() +{ + if (!m_Updating) + { + this->Update(); + } + else + { + OffsetType empty; + empty.Fill(0); + try + { + this->ComputeOffset(); + } + catch (ExceptionObject & err) + { + itkDebugMacro("exception called while computing offset - passing"); + + this->SetOffsetCount(1); + m_Offsets[0] = empty; + + // pass exception to caller + throw err; + } + } + + for (unsigned i = 0; i < m_Offsets.size(); i++) + { + // write the result to the output + auto * output = static_cast(this->ProcessObject::GetOutput(0)); + output->Set(m_Offsets[i]); + } +} + + +template +void +PhaseCorrelationOptimizer::SetFixedImage( + const ImageBase * image) +{ + itkDebugMacro("setting fixed image to " << image); + if (this->GetInput(0) != image) + { + this->ProcessObject::SetNthInput(0, const_cast *>(image)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::SetMovingImage( + const ImageBase * image) +{ + itkDebugMacro("setting moving image to " << image); + if (this->GetInput(1) != image) + { + this->ProcessObject::SetNthInput(1, const_cast *>(image)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::SetRealInput(const ImageType * image) +{ + itkDebugMacro("setting real input image to " << image); + if (this->GetInput(2) != image) + { + this->ProcessObject::SetNthInput(2, const_cast(image)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::SetComplexInput(const ComplexImageType * image) +{ + itkDebugMacro("setting real input image to " << image); + if (this->GetInput(3) != image) + { + this->ProcessObject::SetNthInput(3, const_cast(image)); + this->Modified(); + } +} + + +template +void +PhaseCorrelationOptimizer::ComputeOffset() +{ + const ImageType * fixed = static_cast(this->GetInput(0)); + const ImageType * moving = static_cast(this->GetInput(1)); + const ImageType * input = static_cast(this->GetInput(2)); + + const typename ImageType::SpacingType spacing = fixed->GetSpacing(); + const typename ImageType::PointType fixedOrigin = fixed->GetOrigin(); + const typename ImageType::PointType movingOrigin = moving->GetOrigin(); + + const typename ImageType::RegionType wholeImage = input->GetLargestPossibleRegion(); + const typename ImageType::SizeType size = wholeImage.GetSize(); + const typename ImageType::IndexType oIndex = wholeImage.GetIndex(); + + // ----- Start sample peak correlation optimization ----- // + OffsetType offset; + offset.Fill(0); + + // create the image which will be biased towards the expected solution + // other pixels get their value reduced by multiplication with + // e^(-f*(d/s)^2), where f is distancePenaltyFactor, + // d is pixel's distance, and s is approximate image size + m_AdjustedInput->CopyInformation(input); + m_AdjustedInput->SetRegions(input->GetBufferedRegion()); + m_AdjustedInput->Allocate(false); + + typename ImageType::IndexType adjustedSize; + typename ImageType::IndexType directExpectedIndex; + typename ImageType::IndexType mirrorExpectedIndex; + double imageSize2 = 0.0; // image size, squared + for (unsigned d = 0; d < ImageDimension; d++) + { + adjustedSize[d] = size[d] + oIndex[d]; + imageSize2 += adjustedSize[d] * adjustedSize[d]; + directExpectedIndex[d] = (movingOrigin[d] - fixedOrigin[d]) / spacing[d] + oIndex[d]; + mirrorExpectedIndex[d] = (movingOrigin[d] - fixedOrigin[d]) / spacing[d] + adjustedSize[d]; + } + + double distancePenaltyFactor = 0.0; + if (m_PixelDistanceTolerance == 0) // up to about half image size + { + distancePenaltyFactor = -10.0 / imageSize2; + } + else // up to about five times the provided tolerance + { + distancePenaltyFactor = std::log(0.9) / (m_PixelDistanceTolerance * m_PixelDistanceTolerance); + } + + MultiThreaderBase * mt = this->GetMultiThreader(); + mt->ParallelizeImageRegion( + wholeImage, + [&](const typename ImageType::RegionType & region) { + ImageRegionConstIterator iIt(input, region); + ImageRegionIteratorWithIndex oIt(m_AdjustedInput, region); + IndexValueType zeroDist2 = + 100 * m_PixelDistanceTolerance * m_PixelDistanceTolerance; // round down to zero further from this + for (; !oIt.IsAtEnd(); ++iIt, ++oIt) + { + typename ImageType::IndexType ind = oIt.GetIndex(); + IndexValueType dist = 0; + for (unsigned d = 0; d < ImageDimension; d++) + { + IndexValueType distDirect = (directExpectedIndex[d] - ind[d]) * (directExpectedIndex[d] - ind[d]); + IndexValueType distMirror = (mirrorExpectedIndex[d] - ind[d]) * (mirrorExpectedIndex[d] - ind[d]); + if (distDirect <= distMirror) + { + dist += distDirect; + } + else + { + dist += distMirror; + } + } + + typename ImageType::PixelType pixel; + if (m_PixelDistanceTolerance > 0 && dist > zeroDist2) + { + pixel = 0; + } + else // evaluate the expensive exponential function + { + pixel = iIt.Get() * std::exp(distancePenaltyFactor * dist); +#ifndef NDEBUG + pixel *= 1000; // make the intensities in this image more humane (close to 1.0) + // it is really hard to count zeroes after decimal point when comparing pixel intensities + // since this images is used to find maxima, absolute values are irrelevant +#endif + } + oIt.Set(pixel); + } + }, + nullptr); + + // WriteDebug(m_AdjustedInput.GetPointer(), "m_AdjustedInput.nrrd"); + + if (m_ZeroSuppression > 0.0) // suppress trivial zero solution + { + constexpr IndexValueType znSize = 4; // zero neighborhood size, in city-block distance + mt->ParallelizeImageRegion( + wholeImage, + [&](const typename ImageType::RegionType & region) { + ImageRegionIteratorWithIndex oIt(m_AdjustedInput, region); + for (; !oIt.IsAtEnd(); ++oIt) + { + bool pixelValid = false; + typename ImageType::PixelType pixel; + typename ImageType::IndexType ind = oIt.GetIndex(); + IndexValueType dist = 0; + for (unsigned d = 0; d < ImageDimension; d++) + { + IndexValueType distD = ind[d] - oIndex[d]; + if (distD > IndexValueType(size[d] / 2)) // wrap around + { + distD = size[d] - distD; + } + dist += distD; + } + + if (dist < znSize) // neighborhood of [0,0,...,0] - in case zero peak is blurred + { + pixelValid = true; + } + else + { + for (unsigned d = 0; d < ImageDimension; d++) // lines/sheets of zero m_MaxIndices + { + if (ind[d] == oIndex[d]) // one of the m_MaxIndices is "zero" + { + pixelValid = true; + } + } + } + + if (pixelValid) // either neighborhood or lines/sheets says update the pixel + { + pixel = oIt.Get(); + // avoid the initial steep rise of function x/(1+x) by shifting it by 10 + pixel *= (dist + 10) / (m_ZeroSuppression + dist + 10); + oIt.Set(pixel); + } + } + }, + nullptr); + + // WriteDebug(m_AdjustedInput.GetPointer(), "m_AdjustedInputZS.nrrd"); + } + + m_MaxCalculator->SetImage(m_AdjustedInput); + if (m_MergePeaks) + { + m_MaxCalculator->SetN(std::ceil(this->m_Offsets.size() / 2) * + (static_cast(std::pow(3, ImageDimension)) - 1)); + } + else + { + m_MaxCalculator->SetN(this->m_Offsets.size()); + } + + try + { + m_MaxCalculator->ComputeMaxima(); + } + catch (ExceptionObject & err) + { + itkDebugMacro("exception caught during execution of max calculator - passing "); + throw err; + } + + this->m_Confidences = m_MaxCalculator->GetMaxima(); + this->m_MaxIndices = m_MaxCalculator->GetIndicesOfMaxima(); + itkAssertOrThrowMacro(this->m_Confidences.size() == m_MaxIndices.size(), + "Maxima and their m_MaxIndices must have the same number of elements"); + std::greater compGreater; + const auto zeroBound = std::upper_bound(this->m_Confidences.begin(), this->m_Confidences.end(), 0.0, compGreater); + if (zeroBound != this->m_Confidences.end()) // there are some non-positive values in here + { + unsigned i = zeroBound - this->m_Confidences.begin(); + this->m_Confidences.resize(i); + m_MaxIndices.resize(i); + } + + if (m_MergePeaks > 0) // eliminate m_MaxIndices belonging to the same blurry peak + { + unsigned i = 1; + while (i < m_MaxIndices.size()) + { + unsigned k = 0; + while (k < i) + { + // calculate maximum distance along any dimension + SizeValueType dist = 0; + for (unsigned d = 0; d < ImageDimension; d++) + { + SizeValueType d1 = itk::Math::abs(m_MaxIndices[i][d] - m_MaxIndices[k][d]); + if (d1 > size[d] / 2) // wrap around + { + d1 = size[d] - d1; + } + dist = std::max(dist, d1); + } + if (dist <= m_MergePeaks) + { + break; + } + ++k; + } + + if (k < i) // k is nearby + { + this->m_Confidences[k] += this->m_Confidences[i]; // join amplitudes + this->m_Confidences.erase(this->m_Confidences.begin() + i); + m_MaxIndices.erase(m_MaxIndices.begin() + i); + } + else // examine next index + { + ++i; + } + } + + // now we need to re-sort the values + std::vector sIndices; + sIndices.reserve(this->m_Confidences.size()); + for (i = 0; i < this->m_Confidences.size(); i++) + { + sIndices.push_back(i); + } + std::sort(sIndices.begin(), sIndices.end(), [this](unsigned a, unsigned b) { + return this->m_Confidences[a] > this->m_Confidences[b]; + }); + + // now apply sorted order + typename MaxCalculatorType::ValueVector tMaxs(this->m_Confidences.size()); + typename MaxCalculatorType::IndexVector tIndices(this->m_Confidences.size()); + for (i = 0; i < this->m_Confidences.size(); i++) + { + tMaxs[i] = this->m_Confidences[sIndices[i]]; + tIndices[i] = m_MaxIndices[sIndices[i]]; + } + this->m_Confidences.swap(tMaxs); + m_MaxIndices.swap(tIndices); + } + + if (this->m_Offsets.size() > this->m_Confidences.size()) + { + this->SetOffsetCount(this->m_Confidences.size()); + } + else + { + this->m_Confidences.resize(this->m_Offsets.size()); + m_MaxIndices.resize(this->m_Offsets.size()); + } + + // double confidenceFactor = 1.0 / this->m_Confidences[0]; + + for (unsigned m = 0; m < this->m_Confidences.size(); m++) + { + using ContinuousIndexType = ContinuousIndex; + ContinuousIndexType maxIndex = m_MaxIndices[m]; + + for (unsigned i = 0; i < ImageDimension; ++i) + { + const OffsetScalarType directOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - oIndex[i]); + const OffsetScalarType mirrorOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - adjustedSize[i]); + if (itk::Math::abs(directOffset) <= itk::Math::abs(mirrorOffset)) + { + offset[i] = directOffset; + } + else + { + offset[i] = mirrorOffset; + } + } + + // this->m_Confidences[m] *= confidenceFactor; // normalize - highest confidence will be 1.0 +#ifdef NDEBUG + this->m_Confidences[m] *= 1000.0; // make the intensities more humane (close to 1.0) +#endif + + this->m_Offsets[m] = offset; + } + // ----- End sample peak correlation optimization ----- // + + + const auto maxIndices = this->m_MaxIndices; + + if (this->m_PeakInterpolationMethod != PeakInterpolationMethodEnum::None) // interpolate the peak + { + for (size_t offsetIndex = 0; offsetIndex < this->m_Offsets.size(); ++offsetIndex) + { + using ContinuousIndexType = ContinuousIndex; + ContinuousIndexType maxIndex = maxIndices[offsetIndex]; + typename ImageType::IndexType tempIndex = maxIndices[offsetIndex]; + typename ImageType::PixelType y0; + typename ImageType::PixelType y1 = input->GetPixel(tempIndex); + typename ImageType::PixelType y2; + + for (unsigned i = 0; i < ImageDimension; i++) + { + tempIndex[i] = maxIndex[i] - 1; + if (!wholeImage.IsInside(tempIndex)) + { + tempIndex[i] = maxIndex[i]; + continue; + } + y0 = input->GetPixel(tempIndex); + tempIndex[i] = maxIndex[i] + 1; + if (!wholeImage.IsInside(tempIndex)) + { + tempIndex[i] = maxIndex[i]; + continue; + } + y2 = input->GetPixel(tempIndex); + tempIndex[i] = maxIndex[i]; + + OffsetScalarType omega, theta, ratio; + switch (this->m_PeakInterpolationMethod) + { + case PeakInterpolationMethodEnum::Parabolic: + case PeakInterpolationMethodEnum::WeightedMeanPhase: + maxIndex[i] += (y0 - y2) / (2 * (y0 - 2 * y1 + y2)); + break; + case PeakInterpolationMethodEnum::Cosine: + ratio = (y0 + y2) / (2 * y1); + if (offsetIndex > 0) // clip to -0.999... to 0.999... range + { + ratio = std::min(ratio, 1.0f - std::numeric_limits::epsilon()); + ratio = std::max(ratio, -1.0f + std::numeric_limits::epsilon()); + } + omega = std::acos(ratio); + theta = std::atan((y0 - y2) / (2 * y1 * std::sin(omega))); + maxIndex[i] -= ::itk::Math::one_over_pi * theta / omega; + break; + default: + itkAssertInDebugAndIgnoreInReleaseMacro("Unsupported interpolation method"); + break; + } // switch PeakInterpolationMethod + + const OffsetScalarType directOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - oIndex[i]); + const OffsetScalarType mirrorOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - adjustedSize[i]); + if (itk::Math::abs(directOffset) <= itk::Math::abs(mirrorOffset)) + { + this->m_Offsets[offsetIndex][i] = directOffset; + } + else + { + this->m_Offsets[offsetIndex][i] = mirrorOffset; + } + // TODO: remove + // std::cout << "MAX Phase GENERATED: " << this->m_Offsets[offsetIndex] << std::endl; + } // for ImageDimension + } // for offsetIndex + if (this->m_PeakInterpolationMethod == PeakInterpolationMethodEnum::WeightedMeanPhase) + { + for (unsigned int peak = 0; peak < this->m_PhaseInterpolated && peak < this->m_Offsets.size(); ++peak) + { + this->m_PadFilter->SetInput(this->m_AdjustedInput); + typename CyclicShiftFilterType::OffsetType shiftFilterOffset; + for (unsigned int dim = 0; dim < ImageDimension; ++dim) + { + shiftFilterOffset[dim] = -maxIndices[peak][dim]; + } + this->m_CyclicShiftFilter->SetShift(shiftFilterOffset); + this->m_FFTFilter->Update(); + const typename FFTFilterType::OutputImageType * correlationFFT = this->m_FFTFilter->GetOutput(); + + using ContinuousIndexType = ContinuousIndex; + ContinuousIndexType maxIndex = maxIndices[peak]; + if (this->m_PeakInterpolationMethod == PeakInterpolationMethodEnum::WeightedMeanPhase) + { + using SumType = CompensatedSummation; + SumType powerSum; + SumType weightedPhase; + typename FFTFilterType::OutputImageType::IndexType index; + for (unsigned int dim = 0; dim < ImageDimension; ++dim) + { + powerSum.ResetToZero(); + weightedPhase.ResetToZero(); + index.Fill(0); + const SizeValueType maxFreqIndex = correlationFFT->GetLargestPossibleRegion().GetSize()[dim] / 2; + for (SizeValueType freqIndex = 1; freqIndex < maxFreqIndex; ++freqIndex) + { + index[dim] = freqIndex; + const typename FFTFilterType::OutputPixelType correlation = correlationFFT->GetPixel(index); + const double phase = std::arg(correlation); + const double power = correlation.imag() * correlation.imag() + correlation.real() * correlation.real(); + weightedPhase += phase / Math::pi * power; + powerSum += power; + } + const double deltaToF = -1 * weightedPhase.GetSum() / powerSum.GetSum(); + maxIndex[dim] += deltaToF; + } + //} else if(this->m_PeakInterpolationMethod == PeakInterpolationMethodEnum::PhaseFrequencySlope) { + //// todo: compute the linear regression of the phase, use + //// slope, add to maxIndex + } + + for (unsigned i = 0; i < ImageDimension; ++i) + { + const OffsetScalarType directOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - oIndex[i]); + const OffsetScalarType mirrorOffset = + (movingOrigin[i] - fixedOrigin[i]) - 1 * spacing[i] * (maxIndex[i] - adjustedSize[i]); + if (itk::Math::abs(directOffset) <= itk::Math::abs(mirrorOffset)) + { + this->m_Offsets[peak][i] = directOffset; + } + else + { + this->m_Offsets[peak][i] = mirrorOffset; + } + } + } + } // frequency domain interpolation + } // interpolate the peak +} + + +} // end namespace itk + +#endif diff --git a/Modules/Registration/Montage/include/itkTileConfiguration.h b/Modules/Registration/Montage/include/itkTileConfiguration.h new file mode 100644 index 000000000000..58ca726be471 --- /dev/null +++ b/Modules/Registration/Montage/include/itkTileConfiguration.h @@ -0,0 +1,379 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkTileConfiguration_h +#define itkTileConfiguration_h + +#include +#include + +#include "itkPoint.h" +#include "itkSize.h" + +#include "double-conversion/double-conversion.h" + +#include +#include +#include +#include + +namespace itk +{ +template +struct ITK_TEMPLATE_EXPORT Tile +{ + using PointType = Point; + + PointType Position; // x, y... coordinates + + std::string FileName; + + /* Primarily for access via SWIG wrapping */ + PointType + GetPosition() const + { + return Position; + } + void + SetPosition(PointType position) + { + Position = position; + } + + /* Primarily for access via SWIG wrapping */ + std::string + GetFileName() const + { + return FileName; + } + void + SetFileName(std::string fileName) + { + FileName = fileName; + } +}; + + +template +struct ITK_TEMPLATE_EXPORT TileConfiguration +{ + using PointType = typename Tile::PointType; + using TileIndexType = Size; + using TileND = Tile; + + TileIndexType AxisSizes; + + std::vector Tiles; + + /* Primarily for access via SWIG wrapping */ + TileIndexType + GetAxisSizes() const + { + return AxisSizes; + } + void + SetAxisSizes(TileIndexType axisSizes) + { + AxisSizes = axisSizes; + } + + /* Primarily for access via SWIG wrapping */ + TileND + GetTile(size_t linearIndex) const + { + return Tiles[linearIndex]; + } + void + SetTile(size_t linearIndex, TileND tile) + { + Tiles[linearIndex] = tile; + } + + size_t + LinearSize() const + { + size_t linearSize = 1u; + for (unsigned d = 0; d < Dimension; d++) + { + linearSize *= AxisSizes[d]; + } + return linearSize; + } + + size_t + nDIndexToLinearIndex(TileIndexType nDIndex) const + { + size_t ind = 0; + SizeValueType stride = 1u; + for (unsigned d = 0; d < Dimension; d++) + { + itkAssertOrThrowMacro(nDIndex[d] < AxisSizes[d], + "Tile index " << nDIndex << " exceeds axis size " << AxisSizes << " at dimension " << d); + ind += nDIndex[d] * stride; + stride *= AxisSizes[d]; + } + return ind; + } + + TileIndexType + LinearIndexToNDIndex(size_t linearIndex) const + { + TileIndexType ind; + SizeValueType stride = 1u; + for (unsigned d = 0; d < Dimension; d++) + { + stride *= AxisSizes[d]; + ind[d] = linearIndex % AxisSizes[d]; + linearIndex /= AxisSizes[d]; + } + itkAssertOrThrowMacro(linearIndex < stride, + "Linear tile index " << linearIndex << " exceeds total montage size " << stride); + return ind; + } + + // tries parsing the file, return first file name and set dimension + static std::string + TryParse(const std::string & pathToFile, unsigned & dimension) + { + std::ifstream tileFile(pathToFile); + if (!tileFile) + { + throw std::runtime_error("Could not open for reading: " + pathToFile); + } + + std::string temp = getNextNonCommentLine(tileFile); + if (temp.substr(0, 6) == "dim = ") + { + dimension = std::stoul(temp.substr(6)); + temp = TileConfiguration::getNextNonCommentLine(tileFile); // get next line + } + + std::string timePointID; + Tile tile = parseLine(temp, timePointID); + return tile.FileName; + } + + void + Parse(const std::string & pathToFile) + { + std::ifstream tileFile(pathToFile); + if (!tileFile) + { + throw std::runtime_error("Could not open for reading: " + pathToFile); + } + std::string line = getNextNonCommentLine(tileFile); + if (line.substr(0, 6) == "dim = ") + { + unsigned dim = std::stoul(line.substr(6)); + if (dim != Dimension) + { + throw std::runtime_error("Expected dimension " + std::to_string(Dimension) + ", but got " + + std::to_string(dim) + " from string:\n\n" + line); + } + line = TileConfiguration::getNextNonCommentLine(tileFile); // get next line + } + + AxisSizes.Fill(1); + Tiles.clear(); + TileIndexType cInd; + cInd.Fill(0); + unsigned initializedDimensions = 0; // no dimension has been initialized + + std::string timePoint; + itk::Tile tile = parseLine(line, timePoint); + Tiles.push_back(tile); + line = getNextNonCommentLine(tileFile); + + while (tileFile) + { + tile = parseLine(line, timePoint); + // determine dominant axis change + unsigned maxAxis = 0; // (0=x, 1=y, 2=z etc) + double maxDiff = tile.Position[0] - Tiles.back().Position[0]; + for (unsigned d = 1; d < Dimension; d++) + { + double diff = tile.Position[d] - Tiles.back().Position[d]; + if (diff > maxDiff) + { + maxDiff = diff; + maxAxis = d; + } + } + + if (maxAxis > initializedDimensions) // we now know the size along this dimension + { + AxisSizes[maxAxis - 1] = cInd[maxAxis - 1] + 1; + initializedDimensions = maxAxis; + } + + // check consistency with previously established size + for (unsigned d = 0; d < maxAxis; d++) + { + itkAssertOrThrowMacro(cInd[d] == AxisSizes[d] - 1, + "Axis sizes: " << AxisSizes << " current index: " << cInd + << ". We have reached the end along axis " << maxAxis + << "\nIndex along axis " << d << " is " << cInd[d] << ", but it should be " + << AxisSizes[d] - 1); + } + + // update current tile index + for (unsigned d = 0; d < maxAxis; d++) + { + cInd[d] = 0; + } + ++cInd[maxAxis]; + + + if (maxAxis < initializedDimensions) // check bounds, if bounds are established + { + itkAssertOrThrowMacro(cInd[maxAxis] < AxisSizes[maxAxis], + "Axis sizes: " << AxisSizes << ", but we reached index " << cInd[maxAxis] + << ". Violation along axis " << maxAxis); + } + + Tiles.push_back(tile); + line = getNextNonCommentLine(tileFile); + } + + for (unsigned d = 0; d < Dimension; ++d) + { + AxisSizes[d] = cInd[d] + 1; + } + + size_t expectedSize = this->LinearSize(); + itkAssertOrThrowMacro(expectedSize == Tiles.size(), + "Incorrect number of tiles: " << Tiles.size() << ". Expected: " << expectedSize); + } + + void + Write(const std::string & pathToFile) + { + std::ofstream tileFile(pathToFile); + if (!tileFile) + { + throw std::runtime_error("Could not open for writing: " + pathToFile); + } + + tileFile << "# Tile coordinates are in index space, not physical space\n"; + tileFile << "dim = " << Dimension << "\n\n"; + char buffer[25]; + double_conversion::StringBuilder conversionResult(buffer, 25); + + size_t totalTiles = this->LinearSize(); + for (SizeValueType linearIndex = 0; linearIndex < totalTiles; linearIndex++) + { + tileFile << Tiles[linearIndex].FileName << ";;("; + + for (unsigned d = 0; d < Dimension; d++) + { + if (d > 0) + { + tileFile << ", "; + } + + doubleConverter.ToShortest(Tiles[linearIndex].Position[d], &conversionResult); + tileFile << conversionResult.Finalize(); + conversionResult.Reset(); + } + tileFile << ')' << std::endl; + } + + if (!tileFile) + { + throw std::runtime_error("Writing not successful to: " + pathToFile); + } + } + + static double_conversion::StringToDoubleConverter stringConverter; + static double_conversion::DoubleToStringConverter doubleConverter; + + static std::string + getNextNonCommentLine(std::istream & in) + { + std::string temp; + while (std::getline(in, temp)) + { + if (temp.empty() || temp[0] == '#') + { + continue; // this is either an empty line or a comment + } + if (temp.size() == 1 && temp[0] == '\r') + { + continue; // empty line ending in CRLF + } + if (temp[temp.size() - 1] == '\r') + { + temp.erase(temp.size() - 1, 1); + } + break; // temp has interesting content + } + return temp; + } + + static Tile + parseLine(const std::string line, std::string & timePointID) + { + itk::Tile tile; + std::stringstream ss(line); + std::string temp; + + std::getline(ss, temp, ';'); + tile.FileName = temp; + std::getline(ss, temp, ';'); + if (timePointID.empty()) + { + timePointID = temp; + } + else + { + itkAssertOrThrowMacro(temp == timePointID, + "Only a single time point is supported. " << timePointID << " != " << temp); + } + std::getline(ss, temp, '('); + + using PointTypelocal = itk::Point; + PointTypelocal p; + for (unsigned d = 0; d < Dimension; d++) + { + std::getline(ss, temp, ','); + int processed = 0; + p[d] = stringConverter.StringToDouble(temp.c_str(), temp.length(), &processed); + } + tile.Position = p; + + return tile; + } +}; + +template +double_conversion::StringToDoubleConverter TileConfiguration::stringConverter( + double_conversion::StringToDoubleConverter::ALLOW_TRAILING_JUNK | + double_conversion::StringToDoubleConverter::ALLOW_LEADING_SPACES | + double_conversion::StringToDoubleConverter::ALLOW_TRAILING_SPACES, + 0.0, + std::numeric_limits::quiet_NaN(), + nullptr, + nullptr); + +template +double_conversion::DoubleToStringConverter TileConfiguration< + Dimension>::doubleConverter(double_conversion::DoubleToStringConverter::NO_FLAGS, nullptr, nullptr, 'e', 0, 17, 1, 0); + +} // namespace itk + +#endif // itkTileConfiguration_h diff --git a/Modules/Registration/Montage/include/itkTileMergeImageFilter.h b/Modules/Registration/Montage/include/itkTileMergeImageFilter.h new file mode 100644 index 000000000000..7168d6ec8c57 --- /dev/null +++ b/Modules/Registration/Montage/include/itkTileMergeImageFilter.h @@ -0,0 +1,252 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkTileMergeImageFilter_h +#define itkTileMergeImageFilter_h + +#include "itkTileMontage.h" + +#include "itkLinearInterpolateImageFunction.h" +#include "itkNumericTraits.h" + +namespace itk +{ +/** \class TileMergeImageFilter + * \brief Resamples an n-Dimensional mosaic of images into a single composite image. + * + * CropToFill indicates whether the composite image will be cropped so it + * entirely consists of input tiles (no default background filling). + * If CropToFill is false, the composite image will have the extent to include + * all of the input tiles. The pixels not covered by any input tile + * will have the value specified by the Background member variable. + * + * TPixelAccumulateType needs to allow bigger numbers when overlap regions are large. + * For example, char's default accumulation type is short, + * but int might be preferred for montages with large overlaps of input tiles. + * + * \author Dženan Zukić, dzenan.zukic@kitware.com + * + * \ingroup Montage + */ +template ::AccumulateType, + typename TInterpolator = LinearInterpolateImageFunction> +class ITK_TEMPLATE_EXPORT TileMergeImageFilter + : public TileMontage< + Image::ValueType, TImageType::ImageDimension>, + typename TInterpolator::CoordinateType> +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(TileMergeImageFilter); + + /** We define superclass with scalar pixel type, to enable compiling even when RGB pixel is supplied. */ + using Superclass = + TileMontage::ValueType, TImageType::ImageDimension>, + typename TInterpolator::CoordinateType>; + + /** Standard class type aliases. */ + using Self = TileMergeImageFilter; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + using ImageType = TImageType; + using ImagePointer = typename ImageType::Pointer; + using ImageConstPointer = typename ImageType::ConstPointer; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(TileMergeImageFilter); + + /** Dimensionality of input images. */ + static constexpr unsigned int ImageDimension = ImageType::ImageDimension; + + /** This is envisioned to be the primary way of setting inputs. + * All required inputs are taken from TileMontage. Alternatively, + * inherited members can be called individually, e.g.: + * SetMontageSize(), SetInputTile(), SetOriginAdjustment() etc. */ + void + SetMontage(const Superclass * montage); + + /** Montage size and tile index types. */ + using ContinuousIndexType = typename Superclass::ContinuousIndexType; + using SizeType = typename Superclass::SizeType; + using TileIndexType = typename Superclass::TileIndexType; + + /** Image's dependent types. */ + using PixelType = typename TImageType::PixelType; + using ImageIndexType = typename Superclass::ImageIndexType; + using OffsetType = typename Superclass::OffsetType; + using PointType = typename Superclass::PointType; + using RegionType = typename Superclass::RegionType; + using SpacingType = typename Superclass::SpacingType; + + /** Type for the transform. */ + using TransformType = typename Superclass::PCMType::TransformType; + using TransformPointer = typename TransformType::Pointer; + using TransformConstPointer = typename TransformType::ConstPointer; + + /** Passes ReleaseDataFlag to internal filters. */ + void + SetReleaseDataFlag(bool flag) override + { + Superclass::SetReleaseDataFlag(flag); + } + + /** Passes ReleaseDataBeforeUpdateFlag to internal filters. */ + void + SetReleaseDataBeforeUpdateFlag(const bool flag) override + { + Superclass::SetReleaseDataBeforeUpdateFlag(flag); + } + + /** Usage equivalent to ImageSource's GetOutput(). + * \sa ImageSource */ + ImageType * + GetOutput(); + const ImageType * + GetOutput() const; + ImageType * + GetOutput(unsigned int idx); + + /** Set size of the image mosaic. */ + void + SetMontageSize(SizeType montageSize); + + /** To be called for each tile position in the mosaic + * before the call to Update(). */ + void + SetInputTile(SizeValueType linearIndex, ImageType * image) + { + // image will be cast into DataObject* so this casting is not a problem + Superclass::SetInputTile(linearIndex, reinterpret_cast(image)); + m_Transforms[linearIndex] = nullptr; + m_Tiles[linearIndex] = nullptr; + } + void + SetInputTile(SizeValueType linearIndex, const std::string & imageFilename) + { + Superclass::SetInputTile(linearIndex, imageFilename); + m_Transforms[linearIndex] = nullptr; + m_Tiles[linearIndex] = nullptr; + } + void + SetInputTile(TileIndexType position, ImageType * image) + { + this->SetInputTile(this->nDIndexToLinearIndex(position), image); + } + void + SetInputTile(TileIndexType position, const std::string & imageFilename) + { + this->SetInputTile(this->nDIndexToLinearIndex(position), imageFilename); + } + + /** Input tiles' transforms, as calculated by \sa{Montage}. + * To be called for each tile position in the mosaic + * before the call to Update(). */ + void + SetTileTransform(TileIndexType position, const TransformType * transform); + + /** Get/Set background value (used if CropToFill is false). + * Default PixelType's value (usually zero) if not set. */ + itkSetMacro(Background, PixelType); + itkGetMacro(Background, PixelType); + + /** CropToFill indicates whether the output image will be cropped so it + * entirely consists of input tiles (no default background filling). + * If CropToFill is false, the composite image will have the extent to include + * all of the input tiles. The pixels not covered by any input tile + * will have the value specified by the Background member variable. */ + itkSetMacro(CropToFill, bool); + itkGetMacro(CropToFill, bool); + itkBooleanMacro(CropToFill); + +protected: + TileMergeImageFilter(); + ~TileMergeImageFilter() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + /** Method invoked by the pipeline in order to trigger the computation of the registration. */ + void + GenerateData() override; + + /** Method invoked by the pipeline to determine the output information. */ + void + GenerateOutputInformation() override; + + using Superclass::MakeOutput; + + /** Make a DataObject of the correct type to be used as the specified output. */ + typename DataObject::Pointer MakeOutput(typename Superclass::DataObjectPointerArraySizeType) override + { + return ImageType::New(); + } + + /** If not already read, reads the image into memory. + * Only the part which overlaps output image's requested region is read. + * If size of the wantedRegion is zero, only reads metadata. */ + ImageConstPointer + GetImage(TileIndexType nDIndex, RegionType wantedRegion); + + /** A set of linear indices of input tiles which contribute to this region. */ + using ContributingTiles = std::set; + + void + SplitRegionAndCopyContributions(std::vector & regions, + std::vector & regionContributors, + RegionType newRegion, + size_t oldRegionIndex, + SizeValueType tileIndex); + + /** The region will be inside of the rectangle given by min and max indices. + * The min is rounded up, while the max is rounded down. */ + RegionType + ConstructRegion(ContinuousIndexType minIndex, ContinuousIndexType maxIndex); + + /** Calculates distance of index from the closes edge of the region. */ + SizeValueType + DistanceFromEdge(ImageIndexType index, RegionType region); + + /** Resamples a single region into m_SingleImage. + * This method does not access other regions, + * and can be run in parallel with other indices. */ + void + ResampleSingleRegion(SizeValueType regionIndex); + +private: + bool m_CropToFill = false; // crop to avoid background filling? + PixelType m_Background = PixelType(); // default background value (not covered by any input tile) + + std::vector m_Transforms; + std::vector m_Tiles; // metadata/image storage (if filenames are given instead of actual images) + typename Superclass::ConstPointer m_Montage; + std::vector m_InputMappings; // where do input tile regions map into the output + std::vector m_InputsContinuousIndices; // where do input tile region indices map into the output + std::vector m_Regions; // regions which completely cover the output, + // grouped by the set of contributing input tiles + std::vector m_RegionContributors; // set of input tiles which contribute to corresponding regions +}; // class TileMergeImageFilter + +} // namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkTileMergeImageFilter.hxx" +#endif + +#endif // itkTileMergeImageFilter_h diff --git a/Modules/Registration/Montage/include/itkTileMergeImageFilter.hxx b/Modules/Registration/Montage/include/itkTileMergeImageFilter.hxx new file mode 100644 index 000000000000..e0f1271adf6c --- /dev/null +++ b/Modules/Registration/Montage/include/itkTileMergeImageFilter.hxx @@ -0,0 +1,582 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkTileMergeImageFilter_hxx +#define itkTileMergeImageFilter_hxx + + +#include "itkMultiThreaderBase.h" + +#include +#include +#include +#include + +namespace itk +{ +template +TileMergeImageFilter::TileMergeImageFilter() +{ + this->SetMontageSize(this->m_MontageSize); // initialize the rest of arrays + + // required for GenerateOutputInformation to be called + this->SetNthOutput(0, this->MakeOutput(0).GetPointer()); +} + +template +void +TileMergeImageFilter::PrintSelf(std::ostream & os, Indent indent) const +{ + Superclass::PrintSelf(os, indent); + os << indent << "CropToFill: " << (m_CropToFill ? "Yes" : "No") << std::endl; + os << indent << "Background: " << m_Background << std::endl; + os << indent << "RegionsSize: " << m_Regions.size() << std::endl; + + auto nullCount = std::count(m_Transforms.begin(), m_Transforms.end(), nullptr); + os << indent << "Transforms (filled/capacity): " << m_Transforms.size() - nullCount << "/" << m_Transforms.size() + << std::endl; + + auto fullCount = std::count_if(m_Tiles.begin(), m_Tiles.end(), [](ImagePointer im) { + return im.IsNotNull() && im->GetBufferedRegion().GetNumberOfPixels() > 0; + }); + os << indent << "InputTiles (filled/capacity): " << fullCount << "/" << m_Tiles.size() << std::endl; + + os << indent << "Montage: " << m_Montage.GetPointer() << std::endl; +} + +template +void +TileMergeImageFilter::SetMontage(const Superclass * montage) +{ + if (m_Montage != montage) + { + m_Montage = montage; + this->SetMontageSize(montage->m_MontageSize); + this->m_FinishedPairs.store(montage->m_FinishedPairs); + this->m_OriginAdjustment = montage->m_OriginAdjustment; + this->m_ForcedSpacing = montage->m_ForcedSpacing; + + for (SizeValueType i = 0; i < this->m_LinearMontageSize; i++) + { + if (!std::equal_to{}(montage->GetInput(i), montage->m_Dummy.GetPointer())) + { + this->SetNthInput(i, const_cast(montage->GetInput(i))); + this->m_Filenames[i] = montage->m_Filenames[i]; // might still be set + } + else + { + this->SetInputTile(this->LinearIndexTonDIndex(i), montage->m_Filenames[i]); + } + using TransformCOT = const typename Superclass::TransformOutputType; + this->m_Transforms[i] = static_cast(m_Montage->GetOutput(i))->Get(); + } + + this->m_MinInner = montage->m_MinInner; + this->m_MaxInner = montage->m_MaxInner; + this->m_MinOuter = montage->m_MinOuter; + this->m_MaxOuter = montage->m_MaxOuter; + + this->Modified(); + } +} + +template +TImageType * +TileMergeImageFilter::GetOutput() +{ + return itkDynamicCastInDebugMode(this->GetPrimaryOutput()); +} + +template +const TImageType * +TileMergeImageFilter::GetOutput() const +{ + return itkDynamicCastInDebugMode(this->GetPrimaryOutput()); +} + +template +TImageType * +TileMergeImageFilter::GetOutput(unsigned int idx) +{ + auto * out = dynamic_cast(this->ProcessObject::GetOutput(idx)); + if (out == nullptr && this->ProcessObject::GetOutput(idx) != nullptr) + { + itkWarningMacro(<< "Unable to convert output number " << idx << " to type " << typeid(ImageType).name()); + } + return out; +} + +template +void +TileMergeImageFilter::SetMontageSize(SizeType montageSize) +{ + Superclass::SetMontageSize(montageSize); + m_Transforms.resize(this->m_LinearMontageSize); + m_Tiles.resize(this->m_LinearMontageSize); + this->SetNumberOfRequiredOutputs(1); +} + +template +void +TileMergeImageFilter::SetTileTransform(TileIndexType position, + const TransformType * transform) +{ + SizeValueType linInd = this->nDIndexToLinearIndex(position); + if (m_Transforms[linInd].IsNull() || m_Transforms[linInd]->GetParameters() != transform->GetParameters() || + m_Transforms[linInd]->GetFixedParameters() != transform->GetFixedParameters()) + { + m_Transforms[linInd] = transform; + this->Modified(); + } +} + +template +void +TileMergeImageFilter::SplitRegionAndCopyContributions( + std::vector & regions, + std::vector & regionContributors, + RegionType newRegion, + size_t oldRegionIndex, + SizeValueType tileIndex) +{ + for (int d = ImageDimension - 1; d >= 0; d--) + { + SizeValueType newRegionSize = newRegion.GetSize(d); + IndexValueType newRegionIndex = newRegion.GetIndex(d); + IndexValueType newRegionEnd = newRegionIndex + IndexValueType(newRegionSize); + + SizeValueType originalRegionSize = regions[oldRegionIndex].GetSize(d); + IndexValueType originalRegionIndex = regions[oldRegionIndex].GetIndex(d); + IndexValueType originalRegionEnd = originalRegionIndex + IndexValueType(originalRegionSize); + + if (newRegionIndex < originalRegionEnd && originalRegionIndex < newRegionIndex) + { + RegionType remnant = regions[oldRegionIndex]; + remnant.SetSize(d, newRegionIndex - originalRegionIndex); + regions.push_back(remnant); + regionContributors.push_back(regionContributors[oldRegionIndex]); + + regions[oldRegionIndex].SetSize(d, originalRegionSize - (newRegionIndex - originalRegionIndex)); + regions[oldRegionIndex].SetIndex(d, newRegionIndex); + + // update original region's size and index + originalRegionSize = regions[oldRegionIndex].GetSize(d); + originalRegionIndex = regions[oldRegionIndex].GetIndex(d); + assert(originalRegionEnd == originalRegionIndex + IndexValueType(originalRegionSize)); + } + + if (originalRegionIndex < newRegionEnd && newRegionEnd < originalRegionEnd) + { + RegionType remnant = regions[oldRegionIndex]; + regions[oldRegionIndex].SetSize(d, newRegionEnd - originalRegionIndex); + + remnant.SetSize(d, originalRegionSize - (newRegionEnd - originalRegionIndex)); + remnant.SetIndex(d, newRegionEnd); + regions.push_back(remnant); + regionContributors.push_back(regionContributors[oldRegionIndex]); + } + } + regionContributors[oldRegionIndex].insert(tileIndex); +} + +template +typename TileMergeImageFilter::RegionType +TileMergeImageFilter::ConstructRegion(ContinuousIndexType minIndex, + ContinuousIndexType maxIndex) +{ + ImageIndexType ind; + SizeType size; + for (unsigned d = 0; d < ImageDimension; d++) + { + ind[d] = std::round(minIndex[d]); + size[d] = std::round(maxIndex[d] - ind[d]); + } + RegionType region; + region.SetIndex(ind); + region.SetSize(size); + return region; +} + +template +SizeValueType +TileMergeImageFilter::DistanceFromEdge(ImageIndexType index, + RegionType region) +{ + SizeValueType dist = NumericTraits::max(); + for (unsigned d = 0; d < ImageDimension; d++) + { + SizeValueType dimDist = + std::min(index[d] - region.GetIndex(d), region.GetIndex(d) + region.GetSize(d) - index[d]); + dist = std::min(dist, dimDist); + } + return 1 + dist; +} + + +template +typename TImageType::ConstPointer +TileMergeImageFilter::GetImage(TileIndexType nDIndex, + RegionType wantedRegion) +{ + SizeValueType linearIndex = this->nDIndexToLinearIndex(nDIndex); + + ImagePointer outputImage = this->GetOutput(); + RegionType reqR = outputImage->GetRequestedRegion(); + std::lock_guard lockGuard(this->m_TileReadLocks[linearIndex]); + if (m_Tiles[linearIndex].IsNotNull()) + { + RegionType r = m_Tiles[linearIndex]->GetBufferedRegion(); + if (r.Crop(reqR) && r.IsInside(wantedRegion)) + { + return m_Tiles[linearIndex]; + } + } + + bool onlyMetadata = (wantedRegion.GetNumberOfPixels() == 0); + m_Tiles[linearIndex] = Superclass::template GetImageHelper(nDIndex, onlyMetadata, reqR); + return m_Tiles[linearIndex]; +} + +template +void +TileMergeImageFilter::GenerateOutputInformation() +{ + Superclass::GenerateOutputInformation(); + + TileIndexType nDIndex0 = { 0 }; + RegionType reg0; + ImageConstPointer input0 = this->GetImage(nDIndex0, reg0); + + if (m_Montage.IsNull()) + { + // initialize mosaic bounds + this->m_MinInner.Fill(NumericTraits::NonpositiveMin()); + this->m_MinOuter.Fill(NumericTraits::max()); + this->m_MaxOuter.Fill(NumericTraits::NonpositiveMin()); + this->m_MaxInner.Fill(NumericTraits::max()); + + for (SizeValueType i = 0; i < this->m_LinearMontageSize; i++) + { + TileIndexType nDIndex = this->LinearIndexTonDIndex(i); + ImageConstPointer input = this->GetImage(nDIndex, reg0); + this->UpdateMosaicBounds(nDIndex, + m_Transforms[i], + reinterpret_cast(input.GetPointer()), + reinterpret_cast(input0.GetPointer())); + } + } + + // clean up internal variables + m_InputMappings.clear(); + m_InputsContinuousIndices.clear(); + m_Regions.clear(); + m_RegionContributors.clear(); + + ImagePointer outputImage = this->GetOutput(); + outputImage->CopyInformation(input0); // origin, spacing, direction + + // determine output region + RegionType totalRegion; + if (m_CropToFill) + { + totalRegion = this->ConstructRegion(this->m_MinInner, this->m_MaxInner); + } + else + { + totalRegion = this->ConstructRegion(this->m_MinOuter, this->m_MaxOuter); + } + outputImage->SetRegions(totalRegion); + + // determine where does each input tile map into the output image + m_InputMappings.resize(this->m_LinearMontageSize); + m_InputsContinuousIndices.resize(this->m_LinearMontageSize); + for (SizeValueType i = 0; i < this->m_LinearMontageSize; i++) + { + TransformPointer inverseT = TransformType::New(); + m_Transforms[i]->GetInverse(inverseT); + TileIndexType nDIndex = this->LinearIndexTonDIndex(i); + ImageConstPointer input = this->GetImage(nDIndex, reg0); + PointType iOrigin = input->GetOrigin(); + iOrigin = inverseT->TransformPoint(iOrigin); + + const ContinuousIndexType ci = + outputImage->template TransformPhysicalPointToContinuousIndex(iOrigin); + for (unsigned d = 0; d < ImageDimension; d++) + { + m_InputsContinuousIndices[i][d] = ci[d] + input->GetLargestPossibleRegion().GetIndex(d); + } + + const ImageIndexType ind = + outputImage->template TransformPhysicalPointToIndex(iOrigin); + RegionType reg = input->GetLargestPossibleRegion(); + for (unsigned d = 0; d < ImageDimension; d++) + { + reg.SetIndex(d, reg.GetIndex(d) + ind[d]); + } + m_InputMappings[i] = reg; + } + + // now we split the totalRegion into pieces which have contributions + // by the same input tiles + m_Regions.push_back(totalRegion); + m_RegionContributors.emplace_back(); // we start with an empty set + for (SizeValueType i = 0; i < this->m_LinearMontageSize; i++) + { + // first determine the region indices which the newRegion overlaps + std::vector roIndices; + for (unsigned r = 0; r < m_Regions.size(); r++) + { + if (m_InputMappings[i].IsInside(m_Regions[r])) + { + m_RegionContributors[r].insert(i); + } + else + { + RegionType testR = m_InputMappings[i]; + if (testR.Crop(m_Regions[r])) + { + roIndices.push_back(r); + } + } + } + for (auto & roIndex : roIndices) + { + this->SplitRegionAndCopyContributions(m_Regions, m_RegionContributors, m_InputMappings[i], roIndex, i); + } + } +} + +template +void +TileMergeImageFilter::GenerateData() +{ + ImagePointer outputImage = this->GetOutput(); + RegionType reqR = outputImage->GetRequestedRegion(); + outputImage->SetBufferedRegion(reqR); + outputImage->Allocate(false); + + // for debugging purposes, just color the regions by their contributing tiles + // to make sure that the regions have been generated correctly without cracks + if (this->GetDebug()) + { + this->UpdateProgress(0.0); + for (unsigned i = 0; i < m_Regions.size(); i++) + { + PixelType val = NumericTraits::ZeroValue(); + PixelType val1 = NumericTraits::OneValue(); + unsigned bits = sizeof(typename NumericTraits::ValueType) * 8; + if (m_RegionContributors[i].empty()) + { + val = NumericTraits::max(); + } + for (auto tile : m_RegionContributors[i]) + { + val += val1 * std::pow(2, tile % bits); + } + RegionType currentRegion = m_Regions[i]; + if (currentRegion.Crop(reqR)) // intersection is not empty + { + ImageRegionIterator oIt(outputImage, currentRegion); + while (!oIt.IsAtEnd()) + { + oIt.Set(val); + ++oIt; + } + } + this->UpdateProgress((i + 1) / float(m_Regions.size())); + } + return; + } + + // now we will do resampling, one region at a time (in parallel) + // within each of these regions the set of contributing tiles is the same + MultiThreaderBase::Pointer mt = MultiThreaderBase::New(); + MultiThreaderBase::ArrayThreadingFunctorType tf = std::bind(&Self::ResampleSingleRegion, this, std::placeholders::_1); + mt->ParallelizeArray(0, m_Regions.size(), tf, this); + + // release data from input tiles + RegionType reg0; + for (SizeValueType i = 0; i < this->m_LinearMontageSize; i++) + { + if (m_Tiles[i]) + { + m_Tiles[i]->SetBufferedRegion(reg0); + m_Tiles[i]->Allocate(false); + } + } +} + +template +void +TileMergeImageFilter::ResampleSingleRegion(SizeValueType i) +{ + ImagePointer outputImage = this->GetOutput(); + RegionType reg0; // empty region + RegionType reqR = outputImage->GetRequestedRegion(); + RegionType currentRegion = m_Regions[i]; + if (!currentRegion.Crop(reqR)) // empty intersection + { + return; // nothing to do + } + ImageRegionIteratorWithIndex oIt(outputImage, currentRegion); + if (m_RegionContributors[i].empty()) // not covered by any tile + { + while (!oIt.IsAtEnd()) + { + oIt.Set(m_Background); + ++oIt; + } + return; + } + + using ContinuousValueType = typename ContinuousIndexType::ValueType; + std::vector tileIndices(m_RegionContributors[i].begin(), m_RegionContributors[i].end()); + const unsigned nTiles = tileIndices.size(); + std::vector inputs(nTiles); + std::vector tileRegions(nTiles); + std::vector inRegions(nTiles); + std::vector> continuousIndexDifferences(nTiles); + for (unsigned t = 0; t < nTiles; t++) + { + TileIndexType nDIndex = this->LinearIndexTonDIndex(tileIndices[t]); + OffsetType tileToRegion = currentRegion.GetIndex() - m_InputMappings[tileIndices[t]].GetIndex(); + inRegions[t] = currentRegion; + ImageConstPointer input = this->GetImage(nDIndex, reg0); // matadata (at least) + inRegions[t].SetIndex(input->GetLargestPossibleRegion().GetIndex() + tileToRegion); + inputs[t] = this->GetImage(nDIndex, inRegions[t]); // metadata + at least inRegions[t] of data + tileRegions[t] = &m_InputMappings[tileIndices[t]]; + for (unsigned d = 0; d < ImageDimension; d++) + { + continuousIndexDifferences[t][d] = + inputs[t]->GetLargestPossibleRegion().GetIndex(d) - m_InputsContinuousIndices[tileIndices[t]][d]; + } + } + + ContinuousValueType eps = 1e-4; + typename ImageType::SpacingType spacing = outputImage->GetSpacing(); + bool interpolate = false; + if (m_Montage.IsNotNull()) // we can check whether interpolation was used + { + const auto InterpolationNone = Superclass::PCMOptimizerType::PeakInterpolationMethodEnum::None; + interpolate = (m_Montage->GetPeakInterpolationMethod() != InterpolationNone); + } + else // examine alignment of image grids of all the contributing regions + { + const typename ImageType::PointType oOrigin = outputImage->GetOrigin(); + for (unsigned t = 0; t < nTiles; t++) + { + const typename ImageType::PointType iOrigin = inputs[t]->GetOrigin(); + for (unsigned d = 0; d < ImageDimension; d++) + { + ContinuousValueType translation = (oOrigin[d] - iOrigin[d]) / spacing[d] + continuousIndexDifferences[t][d]; + ContinuousValueType absDiff = itk::Math::abs(translation - std::round(translation)); + if (absDiff > eps) + { + interpolate = true; + break; + } + } + } + } + + if (nTiles == 1) // blending not needed + { + if (!interpolate) + { + ImageAlgorithm::Copy(inputs[0].GetPointer(), outputImage.GetPointer(), inRegions[0], currentRegion); + } + else + { + typename TInterpolator::Pointer interp = TInterpolator::New(); + interp->SetInputImage(inputs[0]); + while (!oIt.IsAtEnd()) + { + ContinuousIndexType continuousIndex = oIt.GetIndex(); + continuousIndex += continuousIndexDifferences[0]; + oIt.Set(interp->EvaluateAtContinuousIndex(continuousIndex)); + ++oIt; + } + } + } + else // more than one tile contributes + { + const TPixelAccumulateType zeroSum = NumericTraits::ZeroValue(); + if (!interpolate) + { + std::vector> iIt(nTiles); + for (unsigned t = 0; t < nTiles; t++) + { + iIt[t] = ImageRegionConstIterator(inputs[t], inRegions[t]); + } + + while (!oIt.IsAtEnd()) + { + ImageIndexType pixelIndex = oIt.GetIndex(); + SizeValueType dist = 0; + TPixelAccumulateType sum = zeroSum; + for (unsigned t = 0; t < nTiles; t++) + { + SizeValueType dt = this->DistanceFromEdge(pixelIndex, *tileRegions[t]); + sum += TPixelAccumulateType(iIt[t].Get()) * dt; + dist += dt; + ++iIt[t]; + } + sum /= dist; + oIt.Set(sum); + ++oIt; + } + } + else + { + std::vector iInt(nTiles); + for (unsigned t = 0; t < nTiles; t++) + { + for (unsigned d = 0; d < ImageDimension; d++) + { + continuousIndexDifferences[t][d] = + inputs[t]->GetLargestPossibleRegion().GetIndex(d) - m_InputsContinuousIndices[tileIndices[t]][d]; + } + iInt[t] = TInterpolator::New(); + iInt[t]->SetInputImage(inputs[t]); + } + + while (!oIt.IsAtEnd()) + { + ImageIndexType pixelIndex = oIt.GetIndex(); + SizeValueType dist = 0; + TPixelAccumulateType sum = zeroSum; + for (unsigned t = 0; t < nTiles; t++) + { + SizeValueType dt = this->DistanceFromEdge(pixelIndex, *tileRegions[t]); + ContinuousIndexType continuousIndex = pixelIndex; + continuousIndex += continuousIndexDifferences[t]; + sum += TPixelAccumulateType(iInt[t]->EvaluateAtContinuousIndex(continuousIndex)) * dt; + dist += dt; + } + sum /= dist; + oIt.Set(sum); + ++oIt; + } + } + } +} + +} // namespace itk + +#endif // itkTileMergeImageFilter_hxx diff --git a/Modules/Registration/Montage/include/itkTileMontage.h b/Modules/Registration/Montage/include/itkTileMontage.h new file mode 100644 index 000000000000..ad4e4928a1b8 --- /dev/null +++ b/Modules/Registration/Montage/include/itkTileMontage.h @@ -0,0 +1,366 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkTileMontage_h +#define itkTileMontage_h + +#include "itkImageFileReader.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkPhaseCorrelationImageRegistrationMethod.h" + +#include +#include +#include +#include + +namespace itk +{ +/** \class TileMontage + * \brief Determines registrations for an n-Dimensional mosaic of images. + * + * Determines registrations which can be used to resample a mosaic into a single image. + * + * This deals with n-dimensional rectangular arrays of image tiles. + * Arbitrarily shaped tile arrays (e.g. circular) are not directly supported. + * A possible (untested) workaround is adding all-zero (black) tiles around the shape + * to make a regular rectangular tile array (2D, 3D, or nD). + * + * Take a look a documentation of parameters, most influential of which is PositionTolerance. + * + * \author Dženan Zukić, dzenan.zukic@kitware.com + * + * \ingroup Montage + */ +template ::value, double, float>::type> +class ITK_TEMPLATE_EXPORT TileMontage : public ProcessObject +{ +public: + ITK_DISALLOW_COPY_AND_MOVE(TileMontage); + + /** Standard class type aliases. */ + using Self = TileMontage; + using Superclass = ProcessObject; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + using ImageType = TImageType; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(TileMontage); + + /** Dimensionality of input images. */ + static constexpr unsigned int ImageDimension = ImageType::ImageDimension; + + /** Montage size and tile index types. */ + using SizeType = Size; + using TileIndexType = Size; + using ContinuousIndexType = ContinuousIndex; + + /** Image's dependent types. */ + using PixelType = typename ImageType::PixelType; + using RegionType = typename ImageType::RegionType; + using PointType = typename ImageType::PointType; + using SpacingType = typename ImageType::SpacingType; + using OffsetType = typename ImageType::OffsetType; + using ImageIndexType = typename ImageType::IndexType; + + /** Internal PhaseCorrelationImageRegistrationMethod's type alias. */ + using PCMType = PhaseCorrelationImageRegistrationMethod; + + using RealType = typename PCMType::InternalPixelType; + + using PCMOperatorType = PhaseCorrelationOperator; + + using PCMOptimizerType = PhaseCorrelationOptimizer; + + /** Type for the transform. */ + using TransformType = typename PCMType::TransformType; + using TransformPointer = typename TransformType::Pointer; + using TransformConstPointer = typename TransformType::ConstPointer; + + /** Type for the output: Using Decorator pattern for enabling + * the Transform to be passed in the data pipeline */ + using TransformOutputType = DataObjectDecorator; + + /** Smart Pointer type to a DataObject. */ + using DataObjectPointer = typename DataObject::Pointer; + + /** Set/Get the OriginAdjustment. Origin adjustment multiplied by tile index + * is added to origin of images when only their filename is specified. + * This allows assumed positions for tiles even if files have zero origin. */ + itkSetMacro(OriginAdjustment, PointType); + itkGetConstMacro(OriginAdjustment, PointType); + + /** Set/Get forced spacing. + * If set, overrides spacing for images read from files. */ + itkSetMacro(ForcedSpacing, SpacingType); + itkGetConstMacro(ForcedSpacing, SpacingType); + + /** Set/Get absolute registration threshold. + * The maximum allowed residual error for a registration pair during + * global optimization. Expressed in number of pixels. Default: 1.0. + * Reasonable values are from around 0.8 to around 1.5. + * When a registration pair exceeds the threshold, it is replaced by + * the next best candidate for that pair. If all canidates are + * exhausted, the registration pair is assumed to have no translation. + * The weight of this equation is also significantly reduced. */ + itkSetMacro(AbsoluteThreshold, float); + itkGetConstMacro(AbsoluteThreshold, float); + + /** Set/Get relative registration threshold. + * The maximum allowed deviation for a registration pair during global + * optimization. Expressed in multiples of standard deviation. Default: 3.0. + * Reasonable values are from around 2 to around 5. + * The deviation is calculated by taking the translations of all the + * registration pairs, while assuming zero mean. This implies expectation + * that deviations from expected positions for all registration pairs + * are similar. The pairs that don't satify this will be penalized. */ + itkSetMacro(RelativeThreshold, float); + itkGetConstMacro(RelativeThreshold, float); + + /** Set/Get tile positioning precision. + * Get/Set expected maximum linear translation needed, in pixels. + * Zero (the default) means unknown, and allows translations + * up to about half the image size. + * This is an important parameter for reliability of pair-wise registrations, + * but it is microscope-dependent so we cannot have a restrictive default. + */ + itkSetMacro(PositionTolerance, SizeValueType); + itkGetConstMacro(PositionTolerance, SizeValueType); + + /** Set/Get tile cropping. Should tiles be cropped to overlapping + * region for computing the cross correlation? Default: True. + * + * This improves results, and in case overlaps are less than 25% + * computation is also faster. */ + itkSetMacro(CropToOverlap, bool); + itkGetConstMacro(CropToOverlap, bool); + + /** Set/Get obligatory padding. + * If set, padding of this many pixels is added on both beginning and end + * sides of each dimension of the image. Default value of 8 is usually fine. */ + virtual void + SetObligatoryPadding(const SizeType pad) + { + if (this->m_ObligatoryPadding != pad) + { + this->m_ObligatoryPadding = pad; + this->Modified(); + } + } + itkGetConstMacro(ObligatoryPadding, SizeType); + + /** Set/Get the padding method. + * The default (MirrorWithExponentialDecay) is usually the best. */ + itkSetEnumMacro(PaddingMethod, typename PCMType::PaddingMethodEnum); + itkGetConstMacro(PaddingMethod, typename PCMType::PaddingMethodEnum); + + /** Set/Get the peak interpolation method. + * The default (Parabolic) is usually the best. */ + itkSetEnumMacro(PeakInterpolationMethod, typename PCMOptimizerType::PeakInterpolationMethodEnum); + itkGetConstMacro(PeakInterpolationMethod, typename PCMOptimizerType::PeakInterpolationMethodEnum); + + /** Get/Set size of the image mosaic. */ + itkGetConstMacro(MontageSize, SizeType); + void + SetMontageSize(SizeType montageSize); + + /** To be called for each tile position in the mosaic + * before the call to Update(). */ + void + SetInputTile(SizeValueType linearIndex, ImageType * image) + { + this->SetNthInput(linearIndex, image); + m_FFTCache[linearIndex] = nullptr; + m_Tiles[linearIndex] = nullptr; + } + void + SetInputTile(SizeValueType linearIndex, const std::string & imageFilename) + { + m_Filenames[linearIndex] = imageFilename; + this->SetInputTile(linearIndex, m_Dummy); + } + void + SetInputTile(TileIndexType position, ImageType * image) + { + this->SetInputTile(this->nDIndexToLinearIndex(position), image); + } + void + SetInputTile(TileIndexType position, const std::string & imageFilename) + { + this->SetInputTile(this->nDIndexToLinearIndex(position), imageFilename); + } + + /** After Update(), the transform for each tile is available. */ + const TransformType * + GetOutputTransform(TileIndexType position) + { + return static_cast(this->GetOutput(this->nDIndexToLinearIndex(position)))->Get(); + } + + /** Reliability of each tile, highest normalized to 1.0.*/ + using TileReliabilities = std::vector; + + /** Tile reliability, from 0.0 (lowest) to 1.0 (highest). + * This can be used to judge successfulness of registration to adjacent tiles. + * The lowest reliability is usually around 0.01 to 0.1. */ + itkGetConstReferenceMacro(TileReliabilities, TileReliabilities); + float + GetTileReliability(DataObjectPointerArraySizeType linearIndex) const + { + return m_TileReliabilities[linearIndex]; + } + float + GetTileReliability(TileIndexType nDIndex) const + { + DataObjectPointerArraySizeType linearIndex = nDIndexToLinearIndex(nDIndex); + return GetTileReliability(linearIndex); + } + +protected: + TileMontage(); + ~TileMontage() override = default; + void + PrintSelf(std::ostream & os, Indent indent) const override; + + /** Method invoked by the pipeline in order to trigger the computation of the registration. */ + void + GenerateData() override; + + /** Method invoked by the pipeline to determine the output information. */ + void + GenerateOutputInformation() override; + + using Superclass::MakeOutput; + + /** Make a DataObject of the correct type to be used as the specified output. */ + DataObjectPointer + MakeOutput(DataObjectPointerArraySizeType) override + { + return TransformOutputType::New(); + } + + /** For reading if only filename was given. */ + using ReaderType = ImageFileReader; + + using TranslationOffset = typename TransformType::OutputVectorType; + using ImagePointer = typename ImageType::Pointer; + using ImageConstPointer = typename ImageType::ConstPointer; + + template + typename TImageToRead::Pointer + GetImageHelper(TileIndexType nDIndex, bool metadataOnly, RegionType region); + + /** Just get image pointer if the image is present, otherwise read it from file. */ + typename ImageType::Pointer + GetImage(TileIndexType nDIndex, bool metadataOnly); + + DataObjectPointerArraySizeType + nDIndexToLinearIndex(TileIndexType nDIndex) const; + TileIndexType + LinearIndexTonDIndex(DataObjectPointerArraySizeType linearIndex) const; + DataObjectPointerArraySizeType + ReferenceLinearIndex(DataObjectPointerArraySizeType candidateIndex) const; + + /** Register a pair of images with given indices. Handles FFTcaching. */ + void + RegisterPair(TileIndexType fixed, TileIndexType moving); + + /** If possible, removes from memory tile with index smaller by 1 along all dimensions. */ + void + ReleaseMemory(TileIndexType finishedTile); + + /** Accesses output, sets a transform to it, and updates progress. */ + void + WriteOutTransform(TileIndexType index, TranslationOffset offset); + + /** Updates mosaic bounds. The transform applies to input. + * input0 is tile in the top-left corner. */ + void + UpdateMosaicBounds(TileIndexType index, + TransformConstPointer transform, + const ImageType * input, + const ImageType * input0); + + /** Image's FFT type. */ + using FFTType = typename PCMType::ComplexImageType; + using FFTPointer = typename FFTType::Pointer; + using FFTConstPointer = typename FFTType::ConstPointer; + + using OffsetVector = std::vector; + using ConfidencesType = typename PCMType::ConfidencesVector; + + void + OptimizeTiles(); + + std::deque m_TileReadLocks; // to avoid reading the same tile by more than one thread in parallel + // deque is not reallocated when resized, so no mutex moving causing a crash + +private: + SizeType m_MontageSize; + SizeValueType m_LinearMontageSize = 0; + SizeValueType m_NumberOfPairs = 0; + + std::atomic m_FinishedPairs = { 0 }; + + PointType m_OriginAdjustment; + SpacingType m_ForcedSpacing; + float m_AbsoluteThreshold = 1.0; + float m_RelativeThreshold = 3.0; + SizeValueType m_PositionTolerance = 0; + bool m_CropToOverlap = true; + SizeType m_ObligatoryPadding; + + std::mutex m_MemberProtector; // to prevent concurrent access to non-thread-safe internal member variables + + typename PCMType::PaddingMethodEnum m_PaddingMethod = PCMType::PaddingMethodEnum::MirrorWithExponentialDecay; + + std::vector m_Filenames; + std::vector m_FFTCache; + std::vector m_Tiles; // metadata/image storage (if filenames are given instead of actual images) + std::vector m_TransformCandidates; // to adjacent tiles + std::vector m_CandidateConfidences; + std::vector m_CurrentAdjustments; + std::vector m_TileReliabilities; + + typename PCMOptimizerType::PeakInterpolationMethodEnum m_PeakInterpolationMethod = + PCMOptimizerType::PeakInterpolationMethodEnum::Parabolic; + + const typename ImageType::Pointer m_Dummy = ImageType::New(); + + // members needed for ResampleIntoSingleImage + ContinuousIndexType m_MinInner; // minimum index for cropped montage + ContinuousIndexType m_MaxInner; // maximum index for cropped montage + ContinuousIndexType m_MinOuter; // minimum index for total montage + ContinuousIndexType m_MaxOuter; // maximum index for total montage + + template + friend class TileMergeImageFilter; +}; // class TileMontage + +} // namespace itk + +#ifndef ITK_MANUAL_INSTANTIATION +# include "itkTileMontage.hxx" +#endif + +#endif // itkTileMontage_h diff --git a/Modules/Registration/Montage/include/itkTileMontage.hxx b/Modules/Registration/Montage/include/itkTileMontage.hxx new file mode 100644 index 000000000000..dce24ce2ff34 --- /dev/null +++ b/Modules/Registration/Montage/include/itkTileMontage.hxx @@ -0,0 +1,814 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkTileMontage_hxx +#define itkTileMontage_hxx + + +#include "itkMultiThreaderBase.h" +#include "itkNumericTraits.h" +#include "itkThreadPool.h" +#include "itkConfigure.h" // for ITK_USE_FFTWF and ITK_USE_FFTWD + +#include "itk_eigen.h" +#include ITK_EIGEN(Sparse) + +#include +#include +#include +#include + +namespace itk +{ +template +TileMontage::TileMontage() +{ + this->ThreaderUpdateProgressOff(); // we will update the progress from the filter + m_OriginAdjustment.Fill(0); + m_ForcedSpacing.Fill(0); + + // make default padding sufficient for exponential decay to zero + m_ObligatoryPadding.Fill(0); + SizeType pad; + pad.Fill(8 * sizeof(typename TImageType::PixelType)); + this->SetObligatoryPadding(pad); + + SizeType initialSize; + initialSize.Fill(1); + initialSize[0] = 2; + this->SetMontageSize(initialSize); + +#if defined(ITK_USE_FFTWF) || defined(ITK_USE_FFTWD) // FFTW, MKL and cuFFT are already parallel + // we want light parallelism, just to overlap IO with computation + this->SetNumberOfWorkUnits(std::max(2u, MultiThreaderBase::GetGlobalDefaultNumberOfThreads() / 16)); +#else // we are dealing with VNL's single threaded implementation + this->SetNumberOfWorkUnits(MultiThreaderBase::GetGlobalDefaultNumberOfThreads()); // we want full parallelism +#endif + + // required for GenerateOutputInformation to be called + this->SetNthOutput(0, this->MakeOutput(0).GetPointer()); +} + +template +void +TileMontage::PrintSelf(std::ostream & os, Indent indent) const +{ + if (this->GetDebug()) + { + Superclass::PrintSelf(os, indent); // this can be overwhelming + } + os << indent << "Montage size: " << m_MontageSize << std::endl; + os << indent << "Linear Montage size: " << m_LinearMontageSize << std::endl; + os << indent << "Finished Pairs: " << m_FinishedPairs << std::endl; + os << indent << "Origin Adjustment: " << m_OriginAdjustment << std::endl; + os << indent << "Forced Spacing: " << m_ForcedSpacing << std::endl; + os << indent << "Obligatory Padding: " << m_ObligatoryPadding << std::endl; + os << indent << "Absolute Threshold: " << m_AbsoluteThreshold << std::endl; + os << indent << "Relative Threshold: " << m_RelativeThreshold << std::endl; + os << indent << "Position Tolerance: " << m_PositionTolerance << std::endl; + + auto nullCount = std::count(m_Filenames.begin(), m_Filenames.end(), std::string()); + os << indent << "Filenames (filled/capacity): " << m_Filenames.size() - nullCount << "/" << m_Filenames.size() + << std::endl; + nullCount = std::count(m_FFTCache.begin(), m_FFTCache.end(), nullptr); + os << indent << "FFTCache (filled/capacity): " << m_FFTCache.size() - nullCount << "/" << m_FFTCache.size() + << std::endl; + + os << indent << "MinInner: " << m_MinInner << std::endl; + os << indent << "MaxInner: " << m_MaxInner << std::endl; + os << indent << "MinOuter: " << m_MinOuter << std::endl; + os << indent << "MaxOuter: " << m_MaxOuter << std::endl; +} + +template +void +TileMontage::SetMontageSize(SizeType montageSize) +{ + if (m_MontageSize != montageSize) + { + m_LinearMontageSize = 1u; + for (unsigned d = 0; d < ImageDimension; d++) + { + m_LinearMontageSize *= montageSize[d]; + } + this->SetNumberOfRequiredInputs(m_LinearMontageSize); + this->SetNumberOfRequiredOutputs(m_LinearMontageSize); + m_MontageSize = montageSize; + m_TileReadLocks.resize(m_LinearMontageSize); + m_Filenames.resize(m_LinearMontageSize); + m_FFTCache.resize(m_LinearMontageSize); + m_Tiles.resize(m_LinearMontageSize); + m_CurrentAdjustments.resize(m_LinearMontageSize); + m_TileReliabilities.resize(m_LinearMontageSize); + m_TransformCandidates.resize(ImageDimension * m_LinearMontageSize); // adjacency along each dimension + m_CandidateConfidences.resize(ImageDimension * m_LinearMontageSize); + this->Modified(); + } +} + +template +template +typename TImageToRead::Pointer +TileMontage::GetImageHelper(TileIndexType nDIndex, bool metadataOnly, RegionType region) +{ + DataObjectPointerArraySizeType linearIndex = nDIndexToLinearIndex(nDIndex); + const auto cInput = static_cast(this->GetInput(linearIndex)); + typename TImageToRead::Pointer input = const_cast(cInput); + typename TImageToRead::Pointer result = nullptr; + if (input.GetPointer() != reinterpret_cast(this->m_Dummy.GetPointer())) + { + // construct new metadata so adjustments do not modify the original input + result = TImageToRead::New(); + result->SetRegions(input->GetBufferedRegion()); + result->SetOrigin(input->GetOrigin()); + result->SetSpacing(input->GetSpacing()); + result->SetDirection(input->GetDirection()); + result->SetPixelContainer(input->GetPixelContainer()); + } + else // examine cache and read from file if necessary + { + using ImageReaderType = ImageFileReader; + typename ImageReaderType::Pointer iReader = ImageReaderType::New(); + iReader->SetFileName(this->m_Filenames[linearIndex]); + iReader->UpdateOutputInformation(); + result = iReader->GetOutput(); + + if (!metadataOnly) + { + RegionType regionToRead = result->GetLargestPossibleRegion(); + if (region.GetNumberOfPixels() > 0) + { + regionToRead.Crop(region); + result->SetRequestedRegion(regionToRead); + } + iReader->Update(); + } + result->DisconnectPipeline(); + } + + // adjust origin and spacing + PointType origin = result->GetOrigin(); + for (unsigned d = 0; d < ImageDimension; d++) + { + origin[d] += this->m_OriginAdjustment[d] * nDIndex[d]; + } + result->SetOrigin(origin); + if (this->m_ForcedSpacing[0] != 0) + { + result->SetSpacing(this->m_ForcedSpacing); + } + + return result; +} + +template +auto +TileMontage::GetImage(TileIndexType nDIndex, bool metadataOnly) -> typename ImageType::Pointer +{ + RegionType reg0; // default-initialized to zeroes + SizeValueType linearIndex = this->nDIndexToLinearIndex(nDIndex); + std::lock_guard lockGuard(m_TileReadLocks[linearIndex]); + // if we are not cropping to overlap, FFTCache will kick in later + // and we don't want to double-cache the input tiles + if (!m_CropToOverlap && m_Tiles[linearIndex].IsNotNull()) + { + RegionType r = m_Tiles[linearIndex]->GetBufferedRegion(); + if (metadataOnly || r.GetNumberOfPixels() > 0) + { + return m_Tiles[linearIndex]; + } + } + + return GetImageHelper(nDIndex, metadataOnly, reg0); +} + +template +DataObject::DataObjectPointerArraySizeType +TileMontage::nDIndexToLinearIndex(TileIndexType nDIndex) const +{ + DataObjectPointerArraySizeType ind = 0; + SizeValueType stride = 1u; + for (unsigned d = 0; d < ImageDimension; d++) + { + itkAssertOrThrowMacro(nDIndex[d] < m_MontageSize[d], + "Tile index " << nDIndex << " exceeds tile size " << m_MontageSize << " at dimension " << d); + ind += nDIndex[d] * stride; + stride *= m_MontageSize[d]; + } + return ind; +} + +template +auto +TileMontage::LinearIndexTonDIndex(DataObject::DataObjectPointerArraySizeType linearIndex) const + -> TileIndexType +{ + TileIndexType ind; + SizeValueType stride = 1u; + for (unsigned d = 0; d < ImageDimension; d++) + { + stride *= m_MontageSize[d]; + ind[d] = linearIndex % m_MontageSize[d]; + linearIndex /= m_MontageSize[d]; + } + itkAssertOrThrowMacro(linearIndex < stride, + "Linear tile index " << linearIndex << " exceeds total montage size " << stride); + return ind; +} + +template +auto +TileMontage::ReferenceLinearIndex(DataObjectPointerArraySizeType candidateIndex) const + -> DataObjectPointerArraySizeType +{ + SizeValueType linIndex = candidateIndex % m_LinearMontageSize; + TileIndexType currentIndex = this->LinearIndexTonDIndex(linIndex); + TileIndexType referenceIndex = currentIndex; + unsigned dim = candidateIndex / m_LinearMontageSize; + referenceIndex[dim] = currentIndex[dim] - 1; + return this->nDIndexToLinearIndex(referenceIndex); +} + +template +void +TileMontage::RegisterPair(TileIndexType fixed, TileIndexType moving) +{ + SizeValueType lFixedInd = nDIndexToLinearIndex(fixed); + SizeValueType lMovingInd = nDIndexToLinearIndex(moving); + + typename PCMType::Pointer m_PCM = PCMType::New(); + typename PCMOperatorType::Pointer m_PCMOperator = PCMOperatorType::New(); + typename PCMOptimizerType::Pointer m_PCMOptimizer = PCMOptimizerType::New(); + m_PCM->SetPaddingMethod(m_PaddingMethod); + m_PCM->SetCropToOverlap(m_CropToOverlap); + m_PCM->SetOperator(m_PCMOperator); + m_PCM->SetOptimizer(m_PCMOptimizer); + m_PCM->SetObligatoryPadding(m_ObligatoryPadding); + m_PCM->SetReleaseDataFlag(this->GetReleaseDataFlag()); + m_PCM->SetReleaseDataBeforeUpdateFlag(this->GetReleaseDataBeforeUpdateFlag()); + m_PCMOptimizer->SetPixelDistanceTolerance(m_PositionTolerance); + m_PCMOptimizer->SetPeakInterpolationMethod(m_PeakInterpolationMethod); + + auto mImage = this->GetImage(moving, false); + m_PCM->SetFixedImage(this->GetImage(fixed, false)); + m_PCM->SetMovingImage(mImage); + // scoping the lock + { + std::lock_guard lock(m_MemberProtector); + m_PCM->SetFixedImageFFT(m_FFTCache[lFixedInd]); // maybe null + m_PCM->SetMovingImageFFT(m_FFTCache[lMovingInd]); // maybe null + } + // m_PCM->DebugOn(); + m_PCM->Update(); + + if (!m_CropToOverlap) + { + std::lock_guard lock(m_MemberProtector); + m_FFTCache[lFixedInd] = m_PCM->GetFixedImageFFT(); // certainly not null + m_FFTCache[lMovingInd] = m_PCM->GetMovingImageFFT(); // certrainly not null + } + + const typename PCMType::OffsetVector & offsets = m_PCM->GetOffsets(); + SizeValueType regLinearIndex = lMovingInd; + for (unsigned d = 0; d < ImageDimension; d++) + { + if (fixed[d] != moving[d]) // this is the different dimension + { + regLinearIndex += d * m_LinearMontageSize; + break; + } + } + + m_CandidateConfidences[regLinearIndex] = m_PCM->GetConfidences(); + m_TransformCandidates[regLinearIndex].resize(offsets.size()); + for (unsigned i = 0; i < offsets.size(); i++) + { + if (m_CandidateConfidences[regLinearIndex][i] == 0) + { + m_CandidateConfidences[regLinearIndex][i] = std::numeric_limits::epsilon(); + } + + for (unsigned d = 0; d < ImageDimension; d++) + { + if (std::isfinite(offsets[i][d])) + { + m_TransformCandidates[regLinearIndex][i][d] = offsets[i][d]; + } + else + { + m_TransformCandidates[regLinearIndex][i][d] = 0; + } + } + } +} + +template +void +TileMontage::ReleaseMemory(TileIndexType finishedTile) +{ + TileIndexType oldIndex; + bool releaseTile = true; + for (unsigned dim = 0; dim < ImageDimension; dim++) + { + if (finishedTile[dim] > 0) + { + oldIndex[dim] = finishedTile[dim] - 1; + } + else + { + releaseTile = false; + } + } + if (releaseTile) + { + SizeValueType linearIndex = this->nDIndexToLinearIndex(oldIndex); + std::lock_guard lock(m_MemberProtector); + m_FFTCache[linearIndex] = nullptr; + if (!m_Filenames[linearIndex].empty()) // release the input image too + { + this->SetInputTile(oldIndex, m_Dummy); + } + if (m_Tiles[linearIndex]) + { + RegionType reg0; + m_Tiles[linearIndex]->SetBufferedRegion(reg0); + m_Tiles[linearIndex]->Allocate(false); + } + } +} + +template +void +TileMontage::WriteOutTransform(TileIndexType index, TranslationOffset offset) +{ + TransformPointer transform = TransformType::New(); + transform->SetOffset(offset); + const SizeValueType linearIndex = this->nDIndexToLinearIndex(index); + auto dOut = this->GetOutput(linearIndex); + const auto cOut = static_cast(dOut); + auto decorator = const_cast(cOut); + decorator->Set(transform); + auto input0 = static_cast(this->GetInput(0)); + auto input = static_cast(this->GetInput(linearIndex)); + this->UpdateMosaicBounds(index, transform, input, input0); +} + +template +void +TileMontage::UpdateMosaicBounds(TileIndexType index, + TransformConstPointer transform, + const ImageType * input, + const ImageType * input0) +{ + PointType p; + ContinuousIndexType ci; + ImageIndexType ind = input->GetLargestPossibleRegion().GetIndex(); + input->TransformIndexToPhysicalPoint(ind, p); + TransformPointer inverseT = TransformType::New(); + transform->GetInverse(inverseT); + p = inverseT->TransformPoint(p); + ci = input0->template TransformPhysicalPointToContinuousIndex(p); + for (unsigned d = 0; d < ImageDimension; d++) + { + if (index[d] == 0) // this tile is on the minimum edge + { + m_MinInner[d] = std::max(m_MinInner[d], ci[d]); + m_MinOuter[d] = std::min(m_MinOuter[d], ci[d]); + } + } + ind += input->GetLargestPossibleRegion().GetSize(); + input->TransformIndexToPhysicalPoint(ind, p); + p = inverseT->TransformPoint(p); + ci = input0->template TransformPhysicalPointToContinuousIndex(p); + for (unsigned d = 0; d < ImageDimension; d++) + { + if (index[d] == m_MontageSize[d] - 1) // this tile is on the maximum edge + { + m_MaxOuter[d] = std::max(m_MaxOuter[d], ci[d]); + m_MaxInner[d] = std::min(m_MaxInner[d], ci[d]); + } + } +} + +template +void +TileMontage::GenerateOutputInformation() +{ + Superclass::GenerateOutputInformation(); + for (SizeValueType i = 1; i < m_LinearMontageSize; i++) + { + this->SetNthOutput(i, this->MakeOutput(i).GetPointer()); + } +} + +template +void +TileMontage::OptimizeTiles() +{ + // formulate global optimization as an overdetermined linear system + constexpr unsigned Dimension = ImageDimension; + using SparseMatrix = Eigen::SparseMatrix; + SparseMatrix regCoef(m_NumberOfPairs + 1, m_LinearMontageSize); + regCoef.reserve(Eigen::VectorXi::Constant(m_NumberOfPairs + 1, 2)); // 2 non-zeroes per row + using TranslationsMatrix = Eigen::Matrix; + TranslationsMatrix translations(m_NumberOfPairs + 1, Dimension); + std::vector equationToCandidate(m_NumberOfPairs); + SizeValueType regIndex = 0; + double confidenceTotal = 0.0; + for (SizeValueType i = 0; i < m_LinearMontageSize * ImageDimension; i++) + { + if (!m_TransformCandidates[i].empty()) + { + SizeValueType linIndex = i % m_LinearMontageSize; + SizeValueType refLinearIndex = this->ReferenceLinearIndex(i); + + // construct equation: -c*refLinearIndex + c*linIndex = c*candidateOffset, c=confidence + const float & confidence = m_CandidateConfidences[i][0]; + regCoef.insert(regIndex, refLinearIndex) = -confidence; + regCoef.insert(regIndex, linIndex) = confidence; + const TranslationOffset & candidateOffset = m_TransformCandidates[i][0]; + for (unsigned d = 0; d < ImageDimension; d++) + { + translations(regIndex, d) = confidence * candidateOffset[d]; + } + equationToCandidate[regIndex] = i; + ++regIndex; + assert(m_CandidateConfidences[i][0] > 0); + confidenceTotal += m_CandidateConfidences[i][0]; + } + } + TCoordinate confidenceAvg = confidenceTotal / m_NumberOfPairs; + assert(regIndex == m_NumberOfPairs); + + regCoef.insert(regIndex, 0) = confidenceAvg; // tile 0,0...0 + for (unsigned d = 0; d < ImageDimension; d++) + { + translations(regIndex, d) = 0; // should have position 0,0...0 + } + + typename ImageType::SpacingType spacing = this->GetImage(this->LinearIndexTonDIndex(0), true)->GetSpacing(); + Eigen::LeastSquaresConjugateGradient solver; + bool outlierExists = true; + unsigned iteration = 0; + while (outlierExists) + { + if (this->GetDebug()) + { + std::cout << "\n\n"; // make it easier to spot new iteration + } + std::cout << "\nIteration " << ++iteration << " "; + regCoef.makeCompressed(); + solver.compute(regCoef); + TranslationsMatrix solutions(m_LinearMontageSize, Dimension); + TranslationsMatrix residuals(m_NumberOfPairs + 1, Dimension); + solutions = solver.solve(translations); + residuals = regCoef * solutions - translations; + + if (this->GetDebug()) + { + std::cout << "\ntranslations:\n" << translations; + std::cout << std::endl << "current|solution:" << std::endl; + } + for (SizeValueType i = 0; i < m_LinearMontageSize; i++) + { + TranslationOffset & cOffset = m_CurrentAdjustments[i]; + for (unsigned d = 0; d < ImageDimension; d++) + { + if (this->GetDebug()) + { + std::cout << std::fixed << std::setprecision(2); + std::cout << " " << std::setw(8) << cOffset[d] << '|' << std::setw(8) << solutions(i, d); + } + + cOffset[d] = solutions(i, d); + solutions(i, d) /= spacing[d]; // convert solutions into pixel coordinates + } + if (this->GetDebug()) + { + std::cout << std::endl; + } + } + + TranslationsMatrix stdDev0 = + (translations.cwiseAbs2().colwise().sum() / m_NumberOfPairs).cwiseSqrt(); // assume zero mean + if (this->GetDebug()) + { + std::cout << "\nstdDev0:\n" << stdDev0; + } + + std::vector outlierScore(m_NumberOfPairs, 0.0); // sum of squares + for (SizeValueType i = 0; i < m_NumberOfPairs; i++) + { + for (unsigned d = 0; d < ImageDimension; d++) + { + TCoordinate trOverDev = translations(i, d) / stdDev0(d); + outlierScore[i] += itk::Math::abs(trOverDev); + } + if (outlierScore[i] > m_RelativeThreshold) // more than this many standard deviations + { + outlierScore[i] -= m_RelativeThreshold; + } + else + { + outlierScore[i] = 0.0; // not an outlier + } + } + + TCoordinate maxCost = 0; + SizeValueType maxIndex = 0; + if (this->GetDebug()) + { + std::cout << "\nresiduals:\n"; + } + + m_TileReliabilities.clear(); + m_TileReliabilities.resize(m_LinearMontageSize, 0.0); // reset all to zero + for (SizeValueType i = 0; i < m_NumberOfPairs; i++) + { + TCoordinate residual = 0; + if (this->GetDebug()) + { + std::cout << 'E' << i << ':'; + } + for (unsigned d = 0; d < ImageDimension; d++) + { + residuals(i, d) /= spacing[d]; // convert residuals into pixel coordinates + if (this->GetDebug()) + { + std::cout << ' ' << std::setw(8) << residuals(i, d); + } + residual += residuals(i, d) * residuals(i, d); + } + residual = std::sqrt(residual); // MSE -> RMSE + + // reduce residual by confidence + SizeValueType candidateIndex = equationToCandidate[i]; + if (m_CandidateConfidences[candidateIndex].empty()) + { + residual /= confidenceAvg; + } + else + { + residual /= m_CandidateConfidences[candidateIndex][0]; + } + + // establish cost of this equation + TCoordinate cost = residual * (1.0 + outlierScore[i]); + + if (this->GetDebug()) + { + std::cout << " :" << std::setw(6) << outlierScore[i]; + std::cout << " =" << std::setw(8) << cost; + std::cout << std::endl; + } + if (cost > maxCost) + { + maxCost = cost; + maxIndex = i; + } + + // accumulate costs into tile reliabilities + SizeValueType linIndex = candidateIndex % m_LinearMontageSize; + SizeValueType refLinearIndex = this->ReferenceLinearIndex(candidateIndex); + m_TileReliabilities[linIndex] += cost; + m_TileReliabilities[refLinearIndex] += cost; + } + if (this->GetDebug()) + { + std::cout << std::endl; + } + + // now convert costs into reliabilities + float minReliabilityCost = std::numeric_limits::max(); + float maxReliabilityCost = 0.0; + // first divide by number of registrations + for (SizeValueType i = 0; i < m_LinearMontageSize; ++i) + { + TileIndexType nDIndex = LinearIndexTonDIndex(i); + unsigned regCount = 2 * Dimension; // for tiles in the middle + // now reduce this by one for each dimension's edge this finds itself on + for (unsigned d = 0; d < Dimension; ++d) + { + if (nDIndex[d] == 0 || nDIndex[d] == m_MontageSize[d] - 1) + { + --regCount; + } + } + assert(regCount >= 1); // every tile must have participated in at least on registration + m_TileReliabilities[i] /= regCount; + if (m_TileReliabilities[i] < minReliabilityCost) + { + minReliabilityCost = m_TileReliabilities[i]; + } + if (m_TileReliabilities[i] > maxReliabilityCost) + { + maxReliabilityCost = m_TileReliabilities[i]; + } + } + if (this->GetDebug()) + { + std::cout << "Reliabilities:"; + } + // now transform costs into (0.0, 1.0] reliability range + for (SizeValueType i = 0; i < m_LinearMontageSize; ++i) + { + // map minReliabilityCost to 1.0 reliability; map maxReliabilityCost to near zero (min/max) + float sourceRange = maxReliabilityCost - minReliabilityCost; + float newMin = minReliabilityCost / maxReliabilityCost; + float targetRange = 1.0 - newMin; + float fraction = (maxReliabilityCost - m_TileReliabilities[i]) / sourceRange; + m_TileReliabilities[i] = newMin + fraction * (targetRange); + if (this->GetDebug()) + { + if (i % m_MontageSize[0] == 0) + { + std::cout << '\n'; + } + std::cout << std::fixed << std::setprecision(4); + std::cout << " " << std::setw(6) << m_TileReliabilities[i]; + } + } + if (this->GetDebug()) + { + std::cout << std::endl; + } + + static const float sqrtDim = std::sqrt(ImageDimension); + if (maxCost < m_AbsoluteThreshold * sqrtDim) + { + outlierExists = false; + } + else // eliminate the problematic equation + { + SizeValueType candidateIndex = equationToCandidate[maxIndex]; + std::cout << "Outlier detected. Eq. " << maxIndex << ", Reg. " << candidateIndex; + + // calculate indices of the involved tiles + SizeValueType linIndex = candidateIndex % m_LinearMontageSize; + TileIndexType currentIndex = this->LinearIndexTonDIndex(linIndex); + TileIndexType referenceIndex = currentIndex; + unsigned dim = candidateIndex / m_LinearMontageSize; + referenceIndex[dim] = currentIndex[dim] - 1; + std::cout << ": " << currentIndex << "->" << referenceIndex << " T: "; + + if (!m_TransformCandidates[candidateIndex].empty()) + { + std::cout << m_TransformCandidates[candidateIndex][0]; + m_TransformCandidates[candidateIndex].erase(m_TransformCandidates[candidateIndex].begin()); + m_CandidateConfidences[candidateIndex].erase(m_CandidateConfidences[candidateIndex].begin()); + } + else + { + std::cout << "zeroes"; + } + + if (!m_TransformCandidates[candidateIndex].empty()) + { + // get a new equation from m_TransformCandidates + const float & confidence = m_CandidateConfidences[candidateIndex][0]; + typename SparseMatrix::InnerIterator it(regCoef, maxIndex); + regCoef.coeffRef(maxIndex, it.index()) = -confidence; + ++it; + regCoef.coeffRef(maxIndex, it.index()) = confidence; + + const TranslationOffset & candidateOffset = m_TransformCandidates[candidateIndex][0]; + for (unsigned d = 0; d < ImageDimension; d++) + { + translations(maxIndex, d) = confidence * candidateOffset[d]; + } + std::cout << " Replaced by T: " << candidateOffset; + } + else + { + // nudge this registration towards zero adjustment + typename SparseMatrix::InnerIterator it(regCoef, maxIndex); + regCoef.coeffRef(maxIndex, it.index()) = 0.01 * regCoef.coeffRef(maxIndex, it.index()); + ++it; + regCoef.coeffRef(maxIndex, it.index()) = 0.01 * regCoef.coeffRef(maxIndex, it.index()); + + for (unsigned d = 0; d < ImageDimension; d++) + { + translations(maxIndex, d) = 0; + } + std::cout << " Replaced by zeroes."; + } + } + } +} + +template +void +TileMontage::GenerateData() +{ + // initialize mosaic bounds + auto input0 = static_cast(this->GetInput(0)); + ImageIndexType ind = input0->GetLargestPossibleRegion().GetIndex(); + m_MinInner = ind; + m_MinOuter = ind; + ind += input0->GetLargestPossibleRegion().GetSize(); + m_MaxOuter = ind; + m_MaxInner.Fill(NumericTraits::max()); + + m_NumberOfPairs = 0; // number of equations = number of registration pairs + for (unsigned d = 0; d < ImageDimension; d++) + { + m_NumberOfPairs += (m_LinearMontageSize / m_MontageSize[d]) * (m_MontageSize[d] - 1); + } + + TileIndexType ind0; + ind0.Fill(0); + m_FinishedPairs = 0; + m_CurrentAdjustments[0].Fill(0.0); // 0 translation by default + + typename ThreadPool::Pointer pool = ThreadPool::GetInstance(); + ThreadIdType tpThreads = pool->GetMaximumNumberOfThreads(); + ThreadIdType workUnits = this->GetNumberOfWorkUnits(); + if (tpThreads <= workUnits) + { + pool->AddThreads(workUnits - tpThreads + 1); + } + + std::vector> futures(m_LinearMontageSize); + SizeValueType waited = 0; + for (SizeValueType i = 0; i < m_LinearMontageSize; i++) + { + // filling ThreadPool's queue with more top-level jobs + // than there are threads causes dead-lock, so let's be conservative + if (i - waited >= workUnits) + { + TileIndexType currentIndex = this->LinearIndexTonDIndex(waited); + futures[waited].get(); // waits for the computation to finish + this->ReleaseMemory(currentIndex); + // all registrations finished = 95% of total progress + this->UpdateProgress(m_FinishedPairs * 0.95 / m_NumberOfPairs); + ++waited; + } + + TileIndexType currentIndex = this->LinearIndexTonDIndex(i); + futures[i] = pool->AddWork([this, currentIndex]() { + // register i-th tile to adjacent tiles along all dimensions (lower index only) + TileIndexType currentTile = currentIndex; // we cannot modify currentIndex + for (unsigned regDim = 0; regDim < ImageDimension; regDim++) + { + if (currentTile[regDim] > 0) // we are not at the edge along this dimension + { + TileIndexType referenceIndex = currentTile; + referenceIndex[regDim] = currentTile[regDim] - 1; + this->RegisterPair(referenceIndex, currentTile); + ++m_FinishedPairs; + } + } + }); + // optimize positions later, now just set the expected position (no translation) + m_CurrentAdjustments[waited].Fill(0.0); + } + + for (SizeValueType i = waited; i < m_LinearMontageSize; i++) + { + TileIndexType currentIndex = this->LinearIndexTonDIndex(i); + futures[i].get(); // waits for the computation to finish + this->ReleaseMemory(currentIndex); + // all registrations finished = 95% of total progress + this->UpdateProgress(m_FinishedPairs * 0.95 / m_NumberOfPairs); + } + + this->OptimizeTiles(); + + // clear rest of the cache after montaging is finished + RegionType reg0; + for (SizeValueType i = 0; i < m_LinearMontageSize; i++) + { + TileIndexType tileIndex = this->LinearIndexTonDIndex(i); + WriteOutTransform(tileIndex, m_CurrentAdjustments[i]); + m_FFTCache[i] = nullptr; + if (!m_Filenames[i].empty()) // release the input image too + { + this->SetInputTile(tileIndex, m_Dummy); + } + if (m_Tiles[i]) + { + m_Tiles[i]->SetBufferedRegion(reg0); + m_Tiles[i]->Allocate(false); + } + } + this->UpdateProgress(1.0f); +} + +} // namespace itk + +#endif // itkTileMontage_hxx diff --git a/Modules/Registration/Montage/itk-module.cmake b/Modules/Registration/Montage/itk-module.cmake new file mode 100644 index 000000000000..747667394d88 --- /dev/null +++ b/Modules/Registration/Montage/itk-module.cmake @@ -0,0 +1,26 @@ +set( + DOCUMENTATION + "This module provides Montage: mosaic-stitching and 3D +reconstruction of large datasets from a collection of partially +overlapping 2D slices via phase-correlation image registration. +Core pieces are \\\\ref PhaseCorrelationImageRegistrationMethod, +\\\\ref TileMontage, and \\\\ref TileMergeImageFilter. +See the module README for in-tree vs archived-upstream scope." +) + +itk_module( + Montage + DEPENDS + ITKCommon + ITKFFT + ITKTransform + ITKIOImageBase + ITKImageFrequency + ITKDoubleConversion + TEST_DEPENDS + ITKIOTransformInsightLegacy + ITKTestKernel + DESCRIPTION "${DOCUMENTATION}" + EXCLUDE_FROM_DEFAULT + ENABLE_SHARED +) diff --git a/Modules/Registration/Montage/src/CMakeLists.txt b/Modules/Registration/Montage/src/CMakeLists.txt new file mode 100644 index 000000000000..67813296ab81 --- /dev/null +++ b/Modules/Registration/Montage/src/CMakeLists.txt @@ -0,0 +1,6 @@ +set( + Montage_SRCS + itkPhaseCorrelationOptimizer.cxx + itkPhaseCorrelationImageRegistrationMethod.cxx +) +itk_module_add_library(Montage ${Montage_SRCS}) diff --git a/Modules/Registration/Montage/src/itkPhaseCorrelationImageRegistrationMethod.cxx b/Modules/Registration/Montage/src/itkPhaseCorrelationImageRegistrationMethod.cxx new file mode 100644 index 000000000000..c893f006e89b --- /dev/null +++ b/Modules/Registration/Montage/src/itkPhaseCorrelationImageRegistrationMethod.cxx @@ -0,0 +1,40 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#include "itkPhaseCorrelationImageRegistrationMethod.h" + +namespace itk +{ +/** Define how to print enumerations */ +std::ostream & +operator<<(std::ostream & out, const PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod value) +{ + return out << [value] { + switch (value) + { + case PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::Zero: + return "PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::Zero"; + case PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::Mirror: + return "PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::Mirror"; + case PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::MirrorWithExponentialDecay: + return "PhaseCorrelationImageRegistrationMethodEnums::PaddingMethod::MirrorWithExponentialDecay"; + default: + return "INVALID VALUE FOR PaddingMethod"; + } + }(); +} +} // end namespace itk diff --git a/Modules/Registration/Montage/src/itkPhaseCorrelationOptimizer.cxx b/Modules/Registration/Montage/src/itkPhaseCorrelationOptimizer.cxx new file mode 100644 index 000000000000..3014e5a44438 --- /dev/null +++ b/Modules/Registration/Montage/src/itkPhaseCorrelationOptimizer.cxx @@ -0,0 +1,44 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#include "itkPhaseCorrelationOptimizer.h" + +namespace itk +{ +/** Define how to print enumerations */ +std::ostream & +operator<<(std::ostream & out, const PhaseCorrelationOptimizerEnums::PeakInterpolationMethod value) +{ + return out << [value] { + switch (value) + { + case PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::None: + return "PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::None"; + case PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Parabolic: + return "PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Parabolic"; + case PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Cosine: + return "PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Cosine"; + case PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::WeightedMeanPhase: + return "PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::WeightedMeanPhase"; + // case PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::PhaseFrequencySlope: + // return "PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::PhaseFrequencySlope"; + default: + return "INVALID VALUE FOR PeakInterpolationMethod"; + } + }(); +} +} // end namespace itk diff --git a/Modules/Registration/Montage/test/CMakeLists.txt b/Modules/Registration/Montage/test/CMakeLists.txt new file mode 100644 index 000000000000..62d16aae6b2c --- /dev/null +++ b/Modules/Registration/Montage/test/CMakeLists.txt @@ -0,0 +1,956 @@ +itk_module_test() + +add_compile_options(-D_SCL_SECURE_NO_WARNINGS) # disable non-standard warning on MSVC + +set( + MontageTests + itkInMemoryMontageTest2D.cxx + itkMontagePCMTestSynthetic.cxx + itkMontagePCMTestFiles.cxx + itkMontageGenericTests.cxx + itkMontageTest.cxx + itkMontageTruthCreator.cxx +) + +createtestdriver(Montage "${Montage-Test_LIBRARIES}" "${MontageTests}") + +set(TESTING_OUTPUT_PATH "${CMAKE_BINARY_DIR}/Testing/Temporary") + +itk_add_test( + NAME itkMontageGenericTests + COMMAND + MontageTestDriver + itkMontageGenericTests +) + +set(SyntheticOutputPath "${TESTING_OUTPUT_PATH}/synthetic") +file(MAKE_DIRECTORY ${SyntheticOutputPath}) + +function(AddTestSynthetic dimTTcode startSize endSize) + itk_add_test( + NAME itkMontagePCMSynthetic_${dimTTcode} + COMMAND + MontageTestDriver + itkMontagePCMTestSynthetic + ${dimTTcode} + ${SyntheticOutputPath}/itkMontagePCMSynthetic_${dimTTcode}.nrrd + ${SyntheticOutputPath}/itkMontagePCMSynthetic_${dimTTcode}.tfm + ${startSize} + ${endSize} + ) +endfunction() + +addtestsynthetic(2cc 21 23) +addtestsynthetic(2ff 17 19) +addtestsynthetic(2dd 17 51) +addtestsynthetic(2cf 11 13) +addtestsynthetic(2fd 51 71) +addtestsynthetic(3cc 21 23) +addtestsynthetic(3ff 17 19) +addtestsynthetic(3dd 31 47) +addtestsynthetic(3cf 11 13) +addtestsynthetic(3fd 19 21) + +itk_add_test( + NAME itkMontagePCMSynthetic_ShouldFail + COMMAND + MontageTestDriver + itkMontagePCMTestSynthetic + 2cc + ${TESTING_OUTPUT_PATH}/itkMontagePCMSynthetic_ShouldNotExist.nrrd + ${TESTING_OUTPUT_PATH}/itkMontagePCMSynthetic_ShouldNotExist.tfm + 17 + 19 + 0.9 + 1.1 +) +set_tests_properties( + itkMontagePCMSynthetic_ShouldFail + PROPERTIES + WILL_FAIL + TRUE +) + +itk_add_test( + NAME itkMontagePCMFiles14 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/OMC/FlatField/14/100.tif} + DATA{Input/OMC/FlatField/14/101.tif} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles14.nrrd + 400.755808 + 0.0 + 4.256301848 + 1.647892819 +) + +itk_add_test( + NAME itkMontagePCMFiles15same + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/OMC/FlatField/15/107.tif} + DATA{Input/OMC/FlatField/15/107.tif} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles15same.nrrd + 0.0 + 0.0 + 0.0 + 0.0 +) + +itk_add_test( + NAME itkMontagePCMFiles16 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/OMC/FlatField/16/107.tif} + DATA{Input/OMC/FlatField/16/108.tif} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles16.nrrd + 400.755808 + 0.0 + 4.369578864 + 1.891913136 +) + +itk_add_test( + NAME itkMontagePCMFilesMNML0304crop + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/Synthetic/MNML3_03bottom.png} + DATA{Input/Synthetic/MNML3_04top.png} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesMNML0304crop.nrrd + 0.0 + 111.0 + 1.0413443838811 + 2.550816245965091 +) + +itk_add_test( + NAME itkMontagePCMFilesSynthetic1 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/Synthetic/Rect1.png} + DATA{Input/Synthetic/Rect2.png} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesSynthetic1.nrrd + 0.0 + 0.0 + -21.0 + 35.0 +) + +itk_add_test( + NAME itkMontagePCMFilesSynthetic1N + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/Synthetic/Rect1N.png} + DATA{Input/Synthetic/Rect2N.png} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesSynthetic1N.nrrd + 0.0 + 0.0 + -21.0 + 35.0 +) + +itk_add_test( + NAME itkMontagePCMFilesSynthetic3D + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/Synthetic/Cuboid1.nrrd} + DATA{Input/Synthetic/Cuboid2.nrrd} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesSynthetic3D.nrrd + 0.0 + 0.0 + 0.0 + -21.0 + 35.0 + 1.0 +) + +function(AddTestOMC slicerNumber inMemory tolerance) + itk_add_test( + NAME itkMontageOMC${slicerNumber} + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/OMC/FlatField/${slicerNumber}/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageOMC${slicerNumber}_ + ${TESTING_OUTPUT_PATH}/itkMontageOMC${slicerNumber}Pairs_ + 1 + -1 + ${inMemory} + 1 + 0 + 0 + 0 + ${tolerance} + 1 + ) +endfunction() + +addtestomc(14 1 15) +addtestomc(15 0 15) +addtestomc(16 1 0) +addtestomc(17 0 0) +addtestomc(18 1 0) + +# this test should not crash, but is expected to fail +itk_add_test( + NAME itkMontageSingleLayer3D + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/SingleLayer3D/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageSingleLayer3D + ${TESTING_OUTPUT_PATH}/itkMontageSingleLayer3DPairs + 0 + 2 + 1 + 1 + 0 + 0 + 0 + 0 + 1 +) +set_tests_properties( + itkMontageSingleLayer3D + PROPERTIES + WILL_FAIL + TRUE +) + +itk_add_test( + NAME itkMontageRGBinMemory + COMMAND + MontageTestDriver + --compare + DATA{Input/VisibleHumanRGB/VisibleHumanMale1608.png} + ${SyntheticOutputPath}/itkMontageRGBim0_1.mha + itkMontageTest + DATA{Input/VisibleHumanRGB/,REGEX:.*} + ${SyntheticOutputPath}/itkMontageRGBim + ${SyntheticOutputPath}/itkMontageRGBimPairs + 1 + -1 + 1 + 1 + 0 + 1 + 0 + 0 + 1 +) + +itk_add_test( + NAME itkMontageRGBpairsTol + COMMAND + MontageTestDriver + --compare + DATA{Input/VisibleHumanRGB/VisibleHumanMale1608.png} + ${SyntheticOutputPath}/itkMontageRGBim0_1.mha + itkMontageTest + DATA{Input/VisibleHumanRGB/,REGEX:.*} + ${SyntheticOutputPath}/itkMontageRGBpTol + ${SyntheticOutputPath}/itkMontageRGBpTolPairs + 1 + -1 + 0 + 1 + 1 + 1 + 0 + 10 + 1 +) + +itk_add_test( + NAME itkMontageRGBpairs + COMMAND + MontageTestDriver + --compare + DATA{Input/VisibleHumanRGB/VisibleHumanMale1608.png} + ${SyntheticOutputPath}/itkMontageRGBp0_1.mha + itkMontageTest + DATA{Input/VisibleHumanRGB/,REGEX:.*} + ${SyntheticOutputPath}/itkMontageRGBp + ${SyntheticOutputPath}/itkMontageRGBpPairs + 1 + -1 + 0 + 1 + 1 + 1 + 0 + 0 + 1 +) + +function(AddInMemoryMontageTest variation willFail) + itk_add_test( + NAME itkInMemoryMontage${variation} + COMMAND + MontageTestDriver + --compare + DATA{Input/VisibleHumanRGB/VisibleHumanMale1608.png} + ${SyntheticOutputPath}/itkInMemoryMontageRGB${variation}.mha + --ignoreInputInformation # ignore different spacing + itkInMemoryMontageTest2D + DATA{Input/VisibleHumanRGB/,REGEX:.*} + ${SyntheticOutputPath}/itkInMemoryMontageRGB + ${variation} + ) + set_tests_properties( + itkInMemoryMontage${variation} + PROPERTIES + WILL_FAIL + ${willFail} + ) +endfunction() + +addinmemorymontagetest(0 TRUE) +addinmemorymontagetest(1 TRUE) +addinmemorymontagetest(2 FALSE) +addinmemorymontagetest(3 FALSE) +addinmemorymontagetest(4 FALSE) +addinmemorymontagetest(5 FALSE) +addinmemorymontagetest(6 FALSE) +addinmemorymontagetest(7 FALSE) + +itk_add_test( + NAME itkMontageMediumCarbonSteel + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/MediumCarbonSteel/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageMediumCarbonSteel + ${TESTING_OUTPUT_PATH}/itkMontageMediumCarbonSteelPairs + 1 + -1 + 1 + 4 + 1 + 0 + 0 + 0 + 1 +) + +itk_add_test( + NAME itkMontageCMUrun2_64 + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/05MAR09_run2_64-Raw/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageCMUrun2_64_ + ${TESTING_OUTPUT_PATH}/itkMontageCMUrun2_64Pairs_ + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 1 +) + +itk_add_test( + NAME itkMontageCMUrun2_64_comb + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/05MAR09_run2_64-Raw/,REGEX:.*} + ${SyntheticOutputPath}/itkMontageCMUrun2_64_comb + ${SyntheticOutputPath}/itkMontageCMUrun2_64_combPairs + 1 + -1 + 1 + 4 + 1 + 1 + 0 + 0 + 1 +) + +function(AddTestTi64flat slicerNumber) + set( + inDir + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti64Cylinder/FlatField/1000${slicerNumber}/" + ) + if(EXISTS ${inDir}10099.tif) + itk_add_test( + NAME itkMontageTi64flat${slicerNumber} + COMMAND + MontageTestDriver + itkMontageTest + ${inDir} + ${TESTING_OUTPUT_PATH}/itkMontageTi64flat${slicerNumber}_ + ${TESTING_OUTPUT_PATH}/itkMontageTi64flat${slicerNumber}Pairs_ + 0 + 2 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + ) + endif() +endfunction() + +addtestti64flat(0) +addtestti64flat(1) +addtestti64flat(2) +addtestti64flat(3) +addtestti64flat(4) + +function(AddTestTi64raw slicerNumber) + set( + inDir + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti64Cylinder/Raw/LEROY_0041_Region #1_${slicerNumber}_Mosaic.tif_Files/" + ) + if(EXISTS "${inDir}LEROY_0041_Region #1_${slicerNumber}_Mosaic_p099.tif") + itk_add_test( + NAME itkMontageTi64raw${slicerNumber} + COMMAND + MontageTestDriver + itkMontageTest + ${inDir} + ${TESTING_OUTPUT_PATH}/itkMontageTi64raw${slicerNumber}_ + ${TESTING_OUTPUT_PATH}/itkMontageTi64raw${slicerNumber}Pairs_ + 0 + 2 + 1 + 1 + 0 + 0 + 1 + 0 + 1 + ) + endif() +endfunction() + +addtestti64raw(0) +addtestti64raw(1) +addtestti64raw(2) +addtestti64raw(3) +addtestti64raw(4) + +option( + Module_Montage_EnableFailingTests + "Should we enable tests which are failing due to not-yet-resolved issues?" + OFF +) +# we should remove this option once we resolve https://github.com/InsightSoftwareConsortium/ITK/issues/4613 + +# have uniform options for GroundTruthTests +set(varyingPaddingMethods 0) +set(peakMethod -1) +set(loadIntoMemory 1) +set(streamSubdivisions 1) +set(doPairs 0) +set(writeTransforms 0) +set(allowDrift 1) +set(positionTolerance 0) +set(writeImage 1) + +function(GroundTruthTest2D tempDir inputFile intensityTolerance) # other command-line parameters + set(outDir ${TESTING_OUTPUT_PATH}/${tempDir}/) + file(MAKE_DIRECTORY ${outDir}) + itk_add_test( + NAME itkMontageGroundTruthMake${tempDir} + COMMAND + MontageTestDriver + itkMontageTruthCreator + ${inputFile} + ${outDir} + ${ARGN} + ) + set(regressionPart "") + if(Module_Montage_EnableFailingTests) + set( + regressionPart + --compare + ${inputFile} + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}_2_1.mha + ) + endif() + + itk_add_test( + NAME itkMontageGroundTruthRun${tempDir} + COMMAND + MontageTestDriver + --compareRadiusTolerance + 1 + --compareIntensityTolerance + ${intensityTolerance} + --compareNumberOfPixelsTolerance + 1500 + ${regressionPart} + itkMontageTest + ${outDir} + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}_ + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}Pairs_ + ${varyingPaddingMethods} + ${peakMethod} + ${loadIntoMemory} + ${streamSubdivisions} + ${doPairs} + ${writeTransforms} + ${allowDrift} + ${positionTolerance} + ${writeImage} + ) + set_tests_properties( + itkMontageGroundTruthRun${tempDir} + PROPERTIES + DEPENDS + itkMontageGroundTruthMake${tempDir} + ) +endfunction() + +groundtruthtest2d(10-129 DATA{Input/10-129-C_2/10-129-C_2_p00.jpg} 16 6 4 15 25) +groundtruthtest2d(run2 DATA{Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p0.bmp} 16 4 5 15 10) +groundtruthtest2d(MediumCarbonSteel DATA{Input/MediumCarbonSteel/1701701_000000_Fused.tif} 4096 11 3 20 20) +groundtruthtest2d(MNML3 DATA{Input/MNML_3_200x_701/MNML-3-ITK.png} 16 4 5 5 5) +groundtruthtest2d(MNML5 DATA{Input/MNML_5_500x_101/MNML_5-ITK.png} 16 6 9 5 5) +groundtruthtest2d(VisibleHuman DATA{Input/VisibleHumanRGB/VisibleHumanMale1608.png} 16 5 4 15 15) +groundtruthtest2d(OMC14 DATA{Input/OMC/FlatField/14/OMC14-ITK.tif} 4096 8 6 10 10) + +itk_add_test( + NAME itkMontage-10-129-C_2 + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/10-129-C_2/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontage-10-129-C_2 + ${TESTING_OUTPUT_PATH}/itkMontage-10-129-C_2Pairs + 0 + 2 + 0 + 1 + 0 + 0 + 1 + 0 + 1 +) + +itk_add_test( + NAME itkMontage-S200-small + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/S200-small/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontage-S200-small + ${TESTING_OUTPUT_PATH}/itkMontage-S200-smallPairs + 0 + 1 + 0 + 1 + 0 + 0 + 75 + 0 + 1 +) + +itk_add_test( + NAME itkMontage-S200-6-C + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/S200-6-C/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontage-S200-6-C + ${TESTING_OUTPUT_PATH}/itkMontage-S200-6-C-Pairs + 0 + 2 + 0 + 10 + 0 + 0 + 1 + 25 + 0 +) + +itk_add_test( + NAME itkMontageMNML3 + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/MNML_3_200x_701/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageMNML3_ + ${TESTING_OUTPUT_PATH}/itkMontageMNML3Pairs + 1 + -1 + 0 + 5 + 0 + 0 + 0 + 5 + 1 +) + +itk_add_test( + NAME itkMontageMNML5 + COMMAND + MontageTestDriver + itkMontageTest + DATA{Input/MNML_5_500x_101/,REGEX:.*} + ${TESTING_OUTPUT_PATH}/itkMontageMNML5_ + ${TESTING_OUTPUT_PATH}/itkMontageMNML5Pairs + 0 + 1 + 0 + 10 + 0 + 0 + 1 + 10 + 1 +) + +itk_add_test( + NAME itkMontagePCMFiles-10-129 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/10-129-C_2/10-129-C_2_p00.jpg} + DATA{Input/10-129-C_2/10-129-C_2_p01.jpg} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles-10-129.nrrd + 0.0 + 295.0904267 + -6.143508728 + -10.488 +) + +if(Module_Montage_EnableFailingTests) + itk_add_test( + NAME itkMontagePCMFilesS200_32_33 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/S200-small/S200-6-320x_p032.jpg} + DATA{Input/S200-small/S200-6-320x_p033.jpg} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesS200_32_33.nrrd + 2381.0 + 0.0 + 74.09566 + 7.614863315 + ) +endif() # Module_Montage_EnableFailingTests + +itk_add_test( + NAME itkMontagePCMFilesS200_33_67 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/S200-small/S200-6-320x_p033.jpg} + DATA{Input/S200-small/S200-6-320x_p067.jpg} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesS200_33_67.nrrd + 0.0 + 1742.66 + -6.05019 + 16.063841685 +) + +itk_add_test( + NAME itkMontagePCMFilesS200_134_168 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/S200-small/S200-6-320x_p134.jpg} + DATA{Input/S200-small/S200-6-320x_p168.jpg} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesS200_134_168.nrrd + 0.0 + 1742.06 + -6.6058 + 21.370794 +) + +itk_add_test( + NAME itkMontagePCMFilesFocus + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/Synthetic/FocusSample.png} + DATA{Input/Synthetic/FocusBackground.png} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesFocus.nrrd + 0.0 + 0.0 + 0.0 + 0.0 +) + +itk_add_test( + NAME itkMontagePCMFilesMNML0304 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p03.png} + DATA{Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p04.png} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesMNML0304.nrrd + 0.0 + 917.0 + 1.0 + 1.0 +) + +itk_add_test( + NAME itkMontagePCMFilesDzZ_T1_identity + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + DATA{Input/DzZ_T1/DzZ_T1_sup.nrrd} + DATA{Input/DzZ_T1/DzZ_T1_inf.nrrd} + ${TESTING_OUTPUT_PATH}/itkMontagePCMFilesDzZ_T1_identity.nrrd + 0.0 + 140.904 + 0.0 + 0.0 + 0.0 + 0.0 +) + +# 3D ground truth test case +set(tempDir DzZ_T1) +set(outDir ${TESTING_OUTPUT_PATH}/${tempDir}/) +file(MAKE_DIRECTORY ${outDir}) +itk_add_test( + NAME itkMontageGroundTruthMake${tempDir} + COMMAND + MontageTestDriver + itkMontageTruthCreator + DATA{Input/DzZ_T1/DzZ_T1_orig.nhdr,DzZ_T1_orig.raw.gz} + ${outDir} + 3 + 6 + 3 + 25 + 15 + 50 +) +itk_add_test( + NAME itkMontageGroundTruthRun${tempDir} + COMMAND + MontageTestDriver + # a lot of tolerances are required because the reconstruction is not perfect + --compareRadiusTolerance + 1 + --compareIntensityTolerance + 128 + --compareNumberOfPixelsTolerance + 300 + --compare + DATA{Input/DzZ_T1/DzZ_T1_orig.nhdr} + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}_2_1.mha + itkMontageTest + ${outDir} + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}_ + ${TESTING_OUTPUT_PATH}/itkMontageGT${tempDir}Pairs_ + ${varyingPaddingMethods} + ${peakMethod} + ${loadIntoMemory} + ${streamSubdivisions} + ${doPairs} + ${writeTransforms} + ${allowDrift} + ${positionTolerance} + ${writeImage} +) +set_tests_properties( + itkMontageGroundTruthRun${tempDir} + PROPERTIES + DEPENDS + itkMontageGroundTruthMake${tempDir} +) + +if( + EXISTS + ${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region2_150_Mosaic36Flat/36/1323.tif +) + set( + flatFolder + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region2_150_Mosaic36Flat/36" + ) + set( + rawFolder + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files" + ) + set(rawPrefix "${rawFolder}/Ti-7Al_Region #2_150_Mosaic_36_p") + + itk_add_test( + NAME itkMontagePCMFiles36_1004 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + ${flatFolder}/1004.tif + ${flatFolder}/1005.tif + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles36_1004.nrrd + 480.0 + 0.0 + 0.5186747297993 + 1.48522189017301 + ) + + itk_add_test( + NAME itkMontageTi7R2_150S36flat + COMMAND + MontageTestDriver + itkMontageTest + ${flatFolder} + ${TESTING_OUTPUT_PATH}/itkMontageTi7R2_150S36flat + ${TESTING_OUTPUT_PATH}/itkMontageTi7R2_150S36flatPairs + 0 + 1 + 1 + 5 + 0 + 0 + 1 + 0 + 1 + ) + + itk_add_test( + NAME itkMontageTi7R2_150S36raw + COMMAND + MontageTestDriver + itkMontageTest + ${rawFolder} + ${TESTING_OUTPUT_PATH}/itkMontageTi7R2_150S36raw + ${TESTING_OUTPUT_PATH}/itkMontageTi7R2_150S36rawPairs + 0 + 1 + 1 + 5 + 0 + 0 + 1 + 0 + 1 + ) + + itk_add_test( + NAME itkMontagePCMFiles36_088 + COMMAND + MontageTestDriver + itkMontagePCMTestFiles + ${rawPrefix}088.tif + ${rawPrefix}089.tif + ${TESTING_OUTPUT_PATH}/itkMontagePCMFiles36raw088_089.nrrd + 81.28 + 0.0 + 0.0 + 0.0 + ) +endif() + +if( + EXISTS + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region1_10_Mosaic36/Ti-7Al_Region #1_10_Mosaic_36_p323.tif" +) + set(rawFolder "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region1_10_Mosaic36") + set(rawPrefix "${rawFolder}/Ti-7Al_Region #1_10_Mosaic_36_p") + + itk_add_test( + NAME itkMontageTi7R1_10S36 + COMMAND + MontageTestDriver + itkMontageTest + ${rawFolder} + ${TESTING_OUTPUT_PATH}/itkMontageTi7R1_10S36_ + ${TESTING_OUTPUT_PATH}/itkMontageTi7R1_10S36Pairs_ + 0 + 1 + 1 + 5 + 0 + 0 + 1 + 0 + 1 + ) +endif() + +if( + EXISTS + "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region1_10_Mosaic180/Ti-7Al_Region #1_10_Mosaic_180_p323.tif" +) + set(rawFolder "${CMAKE_CURRENT_LIST_DIR}/Input/Ti7/Region1_10_Mosaic180") + set(rawPrefix "${rawFolder}/Ti-7Al_Region #1_10_Mosaic_180_p") + + itk_add_test( + NAME itkMontageTi7R1_10S180 + COMMAND + MontageTestDriver + itkMontageTest + ${rawFolder} + ${TESTING_OUTPUT_PATH}/itkMontageTi7R1_10S180_ + ${TESTING_OUTPUT_PATH}/itkMontageTi7R1_10S180Pairs_ + 0 + 1 + 1 + 5 + 0 + 0 + 1 + 0 + 1 + ) +endif() + +if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/Input/Tiles/Image_10_10.tif) + itk_add_test( + NAME itkMontageTiles + COMMAND + MontageTestDriver + --ignoreInputInformation + # --compare ${CMAKE_CURRENT_LIST_DIR}/Input/Tiles/itkMontageTiles2_0.mha ${TESTING_OUTPUT_PATH}/itkMontageTiles2_0.mha + itkMontageTest + ${CMAKE_CURRENT_LIST_DIR}/Input/Tiles + ${TESTING_OUTPUT_PATH}/itkMontageTiles + ${TESTING_OUTPUT_PATH}/itkMontageTilesPairs + 0 + -1 + 1 + 1 + 1 + 0 + 0 + 0 + 1 + ) + groundtruthtest2d(Tiles ${CMAKE_CURRENT_LIST_DIR}/Input/Tiles/itkMontageTiles2_0.mha 10 10 10 10) +endif() + +if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/Input/NoisyTiles/NoisyImage_10_10.tif) + itk_add_test( + NAME itkMontageNoisyTiles + COMMAND + MontageTestDriver + itkMontageTest + ${CMAKE_CURRENT_LIST_DIR}/Input/NoisyTiles + ${TESTING_OUTPUT_PATH}/itkMontageNoisyTiles + ${TESTING_OUTPUT_PATH}/itkMontageNoisyTilesPairs + 0 + -1 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + ) +endif() diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p0.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p0.bmp.cid new file mode 100644 index 000000000000..548d883b529f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p0.bmp.cid @@ -0,0 +1 @@ +bafkreih7jcqvhmqo5b2i5dkutnyxtl3egaigz2avtteb6ub4costpzguhm diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p1.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p1.bmp.cid new file mode 100644 index 000000000000..142217d838f7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p1.bmp.cid @@ -0,0 +1 @@ +bafkreigscuejez77krigyppvhzgrli6bgq4jasgpulyvdosd7mfsolnjwy diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p2.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p2.bmp.cid new file mode 100644 index 000000000000..a624976b2116 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p2.bmp.cid @@ -0,0 +1 @@ +bafkreiahhgp2dg2vknrxf2nspegjeurup4br5sfktxlqgfrktvwr3zvgy4 diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p3.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p3.bmp.cid new file mode 100644 index 000000000000..65b188c26fd9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p3.bmp.cid @@ -0,0 +1 @@ +bafkreia6lq5efuhi6r2563r6p7d2fyj3r2axo23k3xiba4trpguam7id2i diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p4.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p4.bmp.cid new file mode 100644 index 000000000000..b91562701855 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p4.bmp.cid @@ -0,0 +1 @@ +bafkreih7t7knbkgiqkuumrsm34ty3cb6h5txejrfmf3peyyvh23x3wtbiu diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p5.bmp.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p5.bmp.cid new file mode 100644 index 000000000000..b7ea51097a07 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/05MAR09_run2_64-Raw_p5.bmp.cid @@ -0,0 +1 @@ +bafkreieruk2hguqqcw2y3uy2dbynjzixlvgkl7wupfxshzm2jxjj2a322u diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..baf4cafa2aff --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreielqfksoe7l4tzf76i6kfhhku6qnfq5t4oom3eoy2cutlcvllsbma diff --git a/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.txt.cid new file mode 100644 index 000000000000..64ba36965af0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/05MAR09_run2_64-Raw/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreifzunqoqicjr332tkvvcywr6fylxkphuwx5lqwgec6tkijjc5efce diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p00.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p00.jpg.cid new file mode 100644 index 000000000000..6b85123b780e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p00.jpg.cid @@ -0,0 +1 @@ +bafkreicdrmvelsuyq2f55h7k6irrzsafycbqyyshp6l3g6uce7wdtfi4zm diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p01.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p01.jpg.cid new file mode 100644 index 000000000000..9550ebc08d14 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p01.jpg.cid @@ -0,0 +1 @@ +bafkreifrehpfpiwrw4ao2x6edbabvedo4pr5siam6dhy552ppvj5hjwcsa diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p02.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p02.jpg.cid new file mode 100644 index 000000000000..d0d2b9b3fecd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p02.jpg.cid @@ -0,0 +1 @@ +bafkreif6ujhhqvrvydia2drgntk7mm2fiueccrawol2xtjznb5muy5yf5i diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p03.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p03.jpg.cid new file mode 100644 index 000000000000..3e3a078a225a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p03.jpg.cid @@ -0,0 +1 @@ +bafkreiewoanur6l3gyqmn6koyctjxipc4q3qiya25rxv3ghgry4zkdryhm diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p04.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p04.jpg.cid new file mode 100644 index 000000000000..80556b29c0db --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p04.jpg.cid @@ -0,0 +1 @@ +bafkreieoa7eeydu5mvwpn4ijpdihl2rkwakejjf5mx2m4yexzqtrpncxxm diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p05.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p05.jpg.cid new file mode 100644 index 000000000000..c43ff03647c3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p05.jpg.cid @@ -0,0 +1 @@ +bafkreie4fjaroqeplc7mfcednrikg2fbah7xzm7sc47ytdk5ijnl2ph6te diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p06.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p06.jpg.cid new file mode 100644 index 000000000000..67c33926e094 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p06.jpg.cid @@ -0,0 +1 @@ +bafkreiha7jmmwdyasnto6j4rjxc2yte5dw4xmdt7ekws4x3e343h43hrgu diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p07.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p07.jpg.cid new file mode 100644 index 000000000000..88e0cbb1c827 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p07.jpg.cid @@ -0,0 +1 @@ +bafkreifurbixfnzhjlcoo26dqxclednnkpt4tbn75erk2vrv5ynfgxds7e diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p08.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p08.jpg.cid new file mode 100644 index 000000000000..2da6dfb6c140 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p08.jpg.cid @@ -0,0 +1 @@ +bafkreic5ii25egocjcsqw6w2j3owhojlpmhzenaxedyspwlmdtu6bt6x3e diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p09.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p09.jpg.cid new file mode 100644 index 000000000000..bb011fded173 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p09.jpg.cid @@ -0,0 +1 @@ +bafkreihk224jmpqrykf23na2uc3ljfqjtrmqsaetyl37wvlsxzbg7sn4j4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p10.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p10.jpg.cid new file mode 100644 index 000000000000..875a7c5c9d85 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p10.jpg.cid @@ -0,0 +1 @@ +bafkreidjjnxtxrdk4kxpevmp4cpantc7pw6e4jy6gfg7zp6doo2lqqrt3m diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p11.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p11.jpg.cid new file mode 100644 index 000000000000..b834b89c14fe --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p11.jpg.cid @@ -0,0 +1 @@ +bafkreibdrboamvsyp7r3frx3imnk2dtf35o2suif3ylrreshoaeu3y5upu diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p12.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p12.jpg.cid new file mode 100644 index 000000000000..265c55dffa26 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p12.jpg.cid @@ -0,0 +1 @@ +bafkreia2a7lbarlaac2z3ez3gq6bm4liqegmrk5xoup2mbtowa3oloq2xq diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p13.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p13.jpg.cid new file mode 100644 index 000000000000..007c5f5f7c9d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p13.jpg.cid @@ -0,0 +1 @@ +bafkreifrro24ivqzub2upnm2vykypyikprdbl2t26iliijvlp3tio3flzu diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p14.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p14.jpg.cid new file mode 100644 index 000000000000..48cf8b11af35 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p14.jpg.cid @@ -0,0 +1 @@ +bafkreiatp622wdtsnbmlkirmabveozoondnj6winvspn7hrdaxk3sbfb3a diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p15.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p15.jpg.cid new file mode 100644 index 000000000000..66ef9fbaaa44 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p15.jpg.cid @@ -0,0 +1 @@ +bafkreic36soefecz6pc2vdznnppp3ef5fb7ivgt65bqqwnced2rxdvswb4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p16.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p16.jpg.cid new file mode 100644 index 000000000000..e6cc0b3b671c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p16.jpg.cid @@ -0,0 +1 @@ +bafkreigqg2a2ljzy2hnlz5xo2smgia4q6pujetfia5emjjmjyakxgx4ee4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p17.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p17.jpg.cid new file mode 100644 index 000000000000..caa86e7bef57 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p17.jpg.cid @@ -0,0 +1 @@ +bafkreid3p2qyh55jtwvswhdqnfs25kjw3bw72tw4it3s4atgqshjjpuh4u diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p18.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p18.jpg.cid new file mode 100644 index 000000000000..7203b0fc3d61 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p18.jpg.cid @@ -0,0 +1 @@ +bafkreibjeipnng7mze3ati33glnhvo5cxvxn5saw2rtvhotpkwkvk5lzrm diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p19.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p19.jpg.cid new file mode 100644 index 000000000000..f6956a50c217 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p19.jpg.cid @@ -0,0 +1 @@ +bafkreifykdwxxkz66v3eqg46kdirv2ew32uayn4ym5nxansmyp3nbqvidy diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p20.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p20.jpg.cid new file mode 100644 index 000000000000..5a9327995f21 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p20.jpg.cid @@ -0,0 +1 @@ +bafkreigig4xyh4ax2xlrq62l3pzz552anycw3ninlovplb253je6mcvcku diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p21.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p21.jpg.cid new file mode 100644 index 000000000000..190693caaba1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p21.jpg.cid @@ -0,0 +1 @@ +bafkreiejiz7oiq3b5lseo7rn7nodpknqqr7ts2wqvwlm46pbmjxj4a73ju diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p22.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p22.jpg.cid new file mode 100644 index 000000000000..1da4f03de7a1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p22.jpg.cid @@ -0,0 +1 @@ +bafkreic2znw7ldy773onhvvuvo5wetmttjsxkedf2zn2kgvss4f7tcrhi4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p23.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p23.jpg.cid new file mode 100644 index 000000000000..2f9bb790f6c7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p23.jpg.cid @@ -0,0 +1 @@ +bafkreiete6qned6q6ncf57epiv7idfrzoni4lhuabbfruwczyzd6xcjx74 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p24.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p24.jpg.cid new file mode 100644 index 000000000000..1193f7dd10ad --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p24.jpg.cid @@ -0,0 +1 @@ +bafkreiff4uoumdd5ec2jjbytimayxe3645mavl77vejexdk45aju5xr6ky diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p25.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p25.jpg.cid new file mode 100644 index 000000000000..4cf7626fa3f6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p25.jpg.cid @@ -0,0 +1 @@ +bafkreiaoe734njdoxj2ehz4mait6lob2ywtdolzzerghb3u3sfnahu3ze4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p26.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p26.jpg.cid new file mode 100644 index 000000000000..325ad45dbda3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p26.jpg.cid @@ -0,0 +1 @@ +bafkreibp3vzrwpmbjpnv3ijobr5pwnk7cnqtt3y23zseuho5hwr5dkslom diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p27.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p27.jpg.cid new file mode 100644 index 000000000000..4a5b19ffb240 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p27.jpg.cid @@ -0,0 +1 @@ +bafkreidce3v4wdkxdqp5avmw2w4blllnqmgiqcemkry3fguli3h7zc2pna diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p28.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p28.jpg.cid new file mode 100644 index 000000000000..7bf76f15fe8a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p28.jpg.cid @@ -0,0 +1 @@ +bafkreicq27yz3am4sq4knekccsf5ltav3ox5mcriozjwjcrj4qflsu6k2a diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p29.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p29.jpg.cid new file mode 100644 index 000000000000..a7b34d9fc4e3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p29.jpg.cid @@ -0,0 +1 @@ +bafkreia7fyci7apdz2dimupaj66poqrps5bvbldsnjbmt365xfbiyqf2mq diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p30.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p30.jpg.cid new file mode 100644 index 000000000000..8cf27c20193f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p30.jpg.cid @@ -0,0 +1 @@ +bafkreicb66lnbsivlwpw24wmguqjyoxh5nm5sznej33fxiboonqyx26pem diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p31.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p31.jpg.cid new file mode 100644 index 000000000000..31c053796924 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p31.jpg.cid @@ -0,0 +1 @@ +bafkreieowf6zhm7h6yea5xkro2xmavckhuwaby2eolmqtq7pzpu6v5z3mq diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p32.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p32.jpg.cid new file mode 100644 index 000000000000..46cda8c63725 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p32.jpg.cid @@ -0,0 +1 @@ +bafkreigaujf4g7cyu3dhg5f3mxe6lvyyqfiwnurj2aiacpckvsxkdygwki diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p33.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p33.jpg.cid new file mode 100644 index 000000000000..c3c6c1eafaa8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p33.jpg.cid @@ -0,0 +1 @@ +bafkreiazadhmmmb44lvvx2r2h2dxndc2bokqvp63uk6ki4d3obc63s4po4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p34.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p34.jpg.cid new file mode 100644 index 000000000000..3185460808cf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p34.jpg.cid @@ -0,0 +1 @@ +bafkreigy4f5jpg4ena726qj5hpvbbnfbpv24vzffw3gu6w6jqtmqeh3caa diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p35.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p35.jpg.cid new file mode 100644 index 000000000000..d7caf3295591 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p35.jpg.cid @@ -0,0 +1 @@ +bafkreiawtbqfmct3mycc6c3bsaov2nhb4yhfcw2mjqxvjs4ykokmwgkls4 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p36.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p36.jpg.cid new file mode 100644 index 000000000000..018db63dd9dd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p36.jpg.cid @@ -0,0 +1 @@ +bafkreigvade4jx3wnnjts24rh5euouybli62ii7jwf4st7pqtw3louav4i diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p37.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p37.jpg.cid new file mode 100644 index 000000000000..77b59f95a28c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p37.jpg.cid @@ -0,0 +1 @@ +bafkreifurnm3raj6rlzpriht4cahbujiktjvctgqzzell65lrrfvfiqaiq diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p38.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p38.jpg.cid new file mode 100644 index 000000000000..77e00e0cd076 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p38.jpg.cid @@ -0,0 +1 @@ +bafkreibrhr2k7zehscingrbntexadvupg7ukkl3ctgt2yum7wfpnbc4tca diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p39.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p39.jpg.cid new file mode 100644 index 000000000000..2820f5ebd5e9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p39.jpg.cid @@ -0,0 +1 @@ +bafkreiawtqvuf2cnwihcbim2ytxqx5hkjtaizl736c3ob5z3w6krwa54by diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p40.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p40.jpg.cid new file mode 100644 index 000000000000..26b041aa266d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p40.jpg.cid @@ -0,0 +1 @@ +bafkreiff2hofeipgpgkhnuskoj7xlxatv2ncs2emsgi2agmnwrboxw5wsu diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p41.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p41.jpg.cid new file mode 100644 index 000000000000..6ffbd62a88c6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p41.jpg.cid @@ -0,0 +1 @@ +bafkreifwy6gb6exvu67nqndfcfdels7xzzrcdghwknfujmqpjeqgeg7pmq diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p42.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p42.jpg.cid new file mode 100644 index 000000000000..f8c74d95496f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p42.jpg.cid @@ -0,0 +1 @@ +bafkreiahfoxrwff7kuy35fwruhgusqlqyszft7tvcjjy6sk4tybp5p6i6m diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p43.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p43.jpg.cid new file mode 100644 index 000000000000..27df45ce8f6f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p43.jpg.cid @@ -0,0 +1 @@ +bafkreibqllfcczrwistivweqtudjm5enjrb2nesuwn5dbpwqgwimhm6dne diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p44.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p44.jpg.cid new file mode 100644 index 000000000000..272b4648041f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p44.jpg.cid @@ -0,0 +1 @@ +bafkreihm42yuouoroml7vhygipelwbxkgf57adoruydgxbzpz2h3op7lnm diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p45.jpg.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p45.jpg.cid new file mode 100644 index 000000000000..343c1a852cf9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/10-129-C_2_p45.jpg.cid @@ -0,0 +1 @@ +bafkreihuip2yy52rslzv2sdmkngt4fp7kc6atgrfz4ec6qm5lhfsj62nru diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/README.md b/Modules/Registration/Montage/test/Input/10-129-C_2/README.md new file mode 100644 index 000000000000..2c2552912a0c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/README.md @@ -0,0 +1,3 @@ +Publicly released by U.S. Air Force Public Affairs office under PA number: + + 88ABW-2103-0127 diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt new file mode 100644 index 000000000000..e4c1bfd587d4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt @@ -0,0 +1,50 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +10-129-C_2_p00.jpg; ; (0.0, 0.0) +10-129-C_2_p01.jpg; ; (36.28056335449219, 1804.5970458984375) +10-129-C_2_p02.jpg; ; (39.62340664863587, 3556.6357421875) +10-129-C_2_p03.jpg; ; (39.41242124140263, 5295.2310791015625) +10-129-C_2_p04.jpg; ; (41.82146121561528, 7013.5372314453125) +10-129-C_2_p05.jpg; ; (41.814855020027615, 8733.553588867188) +10-129-C_2_p06.jpg; ; (46.34177819965408, 10449.515747070312) +10-129-C_2_p07.jpg; ; (48.64350144146011, 12201.518188476562) +10-129-C_2_p08.jpg; ; (46.99439887283371, 13908.368286132812) +10-129-C_2_p09.jpg; ; (51.0432203221135, 15642.223999023438) +10-129-C_2_p10.jpg; ; (51.065204873215414, 17376.54248046875) +10-129-C_2_p11.jpg; ; (53.04621614469216, 19088.318359375) +10-129-C_2_p12.jpg; ; (54.95229484094307, 20813.2158203125) +10-129-C_2_p13.jpg; ; (54.926492584403604, 22549.304565429688) +10-129-C_2_p14.jpg; ; (60.464151275809854, 24275.226196289062) +10-129-C_2_p15.jpg; ; (58.11378420656546, 26005.272094726566) +10-129-C_2_p16.jpg; ; (58.310812098439776, 27721.377075195316) +10-129-C_2_p17.jpg; ; (62.30611000722274, 29448.934082031254) +10-129-C_2_p18.jpg; ; (62.58881486719475, 31166.398071289066) +10-129-C_2_p19.jpg; ; (64.66324557131158, 32894.44689941407) +10-129-C_2_p20.jpg; ; (64.43081043427811, 34641.19970703126) +10-129-C_2_p21.jpg; ; (66.58407638734207, 36352.74926757813) +10-129-C_2_p22.jpg; ; (69.59195397561415, 38082.80004882813) +10-129-C_2_p23.jpg; ; (69.45201459294184, 39787.15502929688) +10-129-C_2_p24.jpg; ; (72.0960079706274, 41523.3455810547) +10-129-C_2_p25.jpg; ; (72.3728976524435, 43251.50805664065) +10-129-C_2_p26.jpg; ; (72.37518758885562, 44960.57702636721) +10-129-C_2_p27.jpg; ; (75.72013206593692, 46702.82409667971) +10-129-C_2_p28.jpg; ; (75.71502513485031, 48422.76574707033) +10-129-C_2_p29.jpg; ; (77.68344969348983, 50153.664916992195) +10-129-C_2_p30.jpg; ; (79.61285335617141, 51892.48596191407) +10-129-C_2_p31.jpg; ; (79.76642271177845, 53584.524780273445) +10-129-C_2_p32.jpg; ; (83.56788178579885, 55352.91003417969) +10-129-C_2_p33.jpg; ; (83.9279247154482, 57068.447265625) +10-129-C_2_p34.jpg; ; (84.16264808969576, 58812.70654296875) +10-129-C_2_p35.jpg; ; (86.68495930032807, 60513.72619628906) +10-129-C_2_p36.jpg; ; (86.44533105986193, 62241.379760742195) +10-129-C_2_p37.jpg; ; (88.38111480372025, 63971.336791992195) +10-129-C_2_p38.jpg; ; (90.228745423723, 65705.41931152345) +10-129-C_2_p39.jpg; ; (90.25693347351626, 67428.37902832031) +10-129-C_2_p40.jpg; ; (91.93696453468876, 69167.15148925781) +10-129-C_2_p41.jpg; ; (93.65059080021457, 70887.0753173828) +10-129-C_2_p42.jpg; ; (95.86768546001987, 72607.16357421875) +10-129-C_2_p43.jpg; ; (97.36768546001986, 74320.98291015625) +10-129-C_2_p44.jpg; ; (97.41540352301672, 76075.48779296874) +10-129-C_2_p45.jpg; ; (100.34404841857031, 77785.77514648436) diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..907ffd2cceeb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreiddnadxefwky5zsv5y623yclqjnh34eusob7h2eotp2m4hd44m7hu diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt new file mode 100644 index 000000000000..1b5411baa8e6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt @@ -0,0 +1,53 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +10-129-C_2_p00.jpg; ; (0, 0) +10-129-C_2_p01.jpg; ; (0, 1742.66) +10-129-C_2_p02.jpg; ; (0, 3484.72) +10-129-C_2_p03.jpg; ; (0, 5227.37) +10-129-C_2_p04.jpg; ; (0, 6969.43) +10-129-C_2_p05.jpg; ; (0, 8712.08) +10-129-C_2_p06.jpg; ; (0, 10454.1) +10-129-C_2_p07.jpg; ; (0, 12196.8) +10-129-C_2_p08.jpg; ; (0, 13939.5) +10-129-C_2_p09.jpg; ; (0, 15681.5) +10-129-C_2_p10.jpg; ; (0, 17424.2) +10-129-C_2_p11.jpg; ; (0, 19166.2) +10-129-C_2_p12.jpg; ; (0, 20908.9) +10-129-C_2_p13.jpg; ; (0, 22650.9) +10-129-C_2_p14.jpg; ; (0, 24393.6) +10-129-C_2_p15.jpg; ; (0, 26136.3) +10-129-C_2_p16.jpg; ; (0, 27878.3) +10-129-C_2_p17.jpg; ; (0, 29621) +10-129-C_2_p18.jpg; ; (0, 31363) +10-129-C_2_p19.jpg; ; (0, 33105.7) +10-129-C_2_p20.jpg; ; (0, 34847.7) +10-129-C_2_p21.jpg; ; (0, 36590.4) +10-129-C_2_p22.jpg; ; (0, 38333.1) +10-129-C_2_p23.jpg; ; (0, 40075.1) +10-129-C_2_p24.jpg; ; (0, 41817.8) +10-129-C_2_p25.jpg; ; (0, 43559.8) +10-129-C_2_p26.jpg; ; (0, 45302.5) +10-129-C_2_p27.jpg; ; (0, 47044.5) +10-129-C_2_p28.jpg; ; (0, 48787.2) +10-129-C_2_p29.jpg; ; (0, 50529.9) +10-129-C_2_p30.jpg; ; (0, 52271.9) +10-129-C_2_p31.jpg; ; (0, 54014.6) +10-129-C_2_p32.jpg; ; (0, 55756.6) +10-129-C_2_p33.jpg; ; (0, 57499.3) +10-129-C_2_p34.jpg; ; (0, 59241.3) +10-129-C_2_p35.jpg; ; (0, 60984) +10-129-C_2_p36.jpg; ; (0, 62726.7) +10-129-C_2_p37.jpg; ; (0, 64468.7) +10-129-C_2_p38.jpg; ; (0, 66211.4) +10-129-C_2_p39.jpg; ; (0, 67953.4) +10-129-C_2_p40.jpg; ; (0, 69696.1) +10-129-C_2_p41.jpg; ; (0, 71438.1) +10-129-C_2_p42.jpg; ; (0, 73180.8) +10-129-C_2_p43.jpg; ; (0, 74923.5) +10-129-C_2_p44.jpg; ; (0, 76665.5) +10-129-C_2_p45.jpg; ; (0, 78408.2) diff --git a/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt.cid new file mode 100644 index 000000000000..7acb7d9cf952 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/10-129-C_2/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreifxhufwnjosel2r5zzj3upp6knp536flkgyyfud6w6mewcjppiivu diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_inf.nrrd.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_inf.nrrd.cid new file mode 100644 index 000000000000..ff41f20cf824 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_inf.nrrd.cid @@ -0,0 +1 @@ +bafkreicevajsc6377e6m63fmk6v5q2ptaybanbkmixxvik5pbwpnimzpma diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_infN.nrrd.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_infN.nrrd.cid new file mode 100644 index 000000000000..12beb12d0b19 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_infN.nrrd.cid @@ -0,0 +1 @@ +bafkreidrpa4m5ncqt4npoqxby7lpcfxfz35iccsi6rxeecdcohltdvvupe diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.nhdr.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.nhdr.cid new file mode 100644 index 000000000000..fbac040946e3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.nhdr.cid @@ -0,0 +1 @@ +bafkreicwnhwnk3ogvn4ac5kipwcsgdlbvhevgbksawg4xfg5cc43nzyjv4 diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.raw.gz.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.raw.gz.cid new file mode 100644 index 000000000000..210995f6ed6b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_orig.raw.gz.cid @@ -0,0 +1 @@ +bafkreigs5sukusnln2cogn527zu5bj5pmme2g2yasq3t63xqiarj5vas3e diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_origN.nhdr.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_origN.nhdr.cid new file mode 100644 index 000000000000..88a014ac31cb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_origN.nhdr.cid @@ -0,0 +1 @@ +bafkreic42uwrp7ypzu36yemb36yvdrq33x2tcchzuwgmup3urlcbha7w4e diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_sup.nrrd.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_sup.nrrd.cid new file mode 100644 index 000000000000..0643fb093381 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_sup.nrrd.cid @@ -0,0 +1 @@ +bafkreifgg7h6y3eezo76po37jgicromen3e3obhga2mesuvp6hzeqmjsw4 diff --git a/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_supN.nrrd.cid b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_supN.nrrd.cid new file mode 100644 index 000000000000..2a24824eece2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/DzZ_T1/DzZ_T1_supN.nrrd.cid @@ -0,0 +1 @@ +bafkreieyo2ylwagekqrtmdu2wk4lkuwfn3z53dj45qdsr3pcq7mipndfj4 diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3-ITK.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3-ITK.png.cid new file mode 100644 index 000000000000..fe38f32aae4c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3-ITK.png.cid @@ -0,0 +1 @@ +bafkreiblhdtxvi2fxh2kb2r3jkxlfcjezy2py4l6stbxmzgwbnyrt7f2ee diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p00.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p00.png.cid new file mode 100644 index 000000000000..0002e117a7c1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p00.png.cid @@ -0,0 +1 @@ +bafkreifejvpyqweio3pi6wymglqi3sbove6hjw5rsx3fz2awttfeoi6esy diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p01.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p01.png.cid new file mode 100644 index 000000000000..8fdecb058091 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p01.png.cid @@ -0,0 +1 @@ +bafkreibpppgh47od7bzyebdfisqg27mxpe4e52odwz6ockd3mbfg36ryse diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p02.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p02.png.cid new file mode 100644 index 000000000000..dbcff0af3ad6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p02.png.cid @@ -0,0 +1 @@ +bafkreidae2pr5ikpzq23agmh3mdajc72qvoq5zncwbgaorktezirqtooey diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p03.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p03.png.cid new file mode 100644 index 000000000000..2e4a0354f4d4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p03.png.cid @@ -0,0 +1 @@ +bafkreidpjh22fj6dfndyomysbuxisseppr6m2e2xyaxdjkxm7fyu32k54u diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p04.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p04.png.cid new file mode 100644 index 000000000000..13056b290ed2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p04.png.cid @@ -0,0 +1 @@ +bafkreiavtmplnifw6xaavywwoy7k2ejefppdh77ftpxnzbpshgz56k4sta diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p05.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p05.png.cid new file mode 100644 index 000000000000..89af52ab02ed --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p05.png.cid @@ -0,0 +1 @@ +bafkreidzy4n6agse2bsnrqag3b3hdmcj2jmseuj6jgtgqpg2zmbrecwt2u diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p06.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p06.png.cid new file mode 100644 index 000000000000..1e1f55d28d93 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p06.png.cid @@ -0,0 +1 @@ +bafkreihaxtptfjbntl2qsshdamlgx5s3pg34nsfpdpqiy4ashqxer2i2ty diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p07.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p07.png.cid new file mode 100644 index 000000000000..272f789b8066 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p07.png.cid @@ -0,0 +1 @@ +bafkreicxgco2gp4jsbgvrnmurv2gwgymez6o6dn4h2dpzvlndbrgoicvsa diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p08.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p08.png.cid new file mode 100644 index 000000000000..cf8353a44768 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p08.png.cid @@ -0,0 +1 @@ +bafkreiaiq4csersp2jrg5sp6wzphs5fcq6gi7ajyv7v7jyzadmdoed2ori diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p09.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p09.png.cid new file mode 100644 index 000000000000..d13fca3eba8b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p09.png.cid @@ -0,0 +1 @@ +bafkreia6j6pdpmcwv5hnrihzq4gbcr6ktrm3pgvw7re736m5e7637iwkza diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p10.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p10.png.cid new file mode 100644 index 000000000000..ed18db2908c7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p10.png.cid @@ -0,0 +1 @@ +bafkreiayiabphhyg5w6xbrpa4gludcyb2a66t3fr7tnjcguwkl6u5rxx2u diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p11.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p11.png.cid new file mode 100644 index 000000000000..4cf5404d1c87 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p11.png.cid @@ -0,0 +1 @@ +bafkreieqltvrmdybbo7vgh6fwfwl6sxpgpvfnof4e6pzoa7l6cr5py3shi diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p12.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p12.png.cid new file mode 100644 index 000000000000..d01ac0710708 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p12.png.cid @@ -0,0 +1 @@ +bafkreifpfgavlg7kqc5spvfcilh23w7thadtzrhsu7rliwzphqq7odbtf4 diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p13.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p13.png.cid new file mode 100644 index 000000000000..3b7f1a045aea --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p13.png.cid @@ -0,0 +1 @@ +bafkreihbyuhixsw4qrnq6kom7gwm67dcdilt5cp2jktvi5qxk6ghi3l5iy diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p14.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p14.png.cid new file mode 100644 index 000000000000..c1bc51268e1f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p14.png.cid @@ -0,0 +1 @@ +bafkreifb35akthhu3fsn6iwovkscror7ozb6sxlkuiluddqueazcd2ngre diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p15.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p15.png.cid new file mode 100644 index 000000000000..9b404a0d7ff6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p15.png.cid @@ -0,0 +1 @@ +bafkreih75kwh7hnd3qlylitmrc6mdkt22xf7jkuz22kvxby5kg3yzfojny diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p16.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p16.png.cid new file mode 100644 index 000000000000..056be5ba1747 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p16.png.cid @@ -0,0 +1 @@ +bafkreifrx6czlwhrjicp4h2z2orn5rgvfaap4yhufudx4wcudgl6gm44i4 diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p17.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p17.png.cid new file mode 100644 index 000000000000..85628a9eaa6e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p17.png.cid @@ -0,0 +1 @@ +bafkreihrxlasjo6opn3gkf4ahxen5h42hnoibmro7mgbwhfwopik6rsivq diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p18.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p18.png.cid new file mode 100644 index 000000000000..1ccad34c5b87 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p18.png.cid @@ -0,0 +1 @@ +bafkreig3owoyz4wyhbywnvqpblk7ghcmgdlvrmfgeow2xket5vuue4ejn4 diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p19.png.cid b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p19.png.cid new file mode 100644 index 000000000000..8adb9b02fdb2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/MNML-3_200x_701-Raw_p19.png.cid @@ -0,0 +1 @@ +bafkreibjh34mu4wxjwvxozi7mjrzj56pqurcqqsuujy3gdqi5o3efezeba diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/README.md b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/README.md new file mode 100644 index 000000000000..1fef640179bc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/README.md @@ -0,0 +1,3 @@ +Publicly released by U.S. Air Force Public Affairs office under PA number: + + 88ABW-2009-5022 diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.registered.txt new file mode 100644 index 000000000000..20fd8f43edd7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.registered.txt @@ -0,0 +1,24 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +MNML-3_200x_701-Raw_p00.png; ; (0.0, 0.0) +MNML-3_200x_701-Raw_p01.png; ; (1228.5971827646447, 0.9783035034700727) +MNML-3_200x_701-Raw_p02.png; ; (2455.0907419392724, 3.3314457604344136) +MNML-3_200x_701-Raw_p03.png; ; (3681.795301673474, 5.0015522800350345) +MNML-3_200x_701-Raw_p07.png; ; (-3.2848060703540227, 914.908615148539) +MNML-3_200x_701-Raw_p06.png; ; (1226.4206681023563, 916.3536746583175) +MNML-3_200x_701-Raw_p05.png; ; (2451.677578809871, 918.1639037598395) +MNML-3_200x_701-Raw_p04.png; ; (3680.753952455155, 921.4507385482887) +MNML-3_200x_701-Raw_p08.png; ; (-4.290888256708968, 1840.738385643041) +MNML-3_200x_701-Raw_p09.png; ; (1225.4551297831279, 1840.8941521940392) +MNML-3_200x_701-Raw_p10.png; ; (2453.2790668741895, 1842.4573879752895) +MNML-3_200x_701-Raw_p11.png; ; (3681.349113085553, 1844.4362397095717) +MNML-3_200x_701-Raw_p15.png; ; (-4.752974308785099, 2756.1744601535556) +MNML-3_200x_701-Raw_p14.png; ; (1225.1454221536906, 2757.809157962153) +MNML-3_200x_701-Raw_p13.png; ; (2451.450237532161, 2758.5135732939334) +MNML-3_200x_701-Raw_p12.png; ; (3679.3777045798083, 2761.5518446287924) +MNML-3_200x_701-Raw_p16.png; ; (-5.636627489612636, 3683.332305601272) +MNML-3_200x_701-Raw_p17.png; ; (1224.9219308522336, 3684.0691524228323) +MNML-3_200x_701-Raw_p18.png; ; (2452.9984294947067, 3686.4026294730647) +MNML-3_200x_701-Raw_p19.png; ; (3680.4632300179032, 3688.254165728066) diff --git a/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.txt new file mode 100644 index 000000000000..11615a70941e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_3_200x_701/TileConfiguration.txt @@ -0,0 +1,24 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +MNML-3_200x_701-Raw_p00.png; ; (0.0, 0.0) +MNML-3_200x_701-Raw_p01.png; ; (1227.0, 0.0) +MNML-3_200x_701-Raw_p02.png; ; (2454.0, 0.0) +MNML-3_200x_701-Raw_p03.png; ; (3681.0, 0.0) +MNML-3_200x_701-Raw_p07.png; ; (0.0, 919.0) +MNML-3_200x_701-Raw_p06.png; ; (1227.0, 919.0) +MNML-3_200x_701-Raw_p05.png; ; (2454.0, 919.0) +MNML-3_200x_701-Raw_p04.png; ; (3681.0, 919.0) +MNML-3_200x_701-Raw_p08.png; ; (0.0, 1838.0) +MNML-3_200x_701-Raw_p09.png; ; (1227.0, 1838.0) +MNML-3_200x_701-Raw_p10.png; ; (2454.0, 1838.0) +MNML-3_200x_701-Raw_p11.png; ; (3681.0, 1838.0) +MNML-3_200x_701-Raw_p15.png; ; (0.0, 2757.0) +MNML-3_200x_701-Raw_p14.png; ; (1227.0, 2757.0) +MNML-3_200x_701-Raw_p13.png; ; (2454.0, 2757.0) +MNML-3_200x_701-Raw_p12.png; ; (3681.0, 2757.0) +MNML-3_200x_701-Raw_p16.png; ; (0.0, 3676.0) +MNML-3_200x_701-Raw_p17.png; ; (1227.0, 3676.0) +MNML-3_200x_701-Raw_p18.png; ; (2454.0, 3676.0) +MNML-3_200x_701-Raw_p19.png; ; (3681.0, 3676.0) diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5-ITK.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5-ITK.png.cid new file mode 100644 index 000000000000..fc819e96dc09 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5-ITK.png.cid @@ -0,0 +1 @@ +bafkreid6hyi2iqachohtuv66sqa53lsch53trsc7rca5jdo7af24nemjx4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p00.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p00.png.cid new file mode 100644 index 000000000000..e6eee075318d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p00.png.cid @@ -0,0 +1 @@ +bafkreiab7fux6wvm5vhssnkzeqhybvq4qjrle4jbg22pmjt2iv4fcf7ax4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p01.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p01.png.cid new file mode 100644 index 000000000000..750fcd586869 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p01.png.cid @@ -0,0 +1 @@ +bafkreiddwqxd7ln4cxe6n4v473m7ogs24ughtbmtznc6i3mvoduo3pnqz4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p02.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p02.png.cid new file mode 100644 index 000000000000..1da4a4a7d711 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p02.png.cid @@ -0,0 +1 @@ +bafkreihdqxopqhwvgrqqhoaopaxkl36ozlpljapx5lf4uoqv6munrn2h7y diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p03.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p03.png.cid new file mode 100644 index 000000000000..c339e68a067b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p03.png.cid @@ -0,0 +1 @@ +bafkreies3y4mbhspdcus7vxeqjogpgux3tnfgnvj65g3qnz6wx32amjeyi diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p04.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p04.png.cid new file mode 100644 index 000000000000..64126d4779df --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p04.png.cid @@ -0,0 +1 @@ +bafkreidoizp5mu3nq6hknyqqnbny74o565pfwx7vm7i7tbcl5qrjvnqfsu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p05.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p05.png.cid new file mode 100644 index 000000000000..66051805b035 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p05.png.cid @@ -0,0 +1 @@ +bafkreifyojieabokpdnla6eblg7b46e2262owxu74lhrabhdrobhdfzedm diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p06.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p06.png.cid new file mode 100644 index 000000000000..310afcfb54fa --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p06.png.cid @@ -0,0 +1 @@ +bafkreidmb6op56j2s5djteoaww2r4hcwnzawqtyhbb6lghmqlqjg3etqoe diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p07.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p07.png.cid new file mode 100644 index 000000000000..463394db2224 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p07.png.cid @@ -0,0 +1 @@ +bafkreidvglbh3ueb2vyxov5x36zk2uofvhfmnkpsm6gukkk2twnc3ny4lu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p08.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p08.png.cid new file mode 100644 index 000000000000..864228247d69 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p08.png.cid @@ -0,0 +1 @@ +bafkreibx4q4rh6mr6urhlroksxizsh72u3hpul6rmcxzipfzibdbp4pdm4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p09.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p09.png.cid new file mode 100644 index 000000000000..b6015098baa7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p09.png.cid @@ -0,0 +1 @@ +bafkreia6cjtobv7fgfa7ehfqptxr244r7ut74mhcd3qhl2f4u2pcxvtedm diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p10.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p10.png.cid new file mode 100644 index 000000000000..d33c57df8eeb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p10.png.cid @@ -0,0 +1 @@ +bafkreihjllitfsckcjchbwclr6c4j6ujfwi3z32kz3vnnuap5bfwvnn6nq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p11.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p11.png.cid new file mode 100644 index 000000000000..d5dcdc93f361 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p11.png.cid @@ -0,0 +1 @@ +bafkreie7zbpqtmuwm2ouk24n5vedfk53j5vaabnx5t3zagrawnltytce6q diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p12.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p12.png.cid new file mode 100644 index 000000000000..86ce3e08aec3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p12.png.cid @@ -0,0 +1 @@ +bafkreietsg7etj2dkoui7jlqdikexoq3yk6f43hukqxke6tkjphfgk36qm diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p13.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p13.png.cid new file mode 100644 index 000000000000..8d9ed2fa5ec8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p13.png.cid @@ -0,0 +1 @@ +bafkreibttwjptzunsfj2unxflcvqmymtstlcskm7ydb4dryv65ufdpf6fy diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p14.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p14.png.cid new file mode 100644 index 000000000000..45c491ddff46 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p14.png.cid @@ -0,0 +1 @@ +bafkreihdk5e36qsyg4hhdcoxetnymk2kvfexgnqlqa2thhnelzihtuu6wq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p15.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p15.png.cid new file mode 100644 index 000000000000..6527b8e58293 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p15.png.cid @@ -0,0 +1 @@ +bafkreiewnpvsa2hj5vi222f7ev6ics4ixly6qmzrsytivqua4nsm5djiyq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p16.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p16.png.cid new file mode 100644 index 000000000000..2d9962ac628d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p16.png.cid @@ -0,0 +1 @@ +bafkreigijzot7qcmxjoy4znrp7qsz7q23n5n6nmttp2uwcxp2xo6d5hyuu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p17.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p17.png.cid new file mode 100644 index 000000000000..a39958d38101 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p17.png.cid @@ -0,0 +1 @@ +bafkreiazi5mfjvdgxjnqmo5l3lnbv2whz3l5tsxd7jnsx3cujqyys3zu3i diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p18.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p18.png.cid new file mode 100644 index 000000000000..be8110ca4e75 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p18.png.cid @@ -0,0 +1 @@ +bafkreif6peqfd6x4jqhpd6ixyzi5gjvepzmcsgl6cztskmrw4u5hikef2i diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p19.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p19.png.cid new file mode 100644 index 000000000000..022c3dd2c1ce --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p19.png.cid @@ -0,0 +1 @@ +bafkreicjo6mko6kzhfzzll3kor6ckzj6dmc67yhpuybr6efkhyzh5qlhg4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p20.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p20.png.cid new file mode 100644 index 000000000000..000917d5b5ae --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p20.png.cid @@ -0,0 +1 @@ +bafkreidv6fva7572fl4lcllz6dva7a37dq2yupmcfodkl5cj4mctmsqe3e diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p21.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p21.png.cid new file mode 100644 index 000000000000..e94d88061e42 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p21.png.cid @@ -0,0 +1 @@ +bafkreigei4irj7wcxpr3buxv3waavooxp32flrtrmxaoew4n2xrujs7pjq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p22.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p22.png.cid new file mode 100644 index 000000000000..4a4166066f19 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p22.png.cid @@ -0,0 +1 @@ +bafkreib5xxo773yaxapme2qqsfusm3lt6fm3rawuu3uooqo6kjscwog3rq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p23.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p23.png.cid new file mode 100644 index 000000000000..d5405544884a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p23.png.cid @@ -0,0 +1 @@ +bafkreihpx7jiofg6niijocdkjpt6vu5vjpsj45beofuzkwh4ajkt3kslwq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p24.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p24.png.cid new file mode 100644 index 000000000000..5b469005c540 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p24.png.cid @@ -0,0 +1 @@ +bafkreifffqdf77xfdmdmzh3rlmldboe2mhcpv3nhvuygraz7oagbv6ohhi diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p25.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p25.png.cid new file mode 100644 index 000000000000..3e684991042b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p25.png.cid @@ -0,0 +1 @@ +bafkreievwu7wdlqpdxu7haaxffwr3tjofbob7pexrx2xhvwr5kvjzqpnuy diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p26.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p26.png.cid new file mode 100644 index 000000000000..3c4e7d53320c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p26.png.cid @@ -0,0 +1 @@ +bafkreibqg2htebrransl5qiq3lt5bwbayq4g6uabnc4h7ynmcttxm47fra diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p27.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p27.png.cid new file mode 100644 index 000000000000..fff4f4130657 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p27.png.cid @@ -0,0 +1 @@ +bafkreig5bkhksigi4vlmymlh7uv3k5dwh6osrd6jfv676qgz65mja3gvcm diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p28.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p28.png.cid new file mode 100644 index 000000000000..3e5c9ed56b31 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p28.png.cid @@ -0,0 +1 @@ +bafkreienccwuuentmbb2nipoahvtrvh6b3du6bbm6bvqwjrmai4atyvcqu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p29.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p29.png.cid new file mode 100644 index 000000000000..00294538a870 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p29.png.cid @@ -0,0 +1 @@ +bafkreifmcc6rz4bcytrzscvinnxjshr5krfkeujs3nkdpeldlbdoewbtgi diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p30.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p30.png.cid new file mode 100644 index 000000000000..17205613315b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p30.png.cid @@ -0,0 +1 @@ +bafkreift3ia6sqlih7wtlct532emykafjkl33tp2sabuwyrs33ectovjwi diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p31.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p31.png.cid new file mode 100644 index 000000000000..2e4394b9f0ec --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p31.png.cid @@ -0,0 +1 @@ +bafkreihjzf3dcmuyt4naehfxmk6mejznc4dmilkxmeuaqoxtvdbuffe2su diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p32.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p32.png.cid new file mode 100644 index 000000000000..5d62b68cddd9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p32.png.cid @@ -0,0 +1 @@ +bafkreig2bxnbfaou57az2jff6hqjda5g6x2u4akt6oae53ch6eghgpfxs4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p33.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p33.png.cid new file mode 100644 index 000000000000..247369232421 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p33.png.cid @@ -0,0 +1 @@ +bafkreial3iqdryttg3kv5yc3l2q25zviqxxogw57oawidix7hj4r4bnmhu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p34.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p34.png.cid new file mode 100644 index 000000000000..3b29008bcddd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p34.png.cid @@ -0,0 +1 @@ +bafkreiakwrzh6diaxcgk5uoogbkqd6ceh4po7semqpa54b3kc5pghoyacu diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p35.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p35.png.cid new file mode 100644 index 000000000000..153e84383b8d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p35.png.cid @@ -0,0 +1 @@ +bafkreig7zww3z3q6i6bc3bapl3biukfxe4wk5wiewpltdjnpwdm6gkx23a diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p36.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p36.png.cid new file mode 100644 index 000000000000..200214af63ad --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p36.png.cid @@ -0,0 +1 @@ +bafkreigpclpfaerixmsss7g22fv4w72ef6e36mlcw5sxjnmejuyvbhdz5a diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p37.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p37.png.cid new file mode 100644 index 000000000000..c04da07b8877 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p37.png.cid @@ -0,0 +1 @@ +bafkreig6b37jovkcvdlq32x5hxdozdaqizf252p2cnw54boybbjidzv3em diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p38.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p38.png.cid new file mode 100644 index 000000000000..959a04c26a8b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p38.png.cid @@ -0,0 +1 @@ +bafkreiclk5uddh2h3w4bj223ytk6vbwqqlfdw3bls2u3l6w3pt5emvszbq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p39.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p39.png.cid new file mode 100644 index 000000000000..348dff83d803 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p39.png.cid @@ -0,0 +1 @@ +bafkreiavkh7luxjlqozuirrvl5tnfmlwimtqzf34znydzhojxw6eiqkgay diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p40.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p40.png.cid new file mode 100644 index 000000000000..f45e9d766a0b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p40.png.cid @@ -0,0 +1 @@ +bafkreif5w5la67cv7ocx5kqkqdxwvkjdira7ppuedmhj7nfw3qvpnsuheq diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p41.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p41.png.cid new file mode 100644 index 000000000000..4d0a8bbf9dbc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p41.png.cid @@ -0,0 +1 @@ +bafkreibtzdx3xhehwc45c472np54m37wlnoiatjvq6f74r223ubxp2h3a4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p42.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p42.png.cid new file mode 100644 index 000000000000..84fb5865471f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p42.png.cid @@ -0,0 +1 @@ +bafkreibbe5yihhicqnllezne7k45wtmfdk6k4gxtkl2tc5xyqg47cywg4m diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p43.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p43.png.cid new file mode 100644 index 000000000000..e81630d718b7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p43.png.cid @@ -0,0 +1 @@ +bafkreicumkhsbm7b2qqaz2h6vcxfn3x6qcxlhtwhss3xq5ixxlzmqlltxi diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p44.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p44.png.cid new file mode 100644 index 000000000000..b213f08d994d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p44.png.cid @@ -0,0 +1 @@ +bafkreidtj4yor5k4dwsk6buwuty3jyqyldbiw4tshl6tsxemugex5i5dw4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p45.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p45.png.cid new file mode 100644 index 000000000000..938d9c40c8a7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p45.png.cid @@ -0,0 +1 @@ +bafkreieanuvjvfs7nfkptd2npk7yz7yoe3bwxl4wgzsl6ttvpe46z73yim diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p46.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p46.png.cid new file mode 100644 index 000000000000..0453c4f8fc14 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p46.png.cid @@ -0,0 +1 @@ +bafkreihz66otwpg3rsmzrfy32cgvdlfwf37ymqzo2jxqcc552hkhjjpw6m diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p47.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p47.png.cid new file mode 100644 index 000000000000..22d1db06e654 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p47.png.cid @@ -0,0 +1 @@ +bafkreidxoejigoarcv4ea3tub4fua42u3ccamq7rblyvcyca2i2xgqkrry diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p48.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p48.png.cid new file mode 100644 index 000000000000..d5885db1bc28 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p48.png.cid @@ -0,0 +1 @@ +bafkreie5nyzqje3wiucz4ucdtlo5e2ouvdm4nv4yumx3amr4dpyi2rypk4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p49.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p49.png.cid new file mode 100644 index 000000000000..dc207c4f04db --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p49.png.cid @@ -0,0 +1 @@ +bafkreifv6f7e5h6upvemhzxvkvas4pk5p5nuljxqmey3v2uaveoy6dbda4 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p50.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p50.png.cid new file mode 100644 index 000000000000..b58c3cd0f8b6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p50.png.cid @@ -0,0 +1 @@ +bafkreidyx6kle53vfwnkfprt7mlqvek6iau463lpnpjp7l7ieayjt6dmjm diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p51.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p51.png.cid new file mode 100644 index 000000000000..9427cd178677 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p51.png.cid @@ -0,0 +1 @@ +bafkreiefldvy4teedvd6gbvjit4tbhjcygli6f2qiog5scupki7ukearna diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p52.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p52.png.cid new file mode 100644 index 000000000000..b424a60113e8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p52.png.cid @@ -0,0 +1 @@ +bafkreifl7smwuebxpsjetel6ncowjzstoq7jes7uyp3ybvtdw3mjl2ag54 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p53.png.cid b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p53.png.cid new file mode 100644 index 000000000000..453ea1c93923 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/MNML_5_500x_101-Raw_p53.png.cid @@ -0,0 +1 @@ +bafkreiecllzaux6ksm5rg27hnmlgjoqjowxz27tsd3lmjdrppmje3efn6u diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/README.md b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/README.md new file mode 100644 index 000000000000..2609f6c449b1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/README.md @@ -0,0 +1,3 @@ +Publicly released by U.S. Air Force Public Affairs office under PA number: + + 88ABW-2009-5021 diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.registered.txt new file mode 100644 index 000000000000..563f3e2a1a2c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.registered.txt @@ -0,0 +1,58 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +MNML_5_500x_101-Raw_p00.png; ; (0.0, 0.0) +MNML_5_500x_101-Raw_p01.png; ; (1235.5748976000516, -1.040080340974415) +MNML_5_500x_101-Raw_p02.png; ; (2459.919743068301, 0.06885754235849512) +MNML_5_500x_101-Raw_p03.png; ; (3687.8450497129074, 2.3889624549649064) +MNML_5_500x_101-Raw_p04.png; ; (4920.520165034133, 4.697506868731581) +MNML_5_500x_101-Raw_p05.png; ; (6150.870919426018, 3.080107831966844) +MNML_5_500x_101-Raw_p11.png; ; (0.8390627334627538, 913.2428784372994) +MNML_5_500x_101-Raw_p10.png; ; (1231.1983313210283, 913.5333928308096) +MNML_5_500x_101-Raw_p09.png; ; (2456.7985514152497, 915.8462931018548) +MNML_5_500x_101-Raw_p08.png; ; (3684.241794819601, 915.6726214519415) +MNML_5_500x_101-Raw_p07.png; ; (4919.653303896695, 917.5706527695343) +MNML_5_500x_101-Raw_p06.png; ; (6151.05868264936, 916.2043080257225) +MNML_5_500x_101-Raw_p12.png; ; (0.6976452822966905, 1831.8282739984786) +MNML_5_500x_101-Raw_p13.png; ; (1233.514448874585, 1833.9062573644753) +MNML_5_500x_101-Raw_p14.png; ; (2459.371845006677, 1836.342413191211) +MNML_5_500x_101-Raw_p15.png; ; (3687.326353877572, 1835.3300795770933) +MNML_5_500x_101-Raw_p16.png; ; (4920.551636829689, 1837.2360452523435) +MNML_5_500x_101-Raw_p17.png; ; (6152.029158220011, 1841.04247724352) +MNML_5_500x_101-Raw_p23.png; ; (0.010371771449399603, 2751.723947243067) +MNML_5_500x_101-Raw_p22.png; ; (1229.657608766143, 2753.026105002646) +MNML_5_500x_101-Raw_p21.png; ; (2457.9090882021915, 2754.9622300699216) +MNML_5_500x_101-Raw_p20.png; ; (3686.1839846492253, 2755.8610915279014) +MNML_5_500x_101-Raw_p19.png; ; (4918.036553956574, 2758.2606830783457) +MNML_5_500x_101-Raw_p18.png; ; (6147.697396969735, 2756.268107509077) +MNML_5_500x_101-Raw_p24.png; ; (-0.3954377263301865, 3673.407280512674) +MNML_5_500x_101-Raw_p25.png; ; (1232.9463147461245, 3673.8072381963607) +MNML_5_500x_101-Raw_p26.png; ; (2460.2184524300073, 3677.5878009875996) +MNML_5_500x_101-Raw_p27.png; ; (3687.9224118151747, 3681.3702356159583) +MNML_5_500x_101-Raw_p28.png; ; (4922.686734860942, 3683.080866625718) +MNML_5_500x_101-Raw_p29.png; ; (6153.318591259983, 3685.4131693718305) +MNML_5_500x_101-Raw_p35.png; ; (3.4785597918418887, 4616.2344053149245) +MNML_5_500x_101-Raw_p34.png; ; (1233.7378356614083, 4618.739771321329) +MNML_5_500x_101-Raw_p33.png; ; (2458.6642016236933, 4618.699495309078) +MNML_5_500x_101-Raw_p32.png; ; (3687.5417722106263, 4620.120129523751) +MNML_5_500x_101-Raw_p31.png; ; (4922.422204682727, 4622.462935230691) +MNML_5_500x_101-Raw_p30.png; ; (6149.759189587505, 4620.131510527348) +MNML_5_500x_101-Raw_p36.png; ; (3.5801693636169034, 5529.576802015906) +MNML_5_500x_101-Raw_p37.png; ; (1236.1432685530522, 5533.349603008448) +MNML_5_500x_101-Raw_p38.png; ; (2462.9893041647706, 5535.864261026213) +MNML_5_500x_101-Raw_p39.png; ; (3689.0216786559936, 5536.234413098773) +MNML_5_500x_101-Raw_p40.png; ; (4923.6114417274275, 5540.2353625826) +MNML_5_500x_101-Raw_p41.png; ; (6155.0531235737835, 5541.039630881294) +MNML_5_500x_101-Raw_p47.png; ; (2.621313506746077, 6448.506372324673) +MNML_5_500x_101-Raw_p46.png; ; (1232.0068239656005, 6448.171564818498) +MNML_5_500x_101-Raw_p45.png; ; (2457.9417272540713, 6449.8124859258105) +MNML_5_500x_101-Raw_p44.png; ; (3685.487148265739, 6453.1471276905395) +MNML_5_500x_101-Raw_p43.png; ; (4921.469813851395, 6450.365722769481) +MNML_5_500x_101-Raw_p42.png; ; (6149.069832724312, 6454.031267624529) +MNML_5_500x_101-Raw_p48.png; ; (1.4472213048786102, 7367.4804599406425) +MNML_5_500x_101-Raw_p49.png; ; (1233.139189477375, 7370.293920735977) +MNML_5_500x_101-Raw_p50.png; ; (2460.5428739426916, 7371.3993074765285) +MNML_5_500x_101-Raw_p51.png; ; (3688.6037662633175, 7373.318506722199) +MNML_5_500x_101-Raw_p52.png; ; (4922.513844351925, 7375.558200920955) +MNML_5_500x_101-Raw_p53.png; ; (6151.7146273664175, 7377.064928017177) diff --git a/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.txt new file mode 100644 index 000000000000..180374bcc22e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MNML_5_500x_101/TileConfiguration.txt @@ -0,0 +1,58 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +MNML_5_500x_101-Raw_p00.png; ; (0.0, 0.0) +MNML_5_500x_101-Raw_p01.png; ; (1227.0, 0.0) +MNML_5_500x_101-Raw_p02.png; ; (2454.0, 0.0) +MNML_5_500x_101-Raw_p03.png; ; (3681.0, 0.0) +MNML_5_500x_101-Raw_p04.png; ; (4908.0, 0.0) +MNML_5_500x_101-Raw_p05.png; ; (6135.0, 0.0) +MNML_5_500x_101-Raw_p11.png; ; (0.0, 919.0) +MNML_5_500x_101-Raw_p10.png; ; (1227.0, 919.0) +MNML_5_500x_101-Raw_p09.png; ; (2454.0, 919.0) +MNML_5_500x_101-Raw_p08.png; ; (3681.0, 919.0) +MNML_5_500x_101-Raw_p07.png; ; (4908.0, 919.0) +MNML_5_500x_101-Raw_p06.png; ; (6135.0, 919.0) +MNML_5_500x_101-Raw_p12.png; ; (0.0, 1838.0) +MNML_5_500x_101-Raw_p13.png; ; (1227.0, 1838.0) +MNML_5_500x_101-Raw_p14.png; ; (2454.0, 1838.0) +MNML_5_500x_101-Raw_p15.png; ; (3681.0, 1838.0) +MNML_5_500x_101-Raw_p16.png; ; (4908.0, 1838.0) +MNML_5_500x_101-Raw_p17.png; ; (6135.0, 1838.0) +MNML_5_500x_101-Raw_p23.png; ; (0.0, 2757.0) +MNML_5_500x_101-Raw_p22.png; ; (1227.0, 2757.0) +MNML_5_500x_101-Raw_p21.png; ; (2454.0, 2757.0) +MNML_5_500x_101-Raw_p20.png; ; (3681.0, 2757.0) +MNML_5_500x_101-Raw_p19.png; ; (4908.0, 2757.0) +MNML_5_500x_101-Raw_p18.png; ; (6135.0, 2757.0) +MNML_5_500x_101-Raw_p24.png; ; (0.0, 3676.0) +MNML_5_500x_101-Raw_p25.png; ; (1227.0, 3676.0) +MNML_5_500x_101-Raw_p26.png; ; (2454.0, 3676.0) +MNML_5_500x_101-Raw_p27.png; ; (3681.0, 3676.0) +MNML_5_500x_101-Raw_p28.png; ; (4908.0, 3676.0) +MNML_5_500x_101-Raw_p29.png; ; (6135.0, 3676.0) +MNML_5_500x_101-Raw_p35.png; ; (0.0, 4595.0) +MNML_5_500x_101-Raw_p34.png; ; (1227.0, 4595.0) +MNML_5_500x_101-Raw_p33.png; ; (2454.0, 4595.0) +MNML_5_500x_101-Raw_p32.png; ; (3681.0, 4595.0) +MNML_5_500x_101-Raw_p31.png; ; (4908.0, 4595.0) +MNML_5_500x_101-Raw_p30.png; ; (6135.0, 4595.0) +MNML_5_500x_101-Raw_p36.png; ; (0.0, 5514.0) +MNML_5_500x_101-Raw_p37.png; ; (1227.0, 5514.0) +MNML_5_500x_101-Raw_p38.png; ; (2454.0, 5514.0) +MNML_5_500x_101-Raw_p39.png; ; (3681.0, 5514.0) +MNML_5_500x_101-Raw_p40.png; ; (4908.0, 5514.0) +MNML_5_500x_101-Raw_p41.png; ; (6135.0, 5514.0) +MNML_5_500x_101-Raw_p47.png; ; (0.0, 6433.0) +MNML_5_500x_101-Raw_p46.png; ; (1227.0, 6433.0) +MNML_5_500x_101-Raw_p45.png; ; (2454.0, 6433.0) +MNML_5_500x_101-Raw_p44.png; ; (3681.0, 6433.0) +MNML_5_500x_101-Raw_p43.png; ; (4908.0, 6433.0) +MNML_5_500x_101-Raw_p42.png; ; (6135.0, 6433.0) +MNML_5_500x_101-Raw_p48.png; ; (0.0, 7352.0) +MNML_5_500x_101-Raw_p49.png; ; (1227.0, 7352.0) +MNML_5_500x_101-Raw_p50.png; ; (2454.0, 7352.0) +MNML_5_500x_101-Raw_p51.png; ; (3681.0, 7352.0) +MNML_5_500x_101-Raw_p52.png; ; (4908.0, 7352.0) +MNML_5_500x_101-Raw_p53.png; ; (6135.0, 7352.0) diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Data Details.csv.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Data Details.csv.cid new file mode 100644 index 000000000000..7ee78a857ea6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Data Details.csv.cid @@ -0,0 +1 @@ +bafkreiab6ynibk4j24r4gl7rg3kpueohxx5i4asjchgn73mil7fhia3lba diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Mosaic Focus Details.csv.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Mosaic Focus Details.csv.cid new file mode 100644 index 000000000000..bfefe98d425e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Mosaic Focus Details.csv.cid @@ -0,0 +1 @@ +bafkreiettmtwevukkpi3rsohflcw257la42bdpnk5gc346kizmtedfosx4 diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Parameter Details.csv.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Parameter Details.csv.cid new file mode 100644 index 000000000000..fa06131f7f2e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_ Parameter Details.csv.cid @@ -0,0 +1 @@ +bafkreiglgbfdc6vbgwkod7nsaczl6mxqwjcfs2ploi65td4kp4ywkbza3m diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_00.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_00.bmp.cid new file mode 100644 index 000000000000..7754a3fd722b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_00.bmp.cid @@ -0,0 +1 @@ +bafkreicyd2u6qma2isiap5hoi2dv5uopev2qsrcfxhqjzoglxnu5ui6s6i diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_01.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_01.bmp.cid new file mode 100644 index 000000000000..7b5f8a8e759d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_01.bmp.cid @@ -0,0 +1 @@ +bafkreidjutssjj2uyhzz5q2w3mgtlyp4apjsavncmrcnwywmkzzx4nadyy diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_02.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_02.bmp.cid new file mode 100644 index 000000000000..e3202e0947d0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_00_02.bmp.cid @@ -0,0 +1 @@ +bafkreidgef4xqipd4auoka4f4kp3h3jqxhmf4owh3qrxoc3rqxm63etqoi diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_00.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_00.bmp.cid new file mode 100644 index 000000000000..586579a6730d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_00.bmp.cid @@ -0,0 +1 @@ +bafkreifdk564p4hlmkvterab3mfhpy4os2g46lyx7ryzxugbxnosejffuq diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_01.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_01.bmp.cid new file mode 100644 index 000000000000..0dc80ac372ce --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_01.bmp.cid @@ -0,0 +1 @@ +bafkreicoqfg3ls24tm3mwummdorey5ic4s6l77mskmoaw5vn45xwnxlvnq diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_02.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_02.bmp.cid new file mode 100644 index 000000000000..7d397d0f9e80 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_01_02.bmp.cid @@ -0,0 +1 @@ +bafkreifptz4crzt6ae26eezkvympht54otlgpujb3yrfea37ldrkdr76de diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_00.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_00.bmp.cid new file mode 100644 index 000000000000..e1266543ef4e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_00.bmp.cid @@ -0,0 +1 @@ +bafkreib6n3yj5zxpzjq7m3ioekfhlqgeqk5oihtp5dy4npepztx2upwuma diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_01.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_01.bmp.cid new file mode 100644 index 000000000000..3e8064e1d0fd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_01.bmp.cid @@ -0,0 +1 @@ +bafkreibhmbx5wkv7gc54mcedwg2o5u3y3urvlrufw3mqdwlj3jipybmg2i diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_02.bmp.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_02.bmp.cid new file mode 100644 index 000000000000..ff802149a6f3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_02_02.bmp.cid @@ -0,0 +1 @@ +bafkreighqj3k5j6cakr3iwmrigdfkng3tv3riyglfnkvhp4wrqlg2d5mge diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_Fused.tif.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_Fused.tif.cid new file mode 100644 index 000000000000..4fb71c03e1de --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/1701701_000000_Fused.tif.cid @@ -0,0 +1 @@ +bafkreierpke5tugj2aegpdhtbrcfqollxs6lfg5qadyvlo42gkjtoyn2wu diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..14b6b83878fd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreiejzvedh2pgloyq2saww2qbf6n7tnxqvwvzzvmh37r2mlqwbjh5py diff --git a/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.txt.cid new file mode 100644 index 000000000000..5507e30342e3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/MediumCarbonSteel/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreihgne2uhttruehkm6wh5tcdvqnmavmjtxxg4wozxotuajbgzvtur4 diff --git a/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.registered.txt new file mode 100644 index 000000000000..8e748ebbc6ea --- /dev/null +++ b/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.registered.txt @@ -0,0 +1,104 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +NoisyImage_1_1.tif;;(-8, -2) +NoisyImage_2_1.tif;;(533, 11) +NoisyImage_3_1.tif;;(1017, 6) +NoisyImage_4_1.tif;;(1560, -11) +NoisyImage_5_1.tif;;(2035, -13) +NoisyImage_6_1.tif;;(2572, -20) +NoisyImage_7_1.tif;;(3077, 0) +NoisyImage_8_1.tif;;(3591, -18) +NoisyImage_9_1.tif;;(4090, 24) +NoisyImage_10_1.tif;;(4588, 3) +NoisyImage_1_2.tif;;(-12, 488) +NoisyImage_2_2.tif;;(487, 487) +NoisyImage_3_2.tif;;(1016, 518) +NoisyImage_4_2.tif;;(1539, 498) +NoisyImage_5_2.tif;;(2034, 501) +NoisyImage_6_2.tif;;(2582, 497) +NoisyImage_7_2.tif;;(3089, 527) +NoisyImage_8_2.tif;;(3595, 535) +NoisyImage_9_2.tif;;(4073, 505) +NoisyImage_10_2.tif;;(4598, 529) +NoisyImage_1_3.tif;;(5, 1028) +NoisyImage_2_3.tif;;(499, 1043) +NoisyImage_3_3.tif;;(1045, 1022) +NoisyImage_4_3.tif;;(1535, 1009) +NoisyImage_5_3.tif;;(2043, 1019) +NoisyImage_6_3.tif;;(2539, 1043) +NoisyImage_7_3.tif;;(3056, 1047) +NoisyImage_8_3.tif;;(3559, 1048) +NoisyImage_9_3.tif;;(4087, 1026) +NoisyImage_10_3.tif;;(4583, 1002) +NoisyImage_1_4.tif;;(-21, 1536) +NoisyImage_2_4.tif;;(488, 1559) +NoisyImage_3_4.tif;;(1045, 1512) +NoisyImage_4_4.tif;;(1552, 1535) +NoisyImage_5_4.tif;;(2057, 1518) +NoisyImage_6_4.tif;;(2568, 1538) +NoisyImage_7_4.tif;;(3060, 1530) +NoisyImage_8_4.tif;;(3575, 1516) +NoisyImage_9_4.tif;;(4111, 1522) +NoisyImage_10_4.tif;;(4620, 1556) +NoisyImage_1_5.tif;;(-2, 2071) +NoisyImage_2_5.tif;;(533, 2033) +NoisyImage_3_5.tif;;(1047, 2066) +NoisyImage_4_5.tif;;(1537, 2027) +NoisyImage_5_5.tif;;(2034, 2063) +NoisyImage_6_5.tif;;(2550, 2038) +NoisyImage_7_5.tif;;(3079, 2030) +NoisyImage_8_5.tif;;(3606, 2060) +NoisyImage_9_5.tif;;(4081, 2049) +NoisyImage_10_5.tif;;(4613, 2047) +NoisyImage_1_6.tif;;(10, 2561) +NoisyImage_2_6.tif;;(502, 2543) +NoisyImage_3_6.tif;;(1038, 2576) +NoisyImage_4_6.tif;;(1555, 2582) +NoisyImage_5_6.tif;;(2058, 2557) +NoisyImage_6_6.tif;;(2579, 2538) +NoisyImage_7_6.tif;;(3055, 2572) +NoisyImage_8_6.tif;;(3564, 2537) +NoisyImage_9_6.tif;;(4106, 2545) +NoisyImage_10_6.tif;;(4595, 2535) +NoisyImage_1_7.tif;;(7, 3081) +NoisyImage_2_7.tif;;(487, 3075) +NoisyImage_3_7.tif;;(1046, 3068) +NoisyImage_4_7.tif;;(1558, 3089) +NoisyImage_5_7.tif;;(2039, 3080) +NoisyImage_6_7.tif;;(2583, 3062) +NoisyImage_7_7.tif;;(3052, 3090) +NoisyImage_8_7.tif;;(3604, 3052) +NoisyImage_9_7.tif;;(4120, 3092) +NoisyImage_10_7.tif;;(4622, 3090) +NoisyImage_1_8.tif;;(10, 3590) +NoisyImage_2_8.tif;;(518, 3589) +NoisyImage_3_8.tif;;(1030, 3602) +NoisyImage_4_8.tif;;(1534, 3577) +NoisyImage_5_8.tif;;(2055, 3568) +NoisyImage_6_8.tif;;(2554, 3579) +NoisyImage_7_8.tif;;(3058, 3585) +NoisyImage_8_8.tif;;(3563, 3600) +NoisyImage_9_8.tif;;(4111, 3595) +NoisyImage_10_8.tif;;(4588, 3587) +NoisyImage_1_9.tif;;(-13, 4077) +NoisyImage_2_9.tif;;(525, 4085) +NoisyImage_3_9.tif;;(1022, 4101) +NoisyImage_4_9.tif;;(1529, 4096) +NoisyImage_5_9.tif;;(2049, 4088) +NoisyImage_6_9.tif;;(2582, 4104) +NoisyImage_7_9.tif;;(3071, 4092) +NoisyImage_8_9.tif;;(3565, 4113) +NoisyImage_9_9.tif;;(4101, 4088) +NoisyImage_10_9.tif;;(4587, 4116) +NoisyImage_1_10.tif;;(1, 4627) +NoisyImage_2_10.tif;;(517, 4591) +NoisyImage_3_10.tif;;(1027, 4590) +NoisyImage_4_10.tif;;(1557, 4596) +NoisyImage_5_10.tif;;(2025, 4614) +NoisyImage_6_10.tif;;(2539, 4626) +NoisyImage_7_10.tif;;(3061, 4603) +NoisyImage_8_10.tif;;(3603, 4603) +NoisyImage_9_10.tif;;(4102, 4627) +NoisyImage_10_10.tif;;(4628, 4607) diff --git a/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.txt new file mode 100644 index 000000000000..50707f330a94 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/NoisyTiles/TileConfiguration.txt @@ -0,0 +1,104 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +NoisyImage_1_1.tif;;(0, 0) +NoisyImage_2_1.tif;;(512, 0) +NoisyImage_3_1.tif;;(1024, 0) +NoisyImage_4_1.tif;;(1536, 0) +NoisyImage_5_1.tif;;(2048, 0) +NoisyImage_6_1.tif;;(2560, 0) +NoisyImage_7_1.tif;;(3072, 0) +NoisyImage_8_1.tif;;(3584, 0) +NoisyImage_9_1.tif;;(4096, 0) +NoisyImage_10_1.tif;;(4608, 0) +NoisyImage_1_2.tif;;(0, 512) +NoisyImage_2_2.tif;;(512, 512) +NoisyImage_3_2.tif;;(1024, 512) +NoisyImage_4_2.tif;;(1536, 512) +NoisyImage_5_2.tif;;(2048, 512) +NoisyImage_6_2.tif;;(2560, 512) +NoisyImage_7_2.tif;;(3072, 512) +NoisyImage_8_2.tif;;(3584, 512) +NoisyImage_9_2.tif;;(4096, 512) +NoisyImage_10_2.tif;;(4608, 512) +NoisyImage_1_3.tif;;(0, 1024) +NoisyImage_2_3.tif;;(512, 1024) +NoisyImage_3_3.tif;;(1024, 1024) +NoisyImage_4_3.tif;;(1536, 1024) +NoisyImage_5_3.tif;;(2048, 1024) +NoisyImage_6_3.tif;;(2560, 1024) +NoisyImage_7_3.tif;;(3072, 1024) +NoisyImage_8_3.tif;;(3584, 1024) +NoisyImage_9_3.tif;;(4096, 1024) +NoisyImage_10_3.tif;;(4608, 1024) +NoisyImage_1_4.tif;;(0, 1536) +NoisyImage_2_4.tif;;(512, 1536) +NoisyImage_3_4.tif;;(1024, 1536) +NoisyImage_4_4.tif;;(1536, 1536) +NoisyImage_5_4.tif;;(2048, 1536) +NoisyImage_6_4.tif;;(2560, 1536) +NoisyImage_7_4.tif;;(3072, 1536) +NoisyImage_8_4.tif;;(3584, 1536) +NoisyImage_9_4.tif;;(4096, 1536) +NoisyImage_10_4.tif;;(4608, 1536) +NoisyImage_1_5.tif;;(0, 2048) +NoisyImage_2_5.tif;;(512, 2048) +NoisyImage_3_5.tif;;(1024, 2048) +NoisyImage_4_5.tif;;(1536, 2048) +NoisyImage_5_5.tif;;(2048, 2048) +NoisyImage_6_5.tif;;(2560, 2048) +NoisyImage_7_5.tif;;(3072, 2048) +NoisyImage_8_5.tif;;(3584, 2048) +NoisyImage_9_5.tif;;(4096, 2048) +NoisyImage_10_5.tif;;(4608, 2048) +NoisyImage_1_6.tif;;(0, 2560) +NoisyImage_2_6.tif;;(512, 2560) +NoisyImage_3_6.tif;;(1024, 2560) +NoisyImage_4_6.tif;;(1536, 2560) +NoisyImage_5_6.tif;;(2048, 2560) +NoisyImage_6_6.tif;;(2560, 2560) +NoisyImage_7_6.tif;;(3072, 2560) +NoisyImage_8_6.tif;;(3584, 2560) +NoisyImage_9_6.tif;;(4096, 2560) +NoisyImage_10_6.tif;;(4608, 2560) +NoisyImage_1_7.tif;;(0, 3072) +NoisyImage_2_7.tif;;(512, 3072) +NoisyImage_3_7.tif;;(1024, 3072) +NoisyImage_4_7.tif;;(1536, 3072) +NoisyImage_5_7.tif;;(2048, 3072) +NoisyImage_6_7.tif;;(2560, 3072) +NoisyImage_7_7.tif;;(3072, 3072) +NoisyImage_8_7.tif;;(3584, 3072) +NoisyImage_9_7.tif;;(4096, 3072) +NoisyImage_10_7.tif;;(4608, 3072) +NoisyImage_1_8.tif;;(0, 3584) +NoisyImage_2_8.tif;;(512, 3584) +NoisyImage_3_8.tif;;(1024, 3584) +NoisyImage_4_8.tif;;(1536, 3584) +NoisyImage_5_8.tif;;(2048, 3584) +NoisyImage_6_8.tif;;(2560, 3584) +NoisyImage_7_8.tif;;(3072, 3584) +NoisyImage_8_8.tif;;(3584, 3584) +NoisyImage_9_8.tif;;(4096, 3584) +NoisyImage_10_8.tif;;(4608, 3584) +NoisyImage_1_9.tif;;(0, 4096) +NoisyImage_2_9.tif;;(512, 4096) +NoisyImage_3_9.tif;;(1024, 4096) +NoisyImage_4_9.tif;;(1536, 4096) +NoisyImage_5_9.tif;;(2048, 4096) +NoisyImage_6_9.tif;;(2560, 4096) +NoisyImage_7_9.tif;;(3072, 4096) +NoisyImage_8_9.tif;;(3584, 4096) +NoisyImage_9_9.tif;;(4096, 4096) +NoisyImage_10_9.tif;;(4608, 4096) +NoisyImage_1_10.tif;;(0, 4608) +NoisyImage_2_10.tif;;(512, 4608) +NoisyImage_3_10.tif;;(1024, 4608) +NoisyImage_4_10.tif;;(1536, 4608) +NoisyImage_5_10.tif;;(2048, 4608) +NoisyImage_6_10.tif;;(2560, 4608) +NoisyImage_7_10.tif;;(3072, 4608) +NoisyImage_8_10.tif;;(3584, 4608) +NoisyImage_9_10.tif;;(4096, 4608) +NoisyImage_10_10.tif;;(4608, 4608) diff --git a/Modules/Registration/Montage/test/Input/NoisyTiles/_readme.txt b/Modules/Registration/Montage/test/Input/NoisyTiles/_readme.txt new file mode 100644 index 000000000000..90b69b873527 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/NoisyTiles/_readme.txt @@ -0,0 +1 @@ +I have just uploaded another dataset to the same location I previously loaded the tiles. This dataset is the exact same tiles (same shifts for ideal alignment), but now each tile has had a Gaussian background illumination added, as well as shot noise introduced. The original image that these tiles were cut from had some level of shot noise too, but this should at least change the noise pattern. I am more interested to see how the background illumination affects things. It is not centered at the center of the image or any of the corners, so extra credit if you can figure out the center of the illumination. diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/100.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/100.tif.cid new file mode 100644 index 000000000000..43523dec5cd9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/100.tif.cid @@ -0,0 +1 @@ +bafkreidxva7xndq6kx3a5wbwb6k4biqerrm52ktelwwphhgqkr4iaactqa diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/101.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/101.tif.cid new file mode 100644 index 000000000000..61c154cff91b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/101.tif.cid @@ -0,0 +1 @@ +bafkreibbyto4et4ocyj5j52zfdupqqy34nimo5ti2tofabwvcmzghx2m2y diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/102.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/102.tif.cid new file mode 100644 index 000000000000..b07f41edeb60 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/102.tif.cid @@ -0,0 +1 @@ +bafkreigqgfbg6jtpud6ygg4ufbojsie64u67avxiyxemyrgcsbg7qv2q6a diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/103.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/103.tif.cid new file mode 100644 index 000000000000..f87d4630cae5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/103.tif.cid @@ -0,0 +1 @@ +bafkreih3xn76ktohfbizu5qdyoisze6vjuarevqvdgtcck7u3qxvbfuj64 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/104.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/104.tif.cid new file mode 100644 index 000000000000..aca524e2646b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/104.tif.cid @@ -0,0 +1 @@ +bafkreiduygcwtmlypkvrvj3dqlzaf7wu56j57w4mvxxtuqpmrdlsgguyju diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/105.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/105.tif.cid new file mode 100644 index 000000000000..459ab11230e5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/105.tif.cid @@ -0,0 +1 @@ +bafkreif2h3lsxnqfgpu7vfi4mdbyky6lxnj6i66ufo6oivqspnzu7hxk4u diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/106.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/106.tif.cid new file mode 100644 index 000000000000..8d74a224fa7a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/106.tif.cid @@ -0,0 +1 @@ +bafkreigxa4bbysofqbmurzbfkdznvu3bd3m3nxqj46bterrqgteg6wtsni diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/107.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/107.tif.cid new file mode 100644 index 000000000000..a45bcf274aea --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/107.tif.cid @@ -0,0 +1 @@ +bafkreihvlu7bxhtinwphceyqmdfl2gnorqnfi7f62c4bulfqi3hzlbgreu diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/108.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/108.tif.cid new file mode 100644 index 000000000000..24802515a149 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/108.tif.cid @@ -0,0 +1 @@ +bafkreic6bv4q6zngkeychplskxwabwr3p2nukhtda2bdp26a2zmfkfyil4 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/OMC14-ITK.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/OMC14-ITK.tif.cid new file mode 100644 index 000000000000..9220b53cb4d8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/OMC14-ITK.tif.cid @@ -0,0 +1 @@ +bafkreibnmcvexnnrcx52sip4cxx5azktdcwhpkhjfpkfxlevh445q2kty4 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..397c6e0d4fd9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreidnoxydbgdxujslf43tg6wfjpcqqynzzlvpbhww3yvxphbcxgwuq4 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.txt.cid new file mode 100644 index 000000000000..a972786cffc6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/14/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreife5ttbv4u7lctjdx3jujdiyeyrcq5jdqhtokcygzyk4gpqcsxnby diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/100.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/100.tif.cid new file mode 100644 index 000000000000..67835308bd74 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/100.tif.cid @@ -0,0 +1 @@ +bafkreiccr65276pnuomnvfqjkyqcwbtbkg6buuzxwtf5t3vq65xj57sekm diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/101.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/101.tif.cid new file mode 100644 index 000000000000..e75a0e0b4ff3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/101.tif.cid @@ -0,0 +1 @@ +bafkreidigfm2vcs2xkgxp4phdp5k43fcmp2kryqg7k2scfhtxjtzxbvf6a diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/102.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/102.tif.cid new file mode 100644 index 000000000000..557929a0443b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/102.tif.cid @@ -0,0 +1 @@ +bafkreidpelrnqwvqw4clgpdvomnmwbzj73r7invc6phpx2zn7ph4dnb7wi diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/103.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/103.tif.cid new file mode 100644 index 000000000000..d52ec5478aaa --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/103.tif.cid @@ -0,0 +1 @@ +bafkreif7byu4dq3rcyyutwch5mb6u4l4kl7dcux3nnxg5pjojymokqpiqq diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/104.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/104.tif.cid new file mode 100644 index 000000000000..b0e34836c483 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/104.tif.cid @@ -0,0 +1 @@ +bafkreidzd2dhmdef5qvsxe4r3kueu6gl2thykg5g7mvmi6pt4pvb7mvxmu diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/105.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/105.tif.cid new file mode 100644 index 000000000000..d9d78c7f9399 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/105.tif.cid @@ -0,0 +1 @@ +bafkreiagvg362jxifsu7xrzqbjugmsmqjvmzhcodokooaxcrwkbiuhfdjq diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/106.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/106.tif.cid new file mode 100644 index 000000000000..b3286deb9996 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/106.tif.cid @@ -0,0 +1 @@ +bafkreifrxbbvez5vezga6lj6w5mgn22wqu53wk546mx7vlbtvyfv7nawji diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/107.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/107.tif.cid new file mode 100644 index 000000000000..c168aaa7b752 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/107.tif.cid @@ -0,0 +1 @@ +bafkreieqv52kbzp5h6y2ssdc4ml7q5jroscwtbjizhz47z7zdwb4z7pet4 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/108.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/108.tif.cid new file mode 100644 index 000000000000..a3f4057d05c3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/108.tif.cid @@ -0,0 +1 @@ +bafkreidv44m7av26dwu64xez6rxkyzmlibmmoa5o75dplmdpfwdl46qjzq diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..da2f858e6a64 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreifnwipcaenlnqvleq7o75sw65rnu56b3xhtzpazzic6yblvaxmota diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.txt.cid new file mode 100644 index 000000000000..a972786cffc6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/15/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreife5ttbv4u7lctjdx3jujdiyeyrcq5jdqhtokcygzyk4gpqcsxnby diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/100.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/100.tif.cid new file mode 100644 index 000000000000..8ac04e0e238b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/100.tif.cid @@ -0,0 +1 @@ +bafkreih25ztz2jdlv7332lq2elaa7ort57ihmyqqemncke63afgnjqgf2u diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/101.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/101.tif.cid new file mode 100644 index 000000000000..4bc84ba553f6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/101.tif.cid @@ -0,0 +1 @@ +bafkreie6dtsmkm3wla3go2nduqsoqzudxnnitpa4xvfcksfc534e7popou diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/102.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/102.tif.cid new file mode 100644 index 000000000000..dadb0a926fe8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/102.tif.cid @@ -0,0 +1 @@ +bafkreiew4c2e7qbziow3phfvqvpdn3vf43r4mwtzno7kvif5xaqxdhn5oi diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/103.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/103.tif.cid new file mode 100644 index 000000000000..a3619459c039 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/103.tif.cid @@ -0,0 +1 @@ +bafkreidqdlloc7wi363ff5mx5pxqhmnzekwsvi3dkdod6wsvn4d3yh5xfm diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/104.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/104.tif.cid new file mode 100644 index 000000000000..d4cefacd82b0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/104.tif.cid @@ -0,0 +1 @@ +bafkreidu2uyr6r2ngtpukhwqqmmonpwfrfxrkylrnqxc7hfvrmvxce724i diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/105.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/105.tif.cid new file mode 100644 index 000000000000..6e4f7bf2763a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/105.tif.cid @@ -0,0 +1 @@ +bafkreiey7isb7ns5gliltdewxneagqynyl2nqiu7q33kyeqqemhfhpxlum diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/106.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/106.tif.cid new file mode 100644 index 000000000000..b39a53358c0d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/106.tif.cid @@ -0,0 +1 @@ +bafkreiaftmn7i6bkeyalsp6dkeepp3vtfie2bynwi2ikvgrsx7umijfydm diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/107.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/107.tif.cid new file mode 100644 index 000000000000..6fa8907648f6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/107.tif.cid @@ -0,0 +1 @@ +bafkreiagtsgntxfteweaodoag2ljcjccvqxkyootlosrq7piq6f6pphw5e diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/108.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/108.tif.cid new file mode 100644 index 000000000000..c750c2d51814 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/108.tif.cid @@ -0,0 +1 @@ +bafkreicwr3wmssovhiejnu6sz4b5jf4dts76s2wo73od6sr3ahftkv7uza diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..23885a9b14f8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreien2z6oaoqcwdsnyfihqnb4of6xgu74zbiqt5cchf6nbrmu7ppd5m diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.txt.cid new file mode 100644 index 000000000000..a972786cffc6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/16/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreife5ttbv4u7lctjdx3jujdiyeyrcq5jdqhtokcygzyk4gpqcsxnby diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/100.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/100.tif.cid new file mode 100644 index 000000000000..b604745ec683 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/100.tif.cid @@ -0,0 +1 @@ +bafkreibfhjctho4vhgb5c6ygxdsfzl7abcrjh6gnaffxq7j5ifytfcpq2i diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/101.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/101.tif.cid new file mode 100644 index 000000000000..f9fce13ff82a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/101.tif.cid @@ -0,0 +1 @@ +bafkreiaay3qcjl2mnzpmn4dezch5mrh2ovgi4mdrppvmdjkqez7l63oyge diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/102.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/102.tif.cid new file mode 100644 index 000000000000..70297054a777 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/102.tif.cid @@ -0,0 +1 @@ +bafkreihbito7wp5y5je6pwyrfxmlgifs6k4ehapv22thniknzl54r7zwpm diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/103.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/103.tif.cid new file mode 100644 index 000000000000..3151e197c5e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/103.tif.cid @@ -0,0 +1 @@ +bafkreibewhjvzshlnk7erlo6bfmiqb2wnlwinjqrqr5kvw577ujppikx6i diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/104.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/104.tif.cid new file mode 100644 index 000000000000..aca30bc0a1c0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/104.tif.cid @@ -0,0 +1 @@ +bafkreif6gxvduymv7vdbzgalq25wwei6iev6xqj5bv2vcor3jfto6qd5ui diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/105.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/105.tif.cid new file mode 100644 index 000000000000..b23b995e0bae --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/105.tif.cid @@ -0,0 +1 @@ +bafkreibdknu6qgczcrpep2kdlzl34qm7nzamgnifddlmxqnfykwrjq3oaq diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/106.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/106.tif.cid new file mode 100644 index 000000000000..9f7808f68372 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/106.tif.cid @@ -0,0 +1 @@ +bafkreictvxafo7a6xrw6vudqqxcjo2juaudxlytwvlttmixfdi4jceby2i diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/107.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/107.tif.cid new file mode 100644 index 000000000000..190d5979cf84 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/107.tif.cid @@ -0,0 +1 @@ +bafkreihllv5gu6bkqknd4yx54citgowqsknnjk4677nj3p5zhuowhbbzq4 diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/108.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/108.tif.cid new file mode 100644 index 000000000000..979263a0cdd5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/108.tif.cid @@ -0,0 +1 @@ +bafkreic2jktpkxyiejwaakunvmmihzmuzx77qbnbchahz43wgil2tf3umi diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..d498a81eacac --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreiekbonlzvdkscz6i3wm6byxkl7gm3trldxu2l5stqyvfffbz2zpxe diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.txt.cid new file mode 100644 index 000000000000..a972786cffc6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/17/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreife5ttbv4u7lctjdx3jujdiyeyrcq5jdqhtokcygzyk4gpqcsxnby diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/100.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/100.tif.cid new file mode 100644 index 000000000000..0950539ccf46 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/100.tif.cid @@ -0,0 +1 @@ +bafkreiaoz5pad6lxpnqb2kylgl4x7clagwzwuslcxlwb3evueiwvc2fmem diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/101.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/101.tif.cid new file mode 100644 index 000000000000..d57545549705 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/101.tif.cid @@ -0,0 +1 @@ +bafkreihro2z26zrtnareijrues4s3dwwv7z3wyenladhx6xv4nr3wmuivy diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/102.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/102.tif.cid new file mode 100644 index 000000000000..827e1f53391a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/102.tif.cid @@ -0,0 +1 @@ +bafkreid44h5mr32zrmt4ix3grwswoxbt5ukmkepokvfeud6j5un5osg3yu diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/103.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/103.tif.cid new file mode 100644 index 000000000000..5ad5a2e8200f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/103.tif.cid @@ -0,0 +1 @@ +bafkreigzehkcvg4j2svu4weiatguepjoloazc2rofms4ux6yjxyaxnq4pa diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/104.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/104.tif.cid new file mode 100644 index 000000000000..e9e122451456 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/104.tif.cid @@ -0,0 +1 @@ +bafkreiceat5e5rghrc74vfmm4tahjjzjvfzftbt4vn6cv5qgvvbmug4fqu diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/105.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/105.tif.cid new file mode 100644 index 000000000000..979d2f6f7a99 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/105.tif.cid @@ -0,0 +1 @@ +bafkreibnf7ubbgorb2szivgytgnvpwnottrq2nanwfwofvg35vejjjrbqu diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/106.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/106.tif.cid new file mode 100644 index 000000000000..c239393d2c28 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/106.tif.cid @@ -0,0 +1 @@ +bafkreiczysbvw4r4ygjduoge5grv7zx6yhu3c4d55rkuynlgfegkre5h5i diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/107.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/107.tif.cid new file mode 100644 index 000000000000..49179cdbec60 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/107.tif.cid @@ -0,0 +1 @@ +bafkreid4vxyq6zvheumbhkt3t6wu4pa3hxk66dc4pjqzdyhypp63csdzxa diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/108.tif.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/108.tif.cid new file mode 100644 index 000000000000..2eadc9213dd2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/108.tif.cid @@ -0,0 +1 @@ +bafkreiasmobob2sofj6nraoqickzxan2tagavtkzsflrqqjag5zepfqstq diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..cd6cd6588cdd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreiguaoalkeg6eluvaictpchoezhgnicvnp4a6gzqkyl5afynzakkoa diff --git a/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.txt.cid new file mode 100644 index 000000000000..a972786cffc6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/OMC/FlatField/18/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreife5ttbv4u7lctjdx3jujdiyeyrcq5jdqhtokcygzyk4gpqcsxnby diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/README.md b/Modules/Registration/Montage/test/Input/S200-6-C/README.md new file mode 100644 index 000000000000..2c2552912a0c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/README.md @@ -0,0 +1,3 @@ +Publicly released by U.S. Air Force Public Affairs office under PA number: + + 88ABW-2103-0127 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p000.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p000.jpg.cid new file mode 100644 index 000000000000..b43459c6ebc7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p000.jpg.cid @@ -0,0 +1 @@ +bafkreigap6bvkxvt2e42ha62ei6iqx62rvfjtag277ffxv5s6iaz2tn6nq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p001.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p001.jpg.cid new file mode 100644 index 000000000000..47eca958e52f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p001.jpg.cid @@ -0,0 +1 @@ +bafkreies5og6t57m5oxthalc3cpy7qqyrgfvcu2cwpzub2mvshqyf2bace diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p002.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p002.jpg.cid new file mode 100644 index 000000000000..557463f89b2a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p002.jpg.cid @@ -0,0 +1 @@ +bafkreigorqkap7zrphh5mdd7kpgeeie5g3x3p6f3ps55y3kfoyxal6x2oi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p003.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p003.jpg.cid new file mode 100644 index 000000000000..213441933b56 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p003.jpg.cid @@ -0,0 +1 @@ +bafkreigw3bdjl3y2e5yddzmq4spit65mdei4ct645n767lnn3cbwt2vmte diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p004.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p004.jpg.cid new file mode 100644 index 000000000000..1753ffb5732a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p004.jpg.cid @@ -0,0 +1 @@ +bafkreiaorpzgu576pu34hoaawdkasyeuod7d6kha5nsxsmxznzlqb6nndq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p005.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p005.jpg.cid new file mode 100644 index 000000000000..f99c10ba4725 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p005.jpg.cid @@ -0,0 +1 @@ +bafkreic5zjhbtbpiuwzgo7pg4xbeu53ih4orxwxrgkvaufclu6qi3kbsve diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p006.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p006.jpg.cid new file mode 100644 index 000000000000..165838665924 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p006.jpg.cid @@ -0,0 +1 @@ +bafkreicjilmeofxufydcshjy66cs23jtbtdqy7dbqnqfm7gwxx2vxskb5i diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p007.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p007.jpg.cid new file mode 100644 index 000000000000..38fb681f202e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p007.jpg.cid @@ -0,0 +1 @@ +bafkreic5zq74de6pkg3iel4djy4f4hu7gbmgdoe45ff3fibrw24hgdyh44 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p008.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p008.jpg.cid new file mode 100644 index 000000000000..0d032986cfb0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p008.jpg.cid @@ -0,0 +1 @@ +bafkreigbozwxfd2ivw2emqcn7exxhvpi4fvdp4rb74nir6rzbg6zwnckxe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p009.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p009.jpg.cid new file mode 100644 index 000000000000..ddb50b329d55 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p009.jpg.cid @@ -0,0 +1 @@ +bafkreibgxyh2pocwad45ludqngphkdii63pidocjbkacrrlr7ch7bqrzpm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p010.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p010.jpg.cid new file mode 100644 index 000000000000..82780095b5cd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p010.jpg.cid @@ -0,0 +1 @@ +bafkreigl3vsq4bdb6l2cgyikgsepl4ugjxknzedjkzeirwx7fypfyzuffy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p011.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p011.jpg.cid new file mode 100644 index 000000000000..04e3e3a330bf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p011.jpg.cid @@ -0,0 +1 @@ +bafkreidrkfp5ku3aayqhr72ymlrvjvbwxexoeosknqf6ws53s6lhpdmxyy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p012.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p012.jpg.cid new file mode 100644 index 000000000000..d172454cd459 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p012.jpg.cid @@ -0,0 +1 @@ +bafkreidno56sfkr4dhn2u72r6zcucaacphtjtp5y2pebqmxfi3orj6wwiq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p013.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p013.jpg.cid new file mode 100644 index 000000000000..9425c982c14c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p013.jpg.cid @@ -0,0 +1 @@ +bafkreibbtainn62dqmo2k3elgvwu3cgtonhvxauwpunfacqjohceutecsu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p014.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p014.jpg.cid new file mode 100644 index 000000000000..e935a87fe2ed --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p014.jpg.cid @@ -0,0 +1 @@ +bafkreifteb6ik4l6pm5bmvae7gyolctvdvc7b7gmfkbpq2b6x76um3ir2y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p015.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p015.jpg.cid new file mode 100644 index 000000000000..e46f19923304 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p015.jpg.cid @@ -0,0 +1 @@ +bafkreicjdlem5tbctfbcpbtd3rrsmietnigo4v44n2zm77c2rf4mxiur3a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p016.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p016.jpg.cid new file mode 100644 index 000000000000..4e8ed4928fd2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p016.jpg.cid @@ -0,0 +1 @@ +bafkreicugz2rpjmm2xh5nhtdvjpp5xrt4uzpfj4nnjfdpjy5p2zs3tz5x4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p017.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p017.jpg.cid new file mode 100644 index 000000000000..5267b403318d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p017.jpg.cid @@ -0,0 +1 @@ +bafkreiajmsrloxodkxc7bhdxijctn3crbw7qhtxrvrauahl5kllnxsucim diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p018.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p018.jpg.cid new file mode 100644 index 000000000000..b8d7b6fb3c71 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p018.jpg.cid @@ -0,0 +1 @@ +bafkreidqby5yoedmkake3gpzwsns6523ehan5teymclc6k46li55xtftd4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p019.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p019.jpg.cid new file mode 100644 index 000000000000..e3271abbae33 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p019.jpg.cid @@ -0,0 +1 @@ +bafkreihi3xn43rmw4ad5sjxusbyij6vfzuqhiiufaazgdqi2a2sati67rq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p020.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p020.jpg.cid new file mode 100644 index 000000000000..cd5e26e4a28d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p020.jpg.cid @@ -0,0 +1 @@ +bafkreiaimzwncs6txl7vsgw46xfqmfidwu2dnvpg4it6zlifvi3l5b5m5y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p021.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p021.jpg.cid new file mode 100644 index 000000000000..1608ffd88830 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p021.jpg.cid @@ -0,0 +1 @@ +bafkreif326cgyag22jon2ac2liwwpxj74vw3zisndfp4bwcjlhjr4zss6e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p022.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p022.jpg.cid new file mode 100644 index 000000000000..8fd0198668db --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p022.jpg.cid @@ -0,0 +1 @@ +bafkreif5ntxc6nmarvuxbawxs4vebqcxqp6q5olhesjo7fs5jlunw6z5oa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p023.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p023.jpg.cid new file mode 100644 index 000000000000..ddeeddbf8630 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p023.jpg.cid @@ -0,0 +1 @@ +bafkreic5qnro2zxngsn4cgya5k4wpq6k5hzumekbxyzredo2jspavirf5i diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p024.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p024.jpg.cid new file mode 100644 index 000000000000..caf24f81a03a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p024.jpg.cid @@ -0,0 +1 @@ +bafkreiazgdkdhjht64qdomzck52ebtsolwcddka3jjmirrs4xbp3j6x2uq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p025.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p025.jpg.cid new file mode 100644 index 000000000000..bcb36e2beef1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p025.jpg.cid @@ -0,0 +1 @@ +bafkreidj2vqkvme7vtmmbuhjtzes3y65omkm6lppda27ipx44zdnwustvu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p026.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p026.jpg.cid new file mode 100644 index 000000000000..921c45e03c4c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p026.jpg.cid @@ -0,0 +1 @@ +bafkreidyp4bhlje643o3hgokk6myz3yfccfqqwutigdwd3zag6rg7hpi3m diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p027.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p027.jpg.cid new file mode 100644 index 000000000000..135e3e75b40f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p027.jpg.cid @@ -0,0 +1 @@ +bafkreihsq2scvivvwuffzpow6wqbv2z2d5yikramkghqfuazspa2nnhwuu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p028.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p028.jpg.cid new file mode 100644 index 000000000000..fd3db198956d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p028.jpg.cid @@ -0,0 +1 @@ +bafkreibteje2b73ued3mmbp5oe6egw3tbpj3rvm3q5gctjqgrbclpjhzbq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p029.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p029.jpg.cid new file mode 100644 index 000000000000..c11f16ce7f74 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p029.jpg.cid @@ -0,0 +1 @@ +bafkreihkca3e556jr6cxvj2v2dh7axskmxy6k26rp42bndk6kv2aekrhvm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p030.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p030.jpg.cid new file mode 100644 index 000000000000..8687d6d8a5bc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p030.jpg.cid @@ -0,0 +1 @@ +bafkreih74b6mspzt3joiiucc5jfyjl6gozieitdraqvn2bpjbd3ssbtq5i diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p031.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p031.jpg.cid new file mode 100644 index 000000000000..63f543369e78 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p031.jpg.cid @@ -0,0 +1 @@ +bafkreigsjtmx4cj7g4lgueeyar3dwcr4sdr5etixk4n6nqd66cgxbcybge diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p032.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p032.jpg.cid new file mode 100644 index 000000000000..db117f8224ac --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p032.jpg.cid @@ -0,0 +1 @@ +bafkreifps7steb7k22v4mn4upq476rmeburhkvu7j26fookizkusndh7y4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p033.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p033.jpg.cid new file mode 100644 index 000000000000..7242983d9006 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p033.jpg.cid @@ -0,0 +1 @@ +bafkreif6j4ccd6go3tctio3j7mldehh6uirpqop5fnz4vtrnywsn5jtzne diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p034.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p034.jpg.cid new file mode 100644 index 000000000000..b42516a622c9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p034.jpg.cid @@ -0,0 +1 @@ +bafkreihtkw5acyo7jlghreipt46wfbm3knsp2w2b23n7gtl5qhf4kru2ca diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p035.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p035.jpg.cid new file mode 100644 index 000000000000..9cd42862ef4c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p035.jpg.cid @@ -0,0 +1 @@ +bafkreifl24hfu35bsxaa47vi2gbqquexd4ozwncvqqaa4sckk4n5zi3ibq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p036.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p036.jpg.cid new file mode 100644 index 000000000000..37542bb28eaf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p036.jpg.cid @@ -0,0 +1 @@ +bafkreifou2u2mtwuiysrtcjw7y763ajfzdkovumfauuxuy4newsr2irsfa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p037.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p037.jpg.cid new file mode 100644 index 000000000000..977d69449cfe --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p037.jpg.cid @@ -0,0 +1 @@ +bafkreicl24aooy4evxu4mds3vlxx5edms5we3tht7hhncn4kdohdjuip4a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p038.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p038.jpg.cid new file mode 100644 index 000000000000..3622f9010d43 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p038.jpg.cid @@ -0,0 +1 @@ +bafkreie4fmxd2grlaqun6owdtbkhfaf4miblywmquhhooozphk2kitm4bi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p039.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p039.jpg.cid new file mode 100644 index 000000000000..6aafa897a732 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p039.jpg.cid @@ -0,0 +1 @@ +bafkreiek5o7fstfxalua64hhpujub7b6bgdbn6hl2witpx3xcwpsnaovuu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p040.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p040.jpg.cid new file mode 100644 index 000000000000..cd39aa285491 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p040.jpg.cid @@ -0,0 +1 @@ +bafkreidajnnfo5ultptfsmxsn7mv35bvz53q3oadkaelq7prnoyinicszu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p041.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p041.jpg.cid new file mode 100644 index 000000000000..9cd4bedca62c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p041.jpg.cid @@ -0,0 +1 @@ +bafkreiha6nom7oms6gf4zcydlkoju4oiwxsi23g5rrdlcj5cnssacmtfl4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p042.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p042.jpg.cid new file mode 100644 index 000000000000..c67512f5ab50 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p042.jpg.cid @@ -0,0 +1 @@ +bafkreiejxur5vei7e5plz2aorszsrwxcoalp2r4vffsrwp2vmyiuzbaccu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p043.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p043.jpg.cid new file mode 100644 index 000000000000..d092d6fd98ee --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p043.jpg.cid @@ -0,0 +1 @@ +bafkreiejovndkafuxlxdmklubgcjtwfvh3v7w3ek7kcii7u4qfi2i3h5ma diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p044.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p044.jpg.cid new file mode 100644 index 000000000000..32c456b1dc56 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p044.jpg.cid @@ -0,0 +1 @@ +bafkreihx5y67ggsoibuf2u2nu3qskuoocroqz4nqfrot7peposn4cl4wcq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p045.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p045.jpg.cid new file mode 100644 index 000000000000..8e7af7ed1f90 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p045.jpg.cid @@ -0,0 +1 @@ +bafkreiehwrafndyfuflhv7xazflbleziiwyud2ejdmczxpohaijol2k6vm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p046.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p046.jpg.cid new file mode 100644 index 000000000000..355d866d6902 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p046.jpg.cid @@ -0,0 +1 @@ +bafkreifnzoaizh4llyljdtbk2seci5cyfqbshfkovq3se3gr5vdoxf7kge diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p047.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p047.jpg.cid new file mode 100644 index 000000000000..2f8c474654e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p047.jpg.cid @@ -0,0 +1 @@ +bafkreiee4yrf3yglwpwlc7pdariws62yh5lclh3ezh63urkfgbq2judene diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p048.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p048.jpg.cid new file mode 100644 index 000000000000..f96932709371 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p048.jpg.cid @@ -0,0 +1 @@ +bafkreigjzysl4zbjt2lepz2kezx5ramsfcmbvi7j2wdstyo3jtskjcas7u diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p049.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p049.jpg.cid new file mode 100644 index 000000000000..85dd04a68abe --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p049.jpg.cid @@ -0,0 +1 @@ +bafkreiht66k763i7o2gqegf7zplnmdnr6oos445lrxshvii36ctw5iqvwq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p050.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p050.jpg.cid new file mode 100644 index 000000000000..eedf005ae3ca --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p050.jpg.cid @@ -0,0 +1 @@ +bafkreihmml5xlx7o2fcyacrorj5n2zhlms3lkn6regj5uin3kusomjbc2u diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p051.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p051.jpg.cid new file mode 100644 index 000000000000..43d6eb137329 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p051.jpg.cid @@ -0,0 +1 @@ +bafkreibh2r6pk6u35j2ioubsxbbztoeo6ltfmuud2hhwyfaqlte57fgihe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p052.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p052.jpg.cid new file mode 100644 index 000000000000..4f633b2e4e54 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p052.jpg.cid @@ -0,0 +1 @@ +bafkreiac2qnwsfezhcn4ayicxctrxge6anaebhugogrradmozxsonrsvzu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p053.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p053.jpg.cid new file mode 100644 index 000000000000..be69abea5cc1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p053.jpg.cid @@ -0,0 +1 @@ +bafkreif3v2gmoudhwn5cwod7bysczjerl7trpgqlm34rww6cfl5kjsfore diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p054.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p054.jpg.cid new file mode 100644 index 000000000000..8fbbca4b04a5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p054.jpg.cid @@ -0,0 +1 @@ +bafkreicccjmbfty37d43qzxsxgexzfbhuo2yw3voxai4bxq7gsmmeeuedy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p055.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p055.jpg.cid new file mode 100644 index 000000000000..75756ac759b7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p055.jpg.cid @@ -0,0 +1 @@ +bafkreihmvunyv75wlwrofgxiwijw54nqzsc5w7if3npacq7xvlnd6jyktm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p056.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p056.jpg.cid new file mode 100644 index 000000000000..1d5621e0729f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p056.jpg.cid @@ -0,0 +1 @@ +bafkreibtatnvwxssqjrb4fedb5z6w2q6chysyzk4qx5rlfz7ooiywvfgny diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p057.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p057.jpg.cid new file mode 100644 index 000000000000..a314694ab821 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p057.jpg.cid @@ -0,0 +1 @@ +bafkreib2fvkt5jar2lh3aqrwgzs2xqbj7npelv3ywhm7tsseh2kg3v7hwe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p058.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p058.jpg.cid new file mode 100644 index 000000000000..5c3ae4284790 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p058.jpg.cid @@ -0,0 +1 @@ +bafkreidsctg7pqbn4bl3u67nuxszoqobfiw2g3akq33sl73l3hgkrf7z3e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p059.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p059.jpg.cid new file mode 100644 index 000000000000..c3061242b009 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p059.jpg.cid @@ -0,0 +1 @@ +bafkreicxhj3npuolpizc4mmb4i5pwvpfnq2yycypdu73cwlcudxqxokejy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p060.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p060.jpg.cid new file mode 100644 index 000000000000..3b37466a0802 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p060.jpg.cid @@ -0,0 +1 @@ +bafkreib3v5vzazy476pyif47elmu3pw7js5uvfjyv6e4jdlfk2vwm3znpm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p061.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p061.jpg.cid new file mode 100644 index 000000000000..1638438f8e8c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p061.jpg.cid @@ -0,0 +1 @@ +bafkreibmketaxvhnxeurylbxgxicaksjbbyv4dr7xltbzapawqfsc3eaje diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p062.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p062.jpg.cid new file mode 100644 index 000000000000..130a56afd5fa --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p062.jpg.cid @@ -0,0 +1 @@ +bafkreigv6pjall6vfv2imhckmw7xldsseah77ahqtod6ifgzpzwhgpcvs4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p063.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p063.jpg.cid new file mode 100644 index 000000000000..256d3ded58d6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p063.jpg.cid @@ -0,0 +1 @@ +bafkreibfnh7e2qtcupfpdealjm4wblq36oc5im4c2o5srn6kfnt7s3yo2i diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p064.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p064.jpg.cid new file mode 100644 index 000000000000..9af9ecc56424 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p064.jpg.cid @@ -0,0 +1 @@ +bafkreiaaxc36ewgwitoymz6t5iilsnyk6dz4hgenuv6wuwpe645jutot4q diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p065.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p065.jpg.cid new file mode 100644 index 000000000000..1e5bb3bf93ff --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p065.jpg.cid @@ -0,0 +1 @@ +bafkreiajgq4r6np3k2wf43juxxhoo3npbwpqd6ol6crr7geylrboniskay diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p066.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p066.jpg.cid new file mode 100644 index 000000000000..92d92c22b6b2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p066.jpg.cid @@ -0,0 +1 @@ +bafkreicrczfjrhqlqsivk4c2lroj4gk23kk2bcd53otbjkudawazxz2ddi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p067.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p067.jpg.cid new file mode 100644 index 000000000000..8ce79ca945fd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p067.jpg.cid @@ -0,0 +1 @@ +bafkreig44x43cs44zp5uchhi4uyvvggua2t3vksfarb372ymavbawjoy4q diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p068.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p068.jpg.cid new file mode 100644 index 000000000000..9864463c124c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p068.jpg.cid @@ -0,0 +1 @@ +bafkreib7tqavgxol2wbyub3mhqlqhfanl7s7fnmf7isbtqwv73rlzg7tfu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p069.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p069.jpg.cid new file mode 100644 index 000000000000..29323ec82ed1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p069.jpg.cid @@ -0,0 +1 @@ +bafkreidolhfq6h4hucibmbm2buwvkmdajeht4hjlizcnwcmgr3j5gjhg64 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p070.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p070.jpg.cid new file mode 100644 index 000000000000..7a038935b2a3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p070.jpg.cid @@ -0,0 +1 @@ +bafkreiek4x5k3za3wgcanlca4lqu4fhjjayl57yuh4wpk2ew4g6dveiaki diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p071.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p071.jpg.cid new file mode 100644 index 000000000000..885aa79f522c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p071.jpg.cid @@ -0,0 +1 @@ +bafkreibemfy62f63o5u2hr5e63s2en57slx2gensjghlyumv7zavunz5ui diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p072.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p072.jpg.cid new file mode 100644 index 000000000000..38a661256bb7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p072.jpg.cid @@ -0,0 +1 @@ +bafkreifbkcdchraxir5ynyqqueyecvq7rps2kmir2mysob7zc5domqwoie diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p073.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p073.jpg.cid new file mode 100644 index 000000000000..6d71ee1daef4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p073.jpg.cid @@ -0,0 +1 @@ +bafkreiheiw25guaaqg3lxleik5cr4xapwxytru4ou35b2b2twtqcvjb2vu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p074.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p074.jpg.cid new file mode 100644 index 000000000000..e1e9fd5f67b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p074.jpg.cid @@ -0,0 +1 @@ +bafkreie7jdjb2x2x5etoyoulfghzxtx2ul7smjjth34262soxpdy4deose diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p075.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p075.jpg.cid new file mode 100644 index 000000000000..ba0735397b65 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p075.jpg.cid @@ -0,0 +1 @@ +bafkreihj7fuqgxdjrxjubdz2275ti5n5wzlfjoft7dy66qn5tckdggnejy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p076.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p076.jpg.cid new file mode 100644 index 000000000000..3302d0f5ead2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p076.jpg.cid @@ -0,0 +1 @@ +bafkreify7dhntppp3lxmmmtai5aane5tlhik55dadro4n4ux2fwtckrafu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p077.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p077.jpg.cid new file mode 100644 index 000000000000..2a04432d1693 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p077.jpg.cid @@ -0,0 +1 @@ +bafkreic7veiqlnct72ruyc4of6mntovlbdcwjqufaw7fusm6mhhs5igoqa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p078.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p078.jpg.cid new file mode 100644 index 000000000000..92f05550c098 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p078.jpg.cid @@ -0,0 +1 @@ +bafkreid26cu5djwu5zrwdvphyrhvn5djucmip2gvn7v5cxwsioee55slla diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p079.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p079.jpg.cid new file mode 100644 index 000000000000..baaf087b5148 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p079.jpg.cid @@ -0,0 +1 @@ +bafkreidxgrw3usa5ukmjfd5tfpfax4vqjujpykpdrhgxwsonm2qyg657ee diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p080.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p080.jpg.cid new file mode 100644 index 000000000000..980b2ef53386 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p080.jpg.cid @@ -0,0 +1 @@ +bafkreieoti76yyerju4j7zngwrdfmhpgknavrv7o5gfo2sfp2nvq2treei diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p081.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p081.jpg.cid new file mode 100644 index 000000000000..8b061b20785a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p081.jpg.cid @@ -0,0 +1 @@ +bafkreigo3kz7kovj7rvic5g25ek6kkocqhwb3wzwkrwe74eic7rwcab6vy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p082.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p082.jpg.cid new file mode 100644 index 000000000000..634fbc57a07f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p082.jpg.cid @@ -0,0 +1 @@ +bafkreibe7zf6r24xjedgerxxbimk3je4fnb72prrzamlkt4cxpabvw7qym diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p083.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p083.jpg.cid new file mode 100644 index 000000000000..befcd8343b61 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p083.jpg.cid @@ -0,0 +1 @@ +bafkreiacm6fulhjdufm5wuhaz7dz4rmh4ncmy4bcaxzop3wgend663drn4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p084.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p084.jpg.cid new file mode 100644 index 000000000000..d90bfcdfb849 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p084.jpg.cid @@ -0,0 +1 @@ +bafkreicepchlzusia6ui7ixdqiykkn2xqbftd6dpza6gipsfr3puvxec7e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p085.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p085.jpg.cid new file mode 100644 index 000000000000..144d25dba86e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p085.jpg.cid @@ -0,0 +1 @@ +bafkreigt73xtqog7dwafplbo3zmgfeqdzymvg7yzc6kvdcdncn2b4ed25y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p086.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p086.jpg.cid new file mode 100644 index 000000000000..012f921e083e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p086.jpg.cid @@ -0,0 +1 @@ +bafkreih6pxmhmqwrwubewyfc3g24gne6j4nkkt5hse4z6rsgaj5ohe4jay diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p087.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p087.jpg.cid new file mode 100644 index 000000000000..678cff60deb0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p087.jpg.cid @@ -0,0 +1 @@ +bafkreic3rin5llc4lsmgef6kszbfhvytsk7gf3beripjoj6v6e4rxmtznq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p088.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p088.jpg.cid new file mode 100644 index 000000000000..0ae014b18e14 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p088.jpg.cid @@ -0,0 +1 @@ +bafkreigk2dxrwmxrqdulwu3vkwbg7inhcdgkfdsp4xln26hts53t6cyxqy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p089.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p089.jpg.cid new file mode 100644 index 000000000000..233ff35f1ecc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p089.jpg.cid @@ -0,0 +1 @@ +bafkreiepbjhpwtwmm2s3mn6ki4cde3z6qazaxg7bx5ktib53abw5w45oke diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p090.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p090.jpg.cid new file mode 100644 index 000000000000..36666d62671c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p090.jpg.cid @@ -0,0 +1 @@ +bafkreiaks2c3a2exx7bacn6vk5fcpkrqrcc555oroj4wb6kzdlvt5c3xoa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p091.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p091.jpg.cid new file mode 100644 index 000000000000..f80c4f83aae8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p091.jpg.cid @@ -0,0 +1 @@ +bafkreieyn7ce6o6ir6dobtznj6yz6ndplfhsrypmor33ga6hfmjhnpedfi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p092.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p092.jpg.cid new file mode 100644 index 000000000000..714001b840b2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p092.jpg.cid @@ -0,0 +1 @@ +bafkreiefiquoxyhoew4igntiawd44q63iowlxplctipldnqqz4xdaq2yre diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p093.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p093.jpg.cid new file mode 100644 index 000000000000..6a750f54fb89 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p093.jpg.cid @@ -0,0 +1 @@ +bafkreicdpmorht4jfaap5zfi7lanyvlnahp6dn2vl6gg7aqo3xldtvwvre diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p094.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p094.jpg.cid new file mode 100644 index 000000000000..768c6228afcf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p094.jpg.cid @@ -0,0 +1 @@ +bafkreiaf3d6uh7bdea5riqrzpkpyuqk356ajy5wcxklvubpg6se3ht3z2a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p095.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p095.jpg.cid new file mode 100644 index 000000000000..f270dd48bc75 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p095.jpg.cid @@ -0,0 +1 @@ +bafkreigoo5ah52wrgrpf2bdj4k3jp2v4zv4smvaxxi3csm4sifolenqky4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p096.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p096.jpg.cid new file mode 100644 index 000000000000..4badb7d21c13 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p096.jpg.cid @@ -0,0 +1 @@ +bafkreig4rupnyxc5qxu54knxjvrroke3pcfxd5gjvjjvcxtlmigalkfjzm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p097.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p097.jpg.cid new file mode 100644 index 000000000000..4c5fb3b7df6f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p097.jpg.cid @@ -0,0 +1 @@ +bafkreiajo3kfdvxmhhlzzlhm6mfzzppgocgalg27m7ckvxfwlmi7ccxcay diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p098.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p098.jpg.cid new file mode 100644 index 000000000000..71df33041f46 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p098.jpg.cid @@ -0,0 +1 @@ +bafkreieuu7ql72yhjvizabhlban5anmzcodsyigs7rqajff25odz4zq6au diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p099.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p099.jpg.cid new file mode 100644 index 000000000000..23d8188e1d33 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p099.jpg.cid @@ -0,0 +1 @@ +bafkreia7jwipm4s52enyqgc6fqloqc6udxrd77icar2vjgsdf356jdylta diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p100.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p100.jpg.cid new file mode 100644 index 000000000000..4c4b18d2271b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p100.jpg.cid @@ -0,0 +1 @@ +bafkreibqgkwfflifgjasbaco5rcqtcyoq2xlqekbo2qhlhxoszvjfagusu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p101.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p101.jpg.cid new file mode 100644 index 000000000000..c2d775cf1b5b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p101.jpg.cid @@ -0,0 +1 @@ +bafkreiblrbks7corro6xjkx3lmmzs5bjtytbz36eebjk2wladsflwp37v4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p102.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p102.jpg.cid new file mode 100644 index 000000000000..cb003690b9e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p102.jpg.cid @@ -0,0 +1 @@ +bafkreibvvzcfb3pmuqvw2a35qhhrnrjdnuhsseceg2zj6k4evf4tefzbma diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p103.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p103.jpg.cid new file mode 100644 index 000000000000..642f543ecd5b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p103.jpg.cid @@ -0,0 +1 @@ +bafkreiexdm2blxk22aobcnbjr4h7eytq7nmytbocsnapqj7efcxtrsx24i diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p104.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p104.jpg.cid new file mode 100644 index 000000000000..668e405caca2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p104.jpg.cid @@ -0,0 +1 @@ +bafkreibve3dmmeyanarnwbnx4rajwzrnohls6oovfs67raxipfxi32zfqe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p105.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p105.jpg.cid new file mode 100644 index 000000000000..81dc091a557c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p105.jpg.cid @@ -0,0 +1 @@ +bafkreih5jw4ukrfauzn4zx2s3fvbvkpunn67xtvi6sp3prjnwbojufbkoa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p106.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p106.jpg.cid new file mode 100644 index 000000000000..1012c709130b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p106.jpg.cid @@ -0,0 +1 @@ +bafkreic7dxxbmkfl4xc76xavimjampfw7ecaqafei74inzxcg6uy3q6nqe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p107.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p107.jpg.cid new file mode 100644 index 000000000000..1b23dc0ae81f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p107.jpg.cid @@ -0,0 +1 @@ +bafkreiaenzhweos7cuhehcw2n2eb5rdkjoelpsu35hfjaljuelk6ed5py4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p108.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p108.jpg.cid new file mode 100644 index 000000000000..6a913de4048f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p108.jpg.cid @@ -0,0 +1 @@ +bafkreicrxdsjmoogonsok6kaqecaqief25p7izn7gpyzoncdllkcpop4lq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p109.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p109.jpg.cid new file mode 100644 index 000000000000..e275dbf8926e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p109.jpg.cid @@ -0,0 +1 @@ +bafkreibtbvbojri6va36qi5rpjtpjanuc5fkaah6ijxmjovlwji5j35gv4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p110.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p110.jpg.cid new file mode 100644 index 000000000000..360fcde942e3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p110.jpg.cid @@ -0,0 +1 @@ +bafkreiblru7f3x35ngmuxm7s4osm4obgmg36egmxnzeug3t3a2kixu4v7a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p111.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p111.jpg.cid new file mode 100644 index 000000000000..22c299669d8b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p111.jpg.cid @@ -0,0 +1 @@ +bafkreicftlccxcxesxsdwj3hh23scxbdwfkka2iddx4shjpdxeawqz73gm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p112.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p112.jpg.cid new file mode 100644 index 000000000000..8d457d57def0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p112.jpg.cid @@ -0,0 +1 @@ +bafkreih322cowicmted5fqsrculfrvedgfaktmfxmp7zax3cxhx7gnxxnm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p113.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p113.jpg.cid new file mode 100644 index 000000000000..820374aa0a23 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p113.jpg.cid @@ -0,0 +1 @@ +bafkreihca5cgigzdojtbms42xvlpoqnr6chzrnhslbrchofb3i74ll5ky4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p114.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p114.jpg.cid new file mode 100644 index 000000000000..1d9abaa7d012 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p114.jpg.cid @@ -0,0 +1 @@ +bafkreie2puervvrlp5hk6645oxahm3cxytfeeg744gcxqd4lf2lqlehcfy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p115.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p115.jpg.cid new file mode 100644 index 000000000000..d29939d8b828 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p115.jpg.cid @@ -0,0 +1 @@ +bafkreifzbno6ejbkgw7mvzbukyzarvkn62ovguzwqtnhvqw73ino4lm2dm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p116.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p116.jpg.cid new file mode 100644 index 000000000000..354987aa57bf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p116.jpg.cid @@ -0,0 +1 @@ +bafkreigi4al2tkryeb4ppm6zvzpxtizda7ar3lwcz72fnk5q3fiv5moe54 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p117.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p117.jpg.cid new file mode 100644 index 000000000000..db1ea8f670e9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p117.jpg.cid @@ -0,0 +1 @@ +bafkreicfi3j6bwctbypekiznas2ff4kzdmnfqiihxl7acuv67nhkyjhuka diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p118.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p118.jpg.cid new file mode 100644 index 000000000000..5e2185a988e4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p118.jpg.cid @@ -0,0 +1 @@ +bafkreiblyxf4zc4tcdkbeyoh3bo7mw3xici7a44jickh24yhwphqq57cl4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p119.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p119.jpg.cid new file mode 100644 index 000000000000..ba324113113d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p119.jpg.cid @@ -0,0 +1 @@ +bafkreifjhc4ptlonh2vzelir6mkjztiys4fx2q4ulijhe5xznkouzizeci diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p120.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p120.jpg.cid new file mode 100644 index 000000000000..dd0045391542 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p120.jpg.cid @@ -0,0 +1 @@ +bafkreidhs5kasjdlu7po374ac3byewfatl33d2wjhpw6smvfszjmpwtpma diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p121.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p121.jpg.cid new file mode 100644 index 000000000000..694c5fe7b171 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p121.jpg.cid @@ -0,0 +1 @@ +bafkreicy2w2w7kjuve6236bjjabeu3dfz6wrcmzithzmvyzc5wxfdvvlzi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p122.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p122.jpg.cid new file mode 100644 index 000000000000..f557a2b71731 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p122.jpg.cid @@ -0,0 +1 @@ +bafkreiczj5lkpea3wc4tx7u42ijzn7imuzrqrvi7rdjzz6z5j36onpqkcm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p123.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p123.jpg.cid new file mode 100644 index 000000000000..548c51447436 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p123.jpg.cid @@ -0,0 +1 @@ +bafkreifutnqvur5airpqvox3ihxxhszhr3fpvgpmcnbearwotljxgy6jp4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p124.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p124.jpg.cid new file mode 100644 index 000000000000..0c3a46c52ea8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p124.jpg.cid @@ -0,0 +1 @@ +bafkreibpadkezm6nygus7vaox35xhmfr4mbefrp6fkkjdb24af7h5betwu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p125.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p125.jpg.cid new file mode 100644 index 000000000000..e37f48f65d6c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p125.jpg.cid @@ -0,0 +1 @@ +bafkreicmsci2vmkx3vq4jdkehcsffo3kyff56rou36kjmonauxmoqnxlxq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p126.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p126.jpg.cid new file mode 100644 index 000000000000..6f42167b85d3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p126.jpg.cid @@ -0,0 +1 @@ +bafkreiek4eaoyz4zdu4m563xktmabrho4zmyi32i5wurlv2hienux5aodm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p127.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p127.jpg.cid new file mode 100644 index 000000000000..6f7f4658226f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p127.jpg.cid @@ -0,0 +1 @@ +bafkreiat6i35mejotccxzj4lgxnu6ikizkpnaaccq2hjflmeux674fmbma diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p128.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p128.jpg.cid new file mode 100644 index 000000000000..a34b88630f44 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p128.jpg.cid @@ -0,0 +1 @@ +bafkreig67dzuyxoep2cmqkdypf5mvvnfosungg5fgxlybfe7bgxlebaiwm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p129.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p129.jpg.cid new file mode 100644 index 000000000000..bfe400565168 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p129.jpg.cid @@ -0,0 +1 @@ +bafkreiefohflcazegdedclfaz5eoxbrwuybmfiekabwhqitfk6t26brbke diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p130.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p130.jpg.cid new file mode 100644 index 000000000000..f2927c1e7280 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p130.jpg.cid @@ -0,0 +1 @@ +bafkreifipfcrj3jhxkvk6m4gf6on2mxv25kcqqioce6qbqpcx4ozcp3wpy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p131.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p131.jpg.cid new file mode 100644 index 000000000000..375a89586f9a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p131.jpg.cid @@ -0,0 +1 @@ +bafkreicjsgtk4qhirmkblfy7atjurh3ptlg5wwfttt47wbt6elfkyqniz4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p132.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p132.jpg.cid new file mode 100644 index 000000000000..b65cde5ac5de --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p132.jpg.cid @@ -0,0 +1 @@ +bafkreiebpiefq5f2qaesonnvlxxstupajw4qkzz3cqnvo5d5p2d5wdalqa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p133.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p133.jpg.cid new file mode 100644 index 000000000000..b7209ac62fa1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p133.jpg.cid @@ -0,0 +1 @@ +bafkreidyu3gfvpt7z7ozgmstwbj3hozc5c6g6lvobsi674ikeknik4q7my diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p134.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p134.jpg.cid new file mode 100644 index 000000000000..6292007fe2e9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p134.jpg.cid @@ -0,0 +1 @@ +bafkreihitgwka42yabwlpyq3tc2h3whucafu3glyogsauc3w2mlbdjcgoy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p135.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p135.jpg.cid new file mode 100644 index 000000000000..1df8847a4d59 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p135.jpg.cid @@ -0,0 +1 @@ +bafkreiaaxp65mjjmabedx2lkdpaqwls3f7m2twwep6bluklekvomhb6wgi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p136.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p136.jpg.cid new file mode 100644 index 000000000000..28e5078dce11 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p136.jpg.cid @@ -0,0 +1 @@ +bafkreieiuqmd4d3lgkcjxgir7j7w43cixfvc6ndhmje4xqi7qef6nyzyhe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p137.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p137.jpg.cid new file mode 100644 index 000000000000..cec697c36949 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p137.jpg.cid @@ -0,0 +1 @@ +bafkreigrsxckjg6z53icwvybalm4supmz44xysqk2hlzhufis5nrpyeame diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p138.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p138.jpg.cid new file mode 100644 index 000000000000..e48e4f9b7079 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p138.jpg.cid @@ -0,0 +1 @@ +bafkreialee3e62okzzm7m7ofwhny6bvtgoegh7kmpfl43mu7j6yzt4yvay diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p139.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p139.jpg.cid new file mode 100644 index 000000000000..5a0edb5b0b0c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p139.jpg.cid @@ -0,0 +1 @@ +bafkreibm7tey5lt3kfb3c4oii7jzfwkxha2mu4kavtarcvneafxlzcc77y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p140.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p140.jpg.cid new file mode 100644 index 000000000000..b7f77d742334 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p140.jpg.cid @@ -0,0 +1 @@ +bafkreia5pzs2sbyzcqmv7hgira56hpkazmdfabtff6vt6k4wmzhj43asjm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p141.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p141.jpg.cid new file mode 100644 index 000000000000..32bd0b0e62d7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p141.jpg.cid @@ -0,0 +1 @@ +bafkreifw5itwqql2by7cu7cgmyusccu5vxvjesc3urp3gcyaoef6lm4uja diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p142.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p142.jpg.cid new file mode 100644 index 000000000000..6bfcfcd34d2c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p142.jpg.cid @@ -0,0 +1 @@ +bafkreicq7yyl4dc6pue4jiiq7guzgpcol2ktz72haa64shpt75p3sachki diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p143.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p143.jpg.cid new file mode 100644 index 000000000000..1afa3bcca58d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p143.jpg.cid @@ -0,0 +1 @@ +bafkreib3bjpx2xw2fmdqlnjopiv6lcrdkqgen6re7zjdaiwwzlllagrjiq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p144.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p144.jpg.cid new file mode 100644 index 000000000000..23865a655dba --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p144.jpg.cid @@ -0,0 +1 @@ +bafkreifhktwha35gx7wnwndl2zyz4ly367bw2kg2rqhje55umq32bosvfy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p145.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p145.jpg.cid new file mode 100644 index 000000000000..dc92d02e5d38 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p145.jpg.cid @@ -0,0 +1 @@ +bafkreibttgxfy3l6k3e75qjtoamtx5f3uwaeqx2csdx6oekwr2bh7fppea diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p146.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p146.jpg.cid new file mode 100644 index 000000000000..3028553c78da --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p146.jpg.cid @@ -0,0 +1 @@ +bafkreicxeewfipjftum74igjifycrw3aq7vam4nhncelokpvwt7p4pbhi4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p147.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p147.jpg.cid new file mode 100644 index 000000000000..d85557123ed0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p147.jpg.cid @@ -0,0 +1 @@ +bafkreihvz6wutmdnxb77w44i5favgvyop3jsq63m6vluald5ydasrutize diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p148.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p148.jpg.cid new file mode 100644 index 000000000000..139fb73b59da --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p148.jpg.cid @@ -0,0 +1 @@ +bafkreibvrbam32thgpzu4oybnvvbiropa4giwqvpr7dt6jduycrln3w5fy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p149.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p149.jpg.cid new file mode 100644 index 000000000000..24f95801b7d8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p149.jpg.cid @@ -0,0 +1 @@ +bafkreicgo6uuqvamastv2uwradagudf42yvq54tbe2n5xqrpb4cryidtnu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p150.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p150.jpg.cid new file mode 100644 index 000000000000..bfc7c4af6d27 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p150.jpg.cid @@ -0,0 +1 @@ +bafkreic7oufmbsdprhy2qvkjmlvqvyrqdyxmohppbxjhznrssr5dogwnkq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p151.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p151.jpg.cid new file mode 100644 index 000000000000..c8c1294c8d47 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p151.jpg.cid @@ -0,0 +1 @@ +bafkreiemfhccbqmx6cxachsafar5x6ftq24avg5bsde5dgf4yzyyzubgs4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p152.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p152.jpg.cid new file mode 100644 index 000000000000..b95c84601fec --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p152.jpg.cid @@ -0,0 +1 @@ +bafkreidyt2gqbeh26fidetmoghpznrzxcwhakkd5tfsyc23o5vhtdpatfu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p153.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p153.jpg.cid new file mode 100644 index 000000000000..af6f8c6de218 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p153.jpg.cid @@ -0,0 +1 @@ +bafkreihwgjrckp4ocaoxggicsjfcmeq6zgsjr3tovieeghj53ukmm6woh4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p154.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p154.jpg.cid new file mode 100644 index 000000000000..f3fdd6e98de9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p154.jpg.cid @@ -0,0 +1 @@ +bafkreiba5d2icqcsgapjznjp4ysspvw3xgsfiguesdh44c5ahmy2egsbl4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p155.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p155.jpg.cid new file mode 100644 index 000000000000..df6d1f66571f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p155.jpg.cid @@ -0,0 +1 @@ +bafkreibqpl4fliy4khbimysr6jw4hzafykazuwner5v6ue4hglot7eu5je diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p156.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p156.jpg.cid new file mode 100644 index 000000000000..07e10911393f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p156.jpg.cid @@ -0,0 +1 @@ +bafkreigrf332xy7szm4dsbcib3n6s4cftub6ionyi4btwdakovva7ihn4a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p157.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p157.jpg.cid new file mode 100644 index 000000000000..4688f79707d6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p157.jpg.cid @@ -0,0 +1 @@ +bafkreideuxwjwgjfwqsavkssugcl7jhceo5u4pl4mfesm5hd5wo4igmucq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p158.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p158.jpg.cid new file mode 100644 index 000000000000..b1f2165e25b1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p158.jpg.cid @@ -0,0 +1 @@ +bafkreiacz5odzgqhql6aidkylwoivx7yg6grx6vmcsifsgi5mqnllmlepe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p159.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p159.jpg.cid new file mode 100644 index 000000000000..851b9c82a448 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p159.jpg.cid @@ -0,0 +1 @@ +bafkreibyecothj2mfftqovxkprgjq732chnq2437neyjjgfjujo6qfyizu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p160.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p160.jpg.cid new file mode 100644 index 000000000000..7c71c8df4a50 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p160.jpg.cid @@ -0,0 +1 @@ +bafkreibuqi2oa4pyodz6ogtc6mnxp3xi6pudzr6eapu7g2itmiemjk5mfq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p161.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p161.jpg.cid new file mode 100644 index 000000000000..d5f24b423553 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p161.jpg.cid @@ -0,0 +1 @@ +bafkreig4qvccoitqn6c77x7pes5qn6d2kkj3nijegefefxxig4wve62t5a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p162.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p162.jpg.cid new file mode 100644 index 000000000000..6286eec61765 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p162.jpg.cid @@ -0,0 +1 @@ +bafkreietmn6ua2vrfq63oljaqnpsqx3g4x6vztcska76hmwl3az5x4ani4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p163.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p163.jpg.cid new file mode 100644 index 000000000000..395911c449ac --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p163.jpg.cid @@ -0,0 +1 @@ +bafkreiah6l73blswn4i6ksmjhjunz6cn3bhntvcgcwrqxn2qitkct2thwa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p164.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p164.jpg.cid new file mode 100644 index 000000000000..7f59baef242b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p164.jpg.cid @@ -0,0 +1 @@ +bafkreiadw3ym4nvmgszvdu3g6quiid3qfdpra44vpxfqli5kmu4jyoip5y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p165.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p165.jpg.cid new file mode 100644 index 000000000000..ad69aad2cbaf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p165.jpg.cid @@ -0,0 +1 @@ +bafkreiepoh4j6nyh3po5dshkqxdieygorntljg3m2wh5zz7oxkdiq4dmzu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p166.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p166.jpg.cid new file mode 100644 index 000000000000..7e1c68bac404 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p166.jpg.cid @@ -0,0 +1 @@ +bafkreiazk4o7r7mxsvqz4zm6ykzkuerr3b5rgsyhfjoalg3bqkitmpi2di diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p167.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p167.jpg.cid new file mode 100644 index 000000000000..b3d771dbc79d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p167.jpg.cid @@ -0,0 +1 @@ +bafkreidt3kvzoluz22c3nbiieh6tdlm2gdh6jq3empfpm2vglkb5uc2cee diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p168.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p168.jpg.cid new file mode 100644 index 000000000000..d30cdb2dc3fb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p168.jpg.cid @@ -0,0 +1 @@ +bafkreiemklxeofor3tx2i2brhea45snzusfk7qv5qxtnoankfqx2s3acna diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p169.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p169.jpg.cid new file mode 100644 index 000000000000..abec0ddd83b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p169.jpg.cid @@ -0,0 +1 @@ +bafkreiafuzszuzv4vuquc6mvjw2y2a7fjwoyppy6jtw5ptkb7taxoxj22e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p170.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p170.jpg.cid new file mode 100644 index 000000000000..1b47a45612cd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p170.jpg.cid @@ -0,0 +1 @@ +bafkreigbkz2qjpmadrtoulrsw3zhgbnvt53trebsj75t53s2jbsqofpfle diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p171.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p171.jpg.cid new file mode 100644 index 000000000000..14bcd86d152b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p171.jpg.cid @@ -0,0 +1 @@ +bafkreigpzwbpuw3rtpnxj2oirvxia2uuzmg72eflu6tt4adqsmheitslxm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p172.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p172.jpg.cid new file mode 100644 index 000000000000..1da5e4f8a6f0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p172.jpg.cid @@ -0,0 +1 @@ +bafkreidx7gl2vqozh4e26blif4sp3fmj4ugxcmlvi2jkptujbexx3jffgm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p173.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p173.jpg.cid new file mode 100644 index 000000000000..6b3ca06dd90d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p173.jpg.cid @@ -0,0 +1 @@ +bafkreiffhhab5nbhkbt3kcxumd3i6fs7d7fsig2p5kezwhsfztcx4m7feq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p174.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p174.jpg.cid new file mode 100644 index 000000000000..921562a49de8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p174.jpg.cid @@ -0,0 +1 @@ +bafkreieqcuycsqbdndckqu74wvnvfi6thimulbwnvi354a3ux67vjgjg4y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p175.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p175.jpg.cid new file mode 100644 index 000000000000..7ab48dbb1a06 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p175.jpg.cid @@ -0,0 +1 @@ +bafkreify2lm4ukc64q4u3tl2nkasgwvsgaugngy3tsusrrk6emnsx2rrmm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p176.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p176.jpg.cid new file mode 100644 index 000000000000..1da79fa31115 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p176.jpg.cid @@ -0,0 +1 @@ +bafkreihstqup4c6ypmfobguc3gx6keksiqpaies5nfr7nqvhauu4wyy5em diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p177.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p177.jpg.cid new file mode 100644 index 000000000000..722795215192 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p177.jpg.cid @@ -0,0 +1 @@ +bafkreiglapol3f4o254um6nf77rtv6n5lah6kip2i636v6e52vflmoydjy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p178.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p178.jpg.cid new file mode 100644 index 000000000000..d31a59253bb2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p178.jpg.cid @@ -0,0 +1 @@ +bafkreicd3f62eym6iax6avtrutsbkpwwpsi67mu5g5qyrhhzlscd3mbnnq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p179.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p179.jpg.cid new file mode 100644 index 000000000000..acee9ba83693 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p179.jpg.cid @@ -0,0 +1 @@ +bafkreifgurxxnglprzzsruwjaikr7rb5vfbbj4ltto54c7ucakv23w622e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p180.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p180.jpg.cid new file mode 100644 index 000000000000..f53763abdc5e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p180.jpg.cid @@ -0,0 +1 @@ +bafkreihsxzz7saaf72khjjuvt75ghb76qipsvr2ue7d7grydvhvadxxq6a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p181.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p181.jpg.cid new file mode 100644 index 000000000000..ce5f7bca3105 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p181.jpg.cid @@ -0,0 +1 @@ +bafkreigd6li4kuptpzmf4gmuslv37h72rwfgn5mtdrsdrsm4vfjstbb2ve diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p182.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p182.jpg.cid new file mode 100644 index 000000000000..1d9530d92724 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p182.jpg.cid @@ -0,0 +1 @@ +bafkreicda5gbucmr7jwp66hxl3rqldyltkspujcssxfqyzwhvcpqv5toi4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p183.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p183.jpg.cid new file mode 100644 index 000000000000..973eaa4859dc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p183.jpg.cid @@ -0,0 +1 @@ +bafkreibi77qjk7zkdscudpxyzowecsmmgswxxm2xa7rlhtz7d4pxhtgxae diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p184.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p184.jpg.cid new file mode 100644 index 000000000000..bdb09c42d471 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p184.jpg.cid @@ -0,0 +1 @@ +bafkreihux2y5wzqua3kdh6rwq2kbntrmxfxkkjasdyn6jvtng6546attle diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p185.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p185.jpg.cid new file mode 100644 index 000000000000..5bc269928356 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p185.jpg.cid @@ -0,0 +1 @@ +bafkreidocp47drn3i4p3y632ovwhg6peuave5ozkr6nyatxjayggqhc3iy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p186.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p186.jpg.cid new file mode 100644 index 000000000000..58fc6fbd307a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p186.jpg.cid @@ -0,0 +1 @@ +bafkreicapwzim4mfjsgcdm2h6j4b3l5idpo6jw3f4lxtqi77frwryl4ugy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p187.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p187.jpg.cid new file mode 100644 index 000000000000..9464b9f12da4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p187.jpg.cid @@ -0,0 +1 @@ +bafkreie2kqmyk5j7xhi4pxmdw6w56bet2q2cc7io7kpo7hbocgohfny2yu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p188.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p188.jpg.cid new file mode 100644 index 000000000000..2839125ae3f4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p188.jpg.cid @@ -0,0 +1 @@ +bafkreieief5mvfmxtu56ydvqmzgoq2hcy3bzsggdsyvfpikwbwzna2zwmy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p189.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p189.jpg.cid new file mode 100644 index 000000000000..690de2602211 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p189.jpg.cid @@ -0,0 +1 @@ +bafkreiez3zhcniajuxgg5ehl6tnhkihr72aysoccwy24xghvpbyshpq3om diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p190.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p190.jpg.cid new file mode 100644 index 000000000000..f85725ffcaf4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p190.jpg.cid @@ -0,0 +1 @@ +bafkreidtkmtnks3eejc5wkvzb2yb3josvjpilms64ydabhwso2uj4tswdy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p191.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p191.jpg.cid new file mode 100644 index 000000000000..dc93ff54dd11 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p191.jpg.cid @@ -0,0 +1 @@ +bafkreibzckxuoilm7msm5aszimi7bhzxkrk2w2dywrw3m6slcrkh2q7zra diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p192.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p192.jpg.cid new file mode 100644 index 000000000000..151f87c408e1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p192.jpg.cid @@ -0,0 +1 @@ +bafkreiftpvn2ehi5efwsvtmwkmqbggkh27vwda23ur4m5xk45uzifrjuma diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p193.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p193.jpg.cid new file mode 100644 index 000000000000..c6b0265e800c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p193.jpg.cid @@ -0,0 +1 @@ +bafkreifbfmrxte6cnjjidpkpdzgx45tnx5xsrzknxtaqrf6or7rvgcluve diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p194.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p194.jpg.cid new file mode 100644 index 000000000000..1175de475879 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p194.jpg.cid @@ -0,0 +1 @@ +bafkreifxkhgwwnjxl32evdtldqokph5mo5fgtyjawi3j47i2k3rxvickiq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p195.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p195.jpg.cid new file mode 100644 index 000000000000..3519dd63289e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p195.jpg.cid @@ -0,0 +1 @@ +bafkreibmaqe6kp75az4xhmeityxxvjjdgfshfayhhc5k4m6gmgity6j4pq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p196.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p196.jpg.cid new file mode 100644 index 000000000000..cfb0c20ccb11 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p196.jpg.cid @@ -0,0 +1 @@ +bafkreidy3mjlz37wwfwppxwf7piyqytqln2ktfy3oge7dp22comuwz77qi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p197.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p197.jpg.cid new file mode 100644 index 000000000000..42523a0172b1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p197.jpg.cid @@ -0,0 +1 @@ +bafkreiaueoad3a7bonxllif6gro63sgc62y5g3ova635qbas6qwd5pb4za diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p198.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p198.jpg.cid new file mode 100644 index 000000000000..f0e1055eab97 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p198.jpg.cid @@ -0,0 +1 @@ +bafkreiauxrue6yrevjvxvybwyo564uwrf2d6owbv5pempv2yoyip4qv3me diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p199.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p199.jpg.cid new file mode 100644 index 000000000000..8c25cc3d4ab3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p199.jpg.cid @@ -0,0 +1 @@ +bafkreicbau53kuqrpvz4es6cm43ucv5zz4e4jetjnlrxh6mct7lfok7wqy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p200.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p200.jpg.cid new file mode 100644 index 000000000000..d4f1b2f475c8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p200.jpg.cid @@ -0,0 +1 @@ +bafkreiclp7oai7xrwp7pchvorrqe2kob6g7gube77ba7nj52qzeo27qmae diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p201.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p201.jpg.cid new file mode 100644 index 000000000000..294566e092f7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p201.jpg.cid @@ -0,0 +1 @@ +bafkreidjbfd5sbllcniqra6vlqj5r7sylmiazugdmybkw3sayfng5utg6u diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p202.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p202.jpg.cid new file mode 100644 index 000000000000..5d460b457d22 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p202.jpg.cid @@ -0,0 +1 @@ +bafkreibj2ytw6dlblc376wbs23cwz3doboqej4zw6je5jo7tyczf7ar5qu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p203.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p203.jpg.cid new file mode 100644 index 000000000000..37caf340ed8c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p203.jpg.cid @@ -0,0 +1 @@ +bafkreif3dvzf6qbywoc6rg75yco6u2kpsipow5bsz4futycrsmwr2mmd4m diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p204.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p204.jpg.cid new file mode 100644 index 000000000000..113605bbd57e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p204.jpg.cid @@ -0,0 +1 @@ +bafkreihb3yjof5yyziyrtxr6id5ufjihmiqk66ef66vpsgbcareciklpse diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p205.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p205.jpg.cid new file mode 100644 index 000000000000..13e8cd4713c7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p205.jpg.cid @@ -0,0 +1 @@ +bafkreiclb4tfs656bkgvnjlan2fnrnkafuwawjqj6wi56i6glw74mhb4fy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p206.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p206.jpg.cid new file mode 100644 index 000000000000..35d109276a00 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p206.jpg.cid @@ -0,0 +1 @@ +bafkreia724pkmsfqmbhkddixbjbxhld526xubtbogjtmr64gcnukqbszvq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p207.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p207.jpg.cid new file mode 100644 index 000000000000..f8d3a27c43cb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p207.jpg.cid @@ -0,0 +1 @@ +bafkreidamxgqsllyanjwsjzqxfu2ey4mm46p4nj4byag7j74dzdlmjapi4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p208.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p208.jpg.cid new file mode 100644 index 000000000000..631a94a1efa6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p208.jpg.cid @@ -0,0 +1 @@ +bafkreid7faqakfcx26pq7irynbivnqia72tmwftps34h2bujbxluph7bgq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p209.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p209.jpg.cid new file mode 100644 index 000000000000..7d6911ba7aad --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p209.jpg.cid @@ -0,0 +1 @@ +bafkreigdlev6uuciu6olrv6nfo7zmsa2ximfmeihltlelyczicbbrfahlq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p210.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p210.jpg.cid new file mode 100644 index 000000000000..679b6ceeecc9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p210.jpg.cid @@ -0,0 +1 @@ +bafkreicdu3boestqksh25t6lmtdw4yirdkwr5tccxgxkk5wlupztj32zzm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p211.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p211.jpg.cid new file mode 100644 index 000000000000..54b87481c150 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p211.jpg.cid @@ -0,0 +1 @@ +bafkreiee6pfgeqdgcypfvadplfzcj6wrjak4zqb7wrsoj77duwytjcbq54 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p212.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p212.jpg.cid new file mode 100644 index 000000000000..b0e293eae96c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p212.jpg.cid @@ -0,0 +1 @@ +bafkreie25fo4v5ucaqnioowwyexhgcjkb4jtmqfvjdmh75keqcumlqvuce diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p213.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p213.jpg.cid new file mode 100644 index 000000000000..d2c7b9d6e269 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p213.jpg.cid @@ -0,0 +1 @@ +bafkreibdiwd75o344lpnrxw3bko425egkbl6di7b7bbzlvntuqzzxtd62e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p214.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p214.jpg.cid new file mode 100644 index 000000000000..fa787594d83c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p214.jpg.cid @@ -0,0 +1 @@ +bafkreic7xxqrzmojpudptamytkup4dm3hhqut4kjq2hd7ssn3bbgb6i6ya diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p215.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p215.jpg.cid new file mode 100644 index 000000000000..8b2cf00efd2b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p215.jpg.cid @@ -0,0 +1 @@ +bafkreig3s3mqwopafuu5mbqb4ay7yhwj7zhibtrajfy2uul7tbbhq5bal4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p216.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p216.jpg.cid new file mode 100644 index 000000000000..d333c7779c49 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p216.jpg.cid @@ -0,0 +1 @@ +bafkreibedo2o73o7rakzradzya62uloqq5tu5wfrfdibqgp6cq2xqgfgne diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p217.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p217.jpg.cid new file mode 100644 index 000000000000..1dc3295af8f1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p217.jpg.cid @@ -0,0 +1 @@ +bafkreiferskkqrmeoi6im6vr6sxn47gwy5m5wcuo6lohxmt26jah4t67ty diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p218.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p218.jpg.cid new file mode 100644 index 000000000000..d05589795ad5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p218.jpg.cid @@ -0,0 +1 @@ +bafkreiadt4ubvytwsybxjn5mc3dmbu2sdzpgnsxbgzubl37nlocvtqrq44 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p219.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p219.jpg.cid new file mode 100644 index 000000000000..eba3a1f803f0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p219.jpg.cid @@ -0,0 +1 @@ +bafkreida4rsykaerugpteh3btk6f77gtb2qr6uzi47bsioamfdpawp7wkq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p220.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p220.jpg.cid new file mode 100644 index 000000000000..c9bd05704761 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p220.jpg.cid @@ -0,0 +1 @@ +bafkreihrhn2dxqnkdkab2qmpoxzo2dfmjzw7fbkul6iinvmouj7dwltjqy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p221.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p221.jpg.cid new file mode 100644 index 000000000000..114f155d52d7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p221.jpg.cid @@ -0,0 +1 @@ +bafkreidn5gi2d3m7y3wbmqbxp4tlxg4ul6ghwldlz5f5w6wziu5nwho7bm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p222.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p222.jpg.cid new file mode 100644 index 000000000000..96eeced3aca2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p222.jpg.cid @@ -0,0 +1 @@ +bafkreic66ce23sqhgjvomov4aotvjwcyxy7uzhpz2iidrr4heit7rl265a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p223.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p223.jpg.cid new file mode 100644 index 000000000000..b7042ea2a666 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p223.jpg.cid @@ -0,0 +1 @@ +bafkreifjpqrtwx3phn2gth3jryn6viqe5lyqhdgjr2plvelrhzexbzgdly diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p224.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p224.jpg.cid new file mode 100644 index 000000000000..589d81f77ee2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p224.jpg.cid @@ -0,0 +1 @@ +bafkreignkn5gstuvco4zoblat4jda7ottgcjybm46drzwjye7pojynbtje diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p225.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p225.jpg.cid new file mode 100644 index 000000000000..dabed8817662 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p225.jpg.cid @@ -0,0 +1 @@ +bafkreicyjzjjddvvdc6n2jbcu7wqc5vjshke5q6m374djwqf7lsjlctgly diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p226.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p226.jpg.cid new file mode 100644 index 000000000000..aa6851c94f02 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p226.jpg.cid @@ -0,0 +1 @@ +bafkreihoccxvk52mwyidhpslytrkebocc6iunjzp6qb7vz6u3zpg5mnef4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p227.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p227.jpg.cid new file mode 100644 index 000000000000..e71f33d4bade --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p227.jpg.cid @@ -0,0 +1 @@ +bafkreidhsnfap32pa46uwdo2wxmy5q6ov23wrbfreldwestk3cu63udv4y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p228.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p228.jpg.cid new file mode 100644 index 000000000000..5f2491890425 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p228.jpg.cid @@ -0,0 +1 @@ +bafkreicvb2llom3nob7sceozzjniv4pexdplrafexppj4br7loojrgicoy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p229.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p229.jpg.cid new file mode 100644 index 000000000000..487c99404b54 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p229.jpg.cid @@ -0,0 +1 @@ +bafkreicd7wcsml2kinzppz4oexwfwqhcwwqsxsaipiw6dhpszjcdtz7eiq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p230.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p230.jpg.cid new file mode 100644 index 000000000000..9697144af7a2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p230.jpg.cid @@ -0,0 +1 @@ +bafkreigrtv4abf6r7ed3znn6rllvalkktfalimbfizn6yk6c5acihl2ks4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p231.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p231.jpg.cid new file mode 100644 index 000000000000..409c64718b03 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p231.jpg.cid @@ -0,0 +1 @@ +bafkreicz6iin4nwl37k53vov2utypezgtvsf4unuo4ui2buc3gpynwucxy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p232.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p232.jpg.cid new file mode 100644 index 000000000000..e8b59da34897 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p232.jpg.cid @@ -0,0 +1 @@ +bafkreifin6b6tsncfqbvmywcysuwhswtj5iao23fgr5pdab62yf56t64ti diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p233.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p233.jpg.cid new file mode 100644 index 000000000000..83ba4333221a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p233.jpg.cid @@ -0,0 +1 @@ +bafkreiendlfogw2xnsoiaadh7d3pmaczfiic2c225gjdrb2ig3vb5yf24y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p234.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p234.jpg.cid new file mode 100644 index 000000000000..d73ad27da310 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p234.jpg.cid @@ -0,0 +1 @@ +bafkreif3ogmb7pcgmerfhrtxtlbmxa4rkzn2de57tg6sehcfjdx53mahhi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p235.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p235.jpg.cid new file mode 100644 index 000000000000..10662d033c4d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p235.jpg.cid @@ -0,0 +1 @@ +bafkreiggpbte2kiz3e3gxp4qitn5c6jrbeeyk4ekfd5ogld22lhn2usqq4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p236.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p236.jpg.cid new file mode 100644 index 000000000000..6d3f3d1150b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p236.jpg.cid @@ -0,0 +1 @@ +bafkreifau6ijq563rk36lzkk3cwihfmkqzifhje6macuscllne2jkepnaa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p237.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p237.jpg.cid new file mode 100644 index 000000000000..03608a06d0a6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p237.jpg.cid @@ -0,0 +1 @@ +bafkreiegxoocv73s2r72tkzt3samqmovkburpzxl5hsqldlorxhtukjshq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p238.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p238.jpg.cid new file mode 100644 index 000000000000..3e0920e202b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p238.jpg.cid @@ -0,0 +1 @@ +bafkreib6fmo2ipazx6vdxk6fc4eslo4o43ygcbhgula27c6xg4tixuvejq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p239.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p239.jpg.cid new file mode 100644 index 000000000000..149abb0a2113 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p239.jpg.cid @@ -0,0 +1 @@ +bafkreiey35x4ktwqmik2kytc2fwl3hmiwtx3w5wwfitzukv5gvd6tye474 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p240.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p240.jpg.cid new file mode 100644 index 000000000000..5e2c3f36cef2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p240.jpg.cid @@ -0,0 +1 @@ +bafkreic5u6yysa2ewa5psvi3rr4ncycvnbi5tnmidbr6u5v6pnou5pzb3e diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p241.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p241.jpg.cid new file mode 100644 index 000000000000..9698fff12f1a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p241.jpg.cid @@ -0,0 +1 @@ +bafkreiaujcpaottzy2rbwnpzo3k6cgqw6b3drpohblomcp73rfiyuywsl4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p242.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p242.jpg.cid new file mode 100644 index 000000000000..24f2bc2a14dc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p242.jpg.cid @@ -0,0 +1 @@ +bafkreiggwxfu6nranqrqzhh63a3nunbwla22tuw5cmax7lg5il2wbckvam diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p243.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p243.jpg.cid new file mode 100644 index 000000000000..62b3d11910e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p243.jpg.cid @@ -0,0 +1 @@ +bafkreihonvrw366mergogsk7vc2e7ncgfrdwxpkmr332gybdzmm7u25lce diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p244.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p244.jpg.cid new file mode 100644 index 000000000000..6de5336cd7a5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p244.jpg.cid @@ -0,0 +1 @@ +bafkreicoilcugxt4amhxe7atvf4kamlp2obp3zifqwzehbr6vpqenvlcti diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p245.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p245.jpg.cid new file mode 100644 index 000000000000..aa029fc50462 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p245.jpg.cid @@ -0,0 +1 @@ +bafkreihi2ynh5q6eukckpsbty6wmud2jov2sjxx324xoxn7jqmb65tepde diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p246.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p246.jpg.cid new file mode 100644 index 000000000000..d9b446b5f1d6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p246.jpg.cid @@ -0,0 +1 @@ +bafkreif5ybd3c5sgv4zjglce4skewf4x3vslmoqxkoqm2ctfxbif72bhpe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p247.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p247.jpg.cid new file mode 100644 index 000000000000..b26a40eb4c96 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p247.jpg.cid @@ -0,0 +1 @@ +bafkreidgykzbmgtua6fou54zz6gqmn6a6bavuurzkawwc656nxp4ug57eq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p248.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p248.jpg.cid new file mode 100644 index 000000000000..771f2d056d7c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p248.jpg.cid @@ -0,0 +1 @@ +bafkreiedtwziffbrrk5t2rkcbrd3vnkn6lu7g5hylzw7ptzxeton4stone diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p249.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p249.jpg.cid new file mode 100644 index 000000000000..2f76a24e607d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p249.jpg.cid @@ -0,0 +1 @@ +bafkreicbnzxdiujtu2wntatne6wlpu63zbto24xcd7bklhvxnyuk2izhs4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p250.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p250.jpg.cid new file mode 100644 index 000000000000..c9d8d1a80de8 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p250.jpg.cid @@ -0,0 +1 @@ +bafkreifhn7mvjkjykg42kpfei2ykab6zdktshl3os2tyrfd75drvoyy2rm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p251.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p251.jpg.cid new file mode 100644 index 000000000000..1b0684220eeb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p251.jpg.cid @@ -0,0 +1 @@ +bafkreigubphpebqpgrujgnvxjlokv2k4hxv37klkmyf7qjy4bxtspa7x6a diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p252.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p252.jpg.cid new file mode 100644 index 000000000000..38746ddc6782 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p252.jpg.cid @@ -0,0 +1 @@ +bafkreibvbhvvc7hsutg7zzdwnt56rz5kgvds7wlwx7vbli7ibxjrmgyfki diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p253.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p253.jpg.cid new file mode 100644 index 000000000000..c4722d8665a4 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p253.jpg.cid @@ -0,0 +1 @@ +bafkreievojvg3qvmrhglxzy65jcv5olduviyxr4wmb2ycjdeelobfd7jmq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p254.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p254.jpg.cid new file mode 100644 index 000000000000..7e1b02f65e80 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p254.jpg.cid @@ -0,0 +1 @@ +bafkreig3epkhoamzqj6tpavrpyilusylq7gjdrbrj4xpezorvafa7yxuq4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p255.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p255.jpg.cid new file mode 100644 index 000000000000..71a026acabb1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p255.jpg.cid @@ -0,0 +1 @@ +bafkreigjgsywh3x2dgt6ueahulqi4t74vss6rvfcpybpmj6r3aouqk2gja diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p256.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p256.jpg.cid new file mode 100644 index 000000000000..d40752370903 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p256.jpg.cid @@ -0,0 +1 @@ +bafkreihqw2gyhnlgw6bao2ngb3gqikpaydu36r3hvs2rrsy5e37qu5egqy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p257.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p257.jpg.cid new file mode 100644 index 000000000000..b737c98feec6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p257.jpg.cid @@ -0,0 +1 @@ +bafkreid3ipmugzicquzsdk33ahhzckj7streugl3chuwlbfy6mqo53g6d4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p258.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p258.jpg.cid new file mode 100644 index 000000000000..69e0ce51e143 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p258.jpg.cid @@ -0,0 +1 @@ +bafkreidmenhtc66wm4e2veqe23vnjx45l2cnopnpxeofrq2esfui3egm6q diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p259.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p259.jpg.cid new file mode 100644 index 000000000000..b9a97baae589 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p259.jpg.cid @@ -0,0 +1 @@ +bafkreidkajo26izsfp74xaygioewn4rmv6aaof3ibsd52jeff723pxwawm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p260.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p260.jpg.cid new file mode 100644 index 000000000000..85cabe0b1dcf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p260.jpg.cid @@ -0,0 +1 @@ +bafkreiayoswtitw4l2vra74vrwy65riqq7pnhkgqzbtljwyq6aqtgqatja diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p261.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p261.jpg.cid new file mode 100644 index 000000000000..578bc8238f8b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p261.jpg.cid @@ -0,0 +1 @@ +bafkreifdoira6n52xjlowbefvywbbnu6tldzl2nqgrqqgurqtkrll3neii diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p262.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p262.jpg.cid new file mode 100644 index 000000000000..3f369f60fb9c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p262.jpg.cid @@ -0,0 +1 @@ +bafkreicon7s3icz43kegyrgoxmobxw55kwa7uqu5hzmjklviix32epj4qy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p263.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p263.jpg.cid new file mode 100644 index 000000000000..08d39a89c056 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p263.jpg.cid @@ -0,0 +1 @@ +bafkreiaksej5vgapaibxp2be3dmuohctzprgfqc55wpjfobd4jvyzm3tta diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p264.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p264.jpg.cid new file mode 100644 index 000000000000..dadb37634c1f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p264.jpg.cid @@ -0,0 +1 @@ +bafkreibj5u7w63ebggqnzgbw3vbj7xfyyl5xafinmhkwcp6j2upmauqcuq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p265.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p265.jpg.cid new file mode 100644 index 000000000000..3c2797b4fab6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p265.jpg.cid @@ -0,0 +1 @@ +bafkreih2ios4gxpohshqourmd4etq4t7mkpjgoay3jbhuxmascpvizewka diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p266.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p266.jpg.cid new file mode 100644 index 000000000000..cd9effa531fa --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p266.jpg.cid @@ -0,0 +1 @@ +bafkreicd3n5d4bg2uej3bpy4kjpqrq5dr3fi6gdcw3tbc5opsyy6iexcxi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p267.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p267.jpg.cid new file mode 100644 index 000000000000..8d6addcbe258 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p267.jpg.cid @@ -0,0 +1 @@ +bafkreihsec5eo7apm53p2h4sx36d3xscth22w77z4wwk7zkpfbrsw6mqx4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p268.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p268.jpg.cid new file mode 100644 index 000000000000..57546b20d387 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p268.jpg.cid @@ -0,0 +1 @@ +bafkreihi6srj7abram3ssgko7nangdrqcrdd2bpco6utofpyvu2nt7hp2q diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p269.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p269.jpg.cid new file mode 100644 index 000000000000..37f53ca90cd7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p269.jpg.cid @@ -0,0 +1 @@ +bafkreie6rdowcpuvuytfky6i7qvlv4agxm2ubbf3rvefn2fo3vqv5u6yxe diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p270.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p270.jpg.cid new file mode 100644 index 000000000000..2fe4acb886c2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p270.jpg.cid @@ -0,0 +1 @@ +bafkreihsbzocklzbrqlzalmndcvti3qek2pslkeje4ac7awtuuw55xvvva diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p271.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p271.jpg.cid new file mode 100644 index 000000000000..c0b5703e5e9f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p271.jpg.cid @@ -0,0 +1 @@ +bafkreibmimgn2hrmtmxhsn4jfmz3riss4ju5ytxofo3b4ntfdz35pyikv4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p272.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p272.jpg.cid new file mode 100644 index 000000000000..6a9f6f6dbe44 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p272.jpg.cid @@ -0,0 +1 @@ +bafkreia3pjdp7img6livz4vyctkw4b2rbnulon23hnch3jtg3aa4plianm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p273.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p273.jpg.cid new file mode 100644 index 000000000000..ea884fc58d94 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p273.jpg.cid @@ -0,0 +1 @@ +bafkreidi2imyj2fzg5kls7oiuuu3bvfsv32ivyxasq7vmp7b6ubmczdaki diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p274.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p274.jpg.cid new file mode 100644 index 000000000000..ea1ac6ddff4f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p274.jpg.cid @@ -0,0 +1 @@ +bafkreibk2qyatqhwgs4xueaxtwndxwinkm3mzo4ax4hqwun4czrcq5rwi4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p275.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p275.jpg.cid new file mode 100644 index 000000000000..f0b8689b8b51 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p275.jpg.cid @@ -0,0 +1 @@ +bafkreier7cztnqcbbozxydt2hznqts2p4jgoptpqzcimyton3dm6i7jc3u diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p276.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p276.jpg.cid new file mode 100644 index 000000000000..03e2186be06e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p276.jpg.cid @@ -0,0 +1 @@ +bafkreibhsnbowo4dlul7zx56pfovymve2udcuxesjixac4mvd3bo3epxhi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p277.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p277.jpg.cid new file mode 100644 index 000000000000..82cf9387dd8b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p277.jpg.cid @@ -0,0 +1 @@ +bafkreib3lgmb7hj5jldqzfhhl2evqozu7tziym63y3w4rwkfzsrxjbptya diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p278.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p278.jpg.cid new file mode 100644 index 000000000000..25fc7077d8b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p278.jpg.cid @@ -0,0 +1 @@ +bafkreigh5jomzqei6zvmabyf5oycvlqio3gaq4ctf6od7i5jxdgmivlmqu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p279.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p279.jpg.cid new file mode 100644 index 000000000000..e7b506d79f32 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p279.jpg.cid @@ -0,0 +1 @@ +bafkreifjqblit6clxp2r6ejkuzvi5srdgwqcu5mqsjxq3dhntevfzj23oy diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p280.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p280.jpg.cid new file mode 100644 index 000000000000..c5c24317b076 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p280.jpg.cid @@ -0,0 +1 @@ +bafkreia2dw47rumodvvjrhowspskonhfbe5jiff2hcjv2a3j366xdsj5bu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p281.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p281.jpg.cid new file mode 100644 index 000000000000..194592c4bca9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p281.jpg.cid @@ -0,0 +1 @@ +bafkreieg5g7ftjj2b7geweurakmn6pfdhqcqccqcwwg6dctsf3wtqipy7u diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p282.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p282.jpg.cid new file mode 100644 index 000000000000..cc30e013957f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p282.jpg.cid @@ -0,0 +1 @@ +bafkreigxsuxamlzjfi7g2fotpblgyibka54sl35voxgcci4kddw4qcauua diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p283.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p283.jpg.cid new file mode 100644 index 000000000000..fd27a1f9a919 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p283.jpg.cid @@ -0,0 +1 @@ +bafkreich4266o526dji25mmvkmvy3meudgurh7yra2zkv6e2uzolg7pe2y diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p284.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p284.jpg.cid new file mode 100644 index 000000000000..fdd867a60556 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p284.jpg.cid @@ -0,0 +1 @@ +bafkreifcirxutbd6rd66geg7g6rd7yccutjxnwpokzjdylnvbviazesfaq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p285.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p285.jpg.cid new file mode 100644 index 000000000000..ac66175a467d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p285.jpg.cid @@ -0,0 +1 @@ +bafkreigb3dmxrritkxvpzw6qinrz4z23ofx7b4hnhipvjt7hryzuvpf2x4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p286.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p286.jpg.cid new file mode 100644 index 000000000000..9ef943402cb7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p286.jpg.cid @@ -0,0 +1 @@ +bafkreih2oqxlks44tdkaabw75rfwuld27tqcqrrdhdu6ga6wkscs5ooioi diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p287.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p287.jpg.cid new file mode 100644 index 000000000000..2fc574714cfc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p287.jpg.cid @@ -0,0 +1 @@ +bafkreihyfxsluf5rhpj5fgieihpvd6zarabccudfmqaermvmeer7e6ira4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p288.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p288.jpg.cid new file mode 100644 index 000000000000..05bc1edfc33e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p288.jpg.cid @@ -0,0 +1 @@ +bafkreihaxgborztgigxgwk4hv54k5iffv3mzmlczx4kpegjyk2nvroiuqa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p289.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p289.jpg.cid new file mode 100644 index 000000000000..9a8a099da7e5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p289.jpg.cid @@ -0,0 +1 @@ +bafkreihhrgckzxh6rkooad3zw3bdbuei7asxlslirag4dphrxngffajokm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p290.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p290.jpg.cid new file mode 100644 index 000000000000..ee2c8bd40482 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p290.jpg.cid @@ -0,0 +1 @@ +bafkreiac4rff3gx427atdr3fgp7wbi7ebdlrviqtkm4yh6jl45jxcplrae diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p291.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p291.jpg.cid new file mode 100644 index 000000000000..89ca773f174b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p291.jpg.cid @@ -0,0 +1 @@ +bafkreigb3ctf4owxc4hiuvoub4zmno3xah6gn3cscdcwdxzawjwlsz2xcq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p292.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p292.jpg.cid new file mode 100644 index 000000000000..84b0868849bb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p292.jpg.cid @@ -0,0 +1 @@ +bafkreigfxnfxlkh4nkueawk2efhvespi7tmhcoh3tfwom3mrb7l7eff6bu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p293.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p293.jpg.cid new file mode 100644 index 000000000000..c7ef9c4647aa --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p293.jpg.cid @@ -0,0 +1 @@ +bafkreifozx7u5etkoozzkhm6f6xtakrk5zlliscqav5dp6ftwvije7juqa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p294.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p294.jpg.cid new file mode 100644 index 000000000000..8852c0a50e6d --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p294.jpg.cid @@ -0,0 +1 @@ +bafkreice2gzuvpehhqem3kwxser4l7p3plukcm2ojdbveaj2zkp76rsvqm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p295.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p295.jpg.cid new file mode 100644 index 000000000000..48c5f6228bbc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p295.jpg.cid @@ -0,0 +1 @@ +bafkreidtlahe7myzifb5pxbvy6vl5zfiunrqocsntbywdcr4i4mkzljlm4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p296.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p296.jpg.cid new file mode 100644 index 000000000000..80763bc72bfc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p296.jpg.cid @@ -0,0 +1 @@ +bafkreigj67h4iifsfuifjxrvno7iqcvtaqbbhebfa6o6anfuhgcu2lexkq diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p297.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p297.jpg.cid new file mode 100644 index 000000000000..50dfe8fd57e7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p297.jpg.cid @@ -0,0 +1 @@ +bafkreidbgxwzfrc53q75ouqlp5gw4a7m4as4pzbt35klmhqwezzcezqro4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p298.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p298.jpg.cid new file mode 100644 index 000000000000..1f16c17532fd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p298.jpg.cid @@ -0,0 +1 @@ +bafkreiaxkhhq7fdm5sp7p3e4ntyllgn75wu27mizndmk4u2x75oz3ua6je diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p299.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p299.jpg.cid new file mode 100644 index 000000000000..7395f65d7c17 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p299.jpg.cid @@ -0,0 +1 @@ +bafkreihlqxjj4iu363vhulhxcnkxp7kffihwhty3yn7hyotfmgzn7ceuk4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p300.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p300.jpg.cid new file mode 100644 index 000000000000..98f814f0e110 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p300.jpg.cid @@ -0,0 +1 @@ +bafkreieqgqpn6alju6pgdrfgi3ld67gzwpzrmtgqhorxa5yivzdyrfhnhu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p301.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p301.jpg.cid new file mode 100644 index 000000000000..87258b00607e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p301.jpg.cid @@ -0,0 +1 @@ +bafkreifxpp35u5yxmqobs6ra2b73ov267hi74cxmn4wfdi7bcbzysjhhbu diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p302.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p302.jpg.cid new file mode 100644 index 000000000000..5ab9684c3d22 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p302.jpg.cid @@ -0,0 +1 @@ +bafkreibts352wtwgllsqbr3abhfstejqoeahdrqq3gasisiyw26poiipei diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p303.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p303.jpg.cid new file mode 100644 index 000000000000..77c5a5f68b24 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p303.jpg.cid @@ -0,0 +1 @@ +bafkreigyupykcpcohemk3duozye2rj2c6f6bvbbs33dcsndtq5izymvnr4 diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p304.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p304.jpg.cid new file mode 100644 index 000000000000..31d52c19f52f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p304.jpg.cid @@ -0,0 +1 @@ +bafkreieh4cdckmaxgsbgddnc3jbt62ebsehpcx7br2bkr5jawsmf6mu4qa diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p305.jpg.cid b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p305.jpg.cid new file mode 100644 index 000000000000..5685709283dc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/S200-6-320x_p305.jpg.cid @@ -0,0 +1 @@ +bafkreigcpqnz2w2wp74kwqofgftox5zryq3oidfiwarksblezuiiulvuau diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt new file mode 100644 index 000000000000..36f6c05037b0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt @@ -0,0 +1,310 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +S200-6-320x_p000.jpg; ; (0.0, 0.0) +S200-6-320x_p001.jpg; ; (2300.661644147095, -7.16448146089453) +S200-6-320x_p002.jpg; ; (4604.855728314656, -14.777632179616417) +S200-6-320x_p003.jpg; ; (6907.906969700763, -22.64465424949014) +S200-6-320x_p004.jpg; ; (9209.9108146131, -29.646499467054973) +S200-6-320x_p005.jpg; ; (11516.849728413017, -37.614594279123594) +S200-6-320x_p006.jpg; ; (13819.299101853909, -44.83421263845483) +S200-6-320x_p007.jpg; ; (16122.11787143637, -52.35463574077867) +S200-6-320x_p008.jpg; ; (18425.204852591545, -60.03893125857722) +S200-6-320x_p009.jpg; ; (20730.356204323132, -67.43850814065128) +S200-6-320x_p010.jpg; ; (23034.990645679438, -75.11598764466547) +S200-6-320x_p011.jpg; ; (25338.561255483335, -82.89974698351486) +S200-6-320x_p012.jpg; ; (27641.14650719408, -90.45360537938278) +S200-6-320x_p013.jpg; ; (29945.844731403948, -97.78203643669826) +S200-6-320x_p014.jpg; ; (32250.519410294808, -105.29303008912268) +S200-6-320x_p015.jpg; ; (34555.5806644165, -112.6649200282827) +S200-6-320x_p016.jpg; ; (36857.311060630076, -120.14733496028555) +S200-6-320x_p017.jpg; ; (39159.65556760841, -127.40392953057822) +S200-6-320x_p018.jpg; ; (41467.80960541727, -134.5781722064355) +S200-6-320x_p019.jpg; ; (43768.84216285282, -141.52646200939222) +S200-6-320x_p020.jpg; ; (46073.98161541748, -149.84416482307697) +S200-6-320x_p021.jpg; ; (48376.450268187094, -157.22056081413066) +S200-6-320x_p022.jpg; ; (50678.46559970492, -163.89420041151945) +S200-6-320x_p023.jpg; ; (52984.972040987566, -172.02145237517666) +S200-6-320x_p024.jpg; ; (55285.52830552226, -178.5228009890881) +S200-6-320x_p025.jpg; ; (57590.13522503405, -186.52550026546731) +S200-6-320x_p026.jpg; ; (59892.50455946747, -193.69971410294875) +S200-6-320x_p027.jpg; ; (62196.05091611978, -200.6939264689966) +S200-6-320x_p028.jpg; ; (64499.97369243255, -208.32354485779194) +S200-6-320x_p029.jpg; ; (66802.28103189665, -215.52511538113893) +S200-6-320x_p030.jpg; ; (69104.92405754804, -222.86502228911118) +S200-6-320x_p031.jpg; ; (71406.75196337423, -229.96526716462515) +S200-6-320x_p032.jpg; ; (73708.61069734252, -236.61732819262141) +S200-6-320x_p033.jpg; ; (76015.51503497007, -244.23219150734852) +S200-6-320x_p034.jpg; ; (5.2288469628174425, 1727.7727456811667) +S200-6-320x_p035.jpg; ; (2306.3952188376547, 1721.0400569753438) +S200-6-320x_p036.jpg; ; (4611.208075312715, 1713.3194935888118) +S200-6-320x_p037.jpg; ; (6913.600962649761, 1705.4758679721056) +S200-6-320x_p038.jpg; ; (9215.67391342054, 1698.3781237807107) +S200-6-320x_p039.jpg; ; (11521.97815576229, 1690.338490344202) +S200-6-320x_p040.jpg; ; (13826.042785248701, 1682.8966560630902) +S200-6-320x_p041.jpg; ; (16128.741163813671, 1675.4204354263197) +S200-6-320x_p042.jpg; ; (18432.17000973068, 1667.4203071952818) +S200-6-320x_p043.jpg; ; (20736.53127165773, 1660.1198503225082) +S200-6-320x_p044.jpg; ; (23042.083836514063, 1652.399576501783) +S200-6-320x_p045.jpg; ; (25344.94390291917, 1644.7445233392166) +S200-6-320x_p046.jpg; ; (27648.7254032198, 1637.2647675719738) +S200-6-320x_p047.jpg; ; (29952.57045427808, 1629.732250102611) +S200-6-320x_p048.jpg; ; (32257.291312759568, 1622.342884525887) +S200-6-320x_p049.jpg; ; (34561.25805985458, 1615.08472235641) +S200-6-320x_p050.jpg; ; (36863.77825598487, 1607.4527668123706) +S200-6-320x_p051.jpg; ; (39165.75017572608, 1599.9715177111166) +S200-6-320x_p052.jpg; ; (41474.368126444584, 1592.5619630438846) +S200-6-320x_p053.jpg; ; (43774.81599987766, 1585.6700719505498) +S200-6-320x_p054.jpg; ; (46080.3003306949, 1577.5181038915903) +S200-6-320x_p055.jpg; ; (48382.774758749845, 1569.9810307143152) +S200-6-320x_p056.jpg; ; (50684.856342208805, 1563.0582285724763) +S200-6-320x_p057.jpg; ; (52991.10946129857, 1555.1351288769627) +S200-6-320x_p058.jpg; ; (55291.91741013008, 1548.5525546649474) +S200-6-320x_p059.jpg; ; (57596.4939247274, 1540.4798898815345) +S200-6-320x_p060.jpg; ; (59899.23157162501, 1533.1143957502852) +S200-6-320x_p061.jpg; ; (62202.19075639241, 1526.1141004988576) +S200-6-320x_p062.jpg; ; (64505.08608801294, 1518.6994506187657) +S200-6-320x_p063.jpg; ; (66807.97192866214, 1511.4310319540032) +S200-6-320x_p064.jpg; ; (69110.60654934423, 1503.9888634837646) +S200-6-320x_p065.jpg; ; (71413.53949507729, 1496.7356200555373) +S200-6-320x_p066.jpg; ; (73714.14605501074, 1489.8522478764276) +S200-6-320x_p067.jpg; ; (76021.56522348168, 1482.3639671348014) +S200-6-320x_p068.jpg; ; (10.460535524727845, 3468.8303618743093) +S200-6-320x_p069.jpg; ; (2313.0544305343656, 3461.67782985118) +S200-6-320x_p070.jpg; ; (4616.779774043703, 3453.8082314403086) +S200-6-320x_p071.jpg; ; (6920.128951978659, 3446.061635644789) +S200-6-320x_p072.jpg; ; (9221.93027791407, 3438.834928565298) +S200-6-320x_p073.jpg; ; (11527.777968364198, 3430.8411567052067) +S200-6-320x_p074.jpg; ; (13831.046972487082, 3423.5030719014126) +S200-6-320x_p075.jpg; ; (16133.53035443017, 3415.9682259572887) +S200-6-320x_p076.jpg; ; (18437.754021123008, 3407.9904557820237) +S200-6-320x_p077.jpg; ; (20741.82897779481, 3400.710065445326) +S200-6-320x_p078.jpg; ; (23046.613753231457, 3393.222298316501) +S200-6-320x_p079.jpg; ; (25350.502765868285, 3385.473385721786) +S200-6-320x_p080.jpg; ; (27654.236970015198, 3377.9728207399653) +S200-6-320x_p081.jpg; ; (29957.603785670934, 3370.5556144119028) +S200-6-320x_p082.jpg; ; (32261.78461217314, 3363.1548193882704) +S200-6-320x_p083.jpg; ; (34566.795222932196, 3355.80245358308) +S200-6-320x_p084.jpg; ; (36869.21892296957, 3348.2170339570625) +S200-6-320x_p085.jpg; ; (39171.12292388341, 3340.7582066562113) +S200-6-320x_p086.jpg; ; (41480.407712653265, 3333.28529085055) +S200-6-320x_p087.jpg; ; (43780.63191455181, 3326.3365825621813) +S200-6-320x_p088.jpg; ; (46086.281728926406, 3318.0560433772757) +S200-6-320x_p089.jpg; ; (48388.70240730579, 3310.507649505827) +S200-6-320x_p090.jpg; ; (50691.041966351906, 3303.592852997012) +S200-6-320x_p091.jpg; ; (52996.883913854675, 3295.6762051619176) +S200-6-320x_p092.jpg; ; (55297.291865353225, 3289.130829888939) +S200-6-320x_p093.jpg; ; (57602.226248244515, 3281.125840463573) +S200-6-320x_p094.jpg; ; (59904.22337754412, 3273.7560935334577) +S200-6-320x_p095.jpg; ; (62208.07464136214, 3266.4924992072333) +S200-6-320x_p096.jpg; ; (64511.66563550212, 3258.940888655825) +S200-6-320x_p097.jpg; ; (66814.12794604528, 3251.6935754793676) +S200-6-320x_p098.jpg; ; (69116.41503741559, 3244.31876390821) +S200-6-320x_p099.jpg; ; (71419.00851588049, 3237.028546560436) +S200-6-320x_p100.jpg; ; (73719.59344682723, 3230.0636061816485) +S200-6-320x_p101.jpg; ; (76026.26763317594, 3222.8777437995777) +S200-6-320x_p102.jpg; ; (15.794878283836795, 5185.561956964068) +S200-6-320x_p103.jpg; ; (2318.341472964959, 5178.291847810984) +S200-6-320x_p104.jpg; ; (4622.092569872134, 5170.516866003391) +S200-6-320x_p105.jpg; ; (6924.839238127906, 5162.594108857823) +S200-6-320x_p106.jpg; ; (9227.10284292383, 5155.418585536424) +S200-6-320x_p107.jpg; ; (11532.34846821842, 5147.433696742797) +S200-6-320x_p108.jpg; ; (13835.813151608438, 5139.957121237411) +S200-6-320x_p109.jpg; ; (16139.367292396264, 5132.491631062261) +S200-6-320x_p110.jpg; ; (18443.333364351693, 5124.736957380838) +S200-6-320x_p111.jpg; ; (20747.368797552495, 5117.522540173256) +S200-6-320x_p112.jpg; ; (23051.91467675711, 5110.0046892274195) +S200-6-320x_p113.jpg; ; (25355.776367815877, 5102.245781533109) +S200-6-320x_p114.jpg; ; (27659.578141590755, 5094.662587785684) +S200-6-320x_p115.jpg; ; (29964.026342117264, 5087.176966995529) +S200-6-320x_p116.jpg; ; (32268.194302393855, 5079.818075282716) +S200-6-320x_p117.jpg; ; (34572.73274177622, 5072.345182829841) +S200-6-320x_p118.jpg; ; (36875.332915259314, 5064.868364086731) +S200-6-320x_p119.jpg; ; (39177.05350762033, 5057.34487676978) +S200-6-320x_p120.jpg; ; (41485.19528415606, 5049.883375191431) +S200-6-320x_p121.jpg; ; (43786.24935300824, 5043.0568055877175) +S200-6-320x_p122.jpg; ; (46090.72394257416, 5034.832083102581) +S200-6-320x_p123.jpg; ; (48393.048387130315, 5027.3345945237215) +S200-6-320x_p124.jpg; ; (50696.00923502473, 5020.39295284692) +S200-6-320x_p125.jpg; ; (53002.194909026955, 5012.381487307282) +S200-6-320x_p126.jpg; ; (55302.53780951571, 5005.723306214489) +S200-6-320x_p127.jpg; ; (57607.21540985647, 4997.665922306148) +S200-6-320x_p128.jpg; ; (59909.93480216022, 4990.380276646942) +S200-6-320x_p129.jpg; ; (62213.90419422096, 4983.13530448585) +S200-6-320x_p130.jpg; ; (64517.40948830575, 4975.542353931584) +S200-6-320x_p131.jpg; ; (66819.86573859866, 4968.424347946407) +S200-6-320x_p132.jpg; ; (69122.24926367024, 4961.005195479628) +S200-6-320x_p133.jpg; ; (71424.61498095246, 4953.603778679236) +S200-6-320x_p134.jpg; ; (73725.48742972637, 4946.772150594285) +S200-6-320x_p135.jpg; ; (76032.05436600152, 4939.386609122076) +S200-6-320x_p136.jpg; ; (21.88013525920303, 6906.156146946384) +S200-6-320x_p137.jpg; ; (2324.0643389882753, 6898.712262793728) +S200-6-320x_p138.jpg; ; (4628.108629962786, 6890.858520843378) +S200-6-320x_p139.jpg; ; (6930.762879175249, 6883.056784297498) +S200-6-320x_p140.jpg; ; (9233.176031116789, 6875.907861747249) +S200-6-320x_p141.jpg; ; (11539.035924755834, 6867.9640085819565) +S200-6-320x_p142.jpg; ; (13841.96728762241, 6860.671991263363) +S200-6-320x_p143.jpg; ; (16145.183986056429, 6853.115638584842) +S200-6-320x_p144.jpg; ; (18448.995123108307, 6845.290524536635) +S200-6-320x_p145.jpg; ; (20753.67816778456, 6838.086471822784) +S200-6-320x_p146.jpg; ; (23058.517447848215, 6830.573625990204) +S200-6-320x_p147.jpg; ; (25361.62487219055, 6822.674860254803) +S200-6-320x_p148.jpg; ; (27664.718431380705, 6815.217698285848) +S200-6-320x_p149.jpg; ; (29969.496346102896, 6807.736986832553) +S200-6-320x_p150.jpg; ; (32273.36537889343, 6800.415925794374) +S200-6-320x_p151.jpg; ; (34578.121800309505, 6793.085347703422) +S200-6-320x_p152.jpg; ; (36880.65421091973, 6785.532474111564) +S200-6-320x_p153.jpg; ; (39182.924344297164, 6777.988850677215) +S200-6-320x_p154.jpg; ; (41491.94689935844, 6770.657222181192) +S200-6-320x_p155.jpg; ; (43792.55887558053, 6763.852822497487) +S200-6-320x_p156.jpg; ; (46097.39669516574, 6755.568188331224) +S200-6-320x_p157.jpg; ; (48399.95824642657, 6748.249715878446) +S200-6-320x_p158.jpg; ; (50702.8063110551, 6741.304724190095) +S200-6-320x_p159.jpg; ; (53008.49041142906, 6733.2689792597275) +S200-6-320x_p160.jpg; ; (55308.71404840793, 6726.67531983116) +S200-6-320x_p161.jpg; ; (57613.43133687435, 6718.674093561488) +S200-6-320x_p162.jpg; ; (59916.08241940394, 6711.385260428505) +S200-6-320x_p163.jpg; ; (62220.07294810023, 6704.241666835534) +S200-6-320x_p164.jpg; ; (64523.76292774937, 6696.606963237938) +S200-6-320x_p165.jpg; ; (66826.07785834589, 6689.23282422925) +S200-6-320x_p166.jpg; ; (69127.80266429603, 6681.93723418704) +S200-6-320x_p167.jpg; ; (71430.752011428, 6674.467402665134) +S200-6-320x_p168.jpg; ; (73732.09323135865, 6667.461356547878) +S200-6-320x_p169.jpg; ; (76039.4906927325, 6660.432061584388) +S200-6-320x_p170.jpg; ; (28.980405509883724, 8623.824874218615) +S200-6-320x_p171.jpg; ; (2330.454005621121, 8616.726424944918) +S200-6-320x_p172.jpg; ; (4634.699511365804, 8608.982055025519) +S200-6-320x_p173.jpg; ; (6937.752286877875, 8601.19215795301) +S200-6-320x_p174.jpg; ; (9239.797973028542, 8593.95923667765) +S200-6-320x_p175.jpg; ; (11545.606765724591, 8586.046594861844) +S200-6-320x_p176.jpg; ; (13848.097989105461, 8578.811678182614) +S200-6-320x_p177.jpg; ; (16151.615542346075, 8571.194295074807) +S200-6-320x_p178.jpg; ; (18455.120637581804, 8563.280603549978) +S200-6-320x_p179.jpg; ; (20760.238499813528, 8556.28189320792) +S200-6-320x_p180.jpg; ; (23064.1891610767, 8548.86006148991) +S200-6-320x_p181.jpg; ; (25368.014674437985, 8541.167122493052) +S200-6-320x_p182.jpg; ; (27670.527327221203, 8533.752614744453) +S200-6-320x_p183.jpg; ; (29975.70639690546, 8526.415095977181) +S200-6-320x_p184.jpg; ; (32280.028937587147, 8519.019340763645) +S200-6-320x_p185.jpg; ; (34584.729552544064, 8511.704466711213) +S200-6-320x_p186.jpg; ; (36887.40561522771, 8504.19679797886) +S200-6-320x_p187.jpg; ; (39189.420861321996, 8496.732869971815) +S200-6-320x_p188.jpg; ; (41497.50639518276, 8489.384924261703) +S200-6-320x_p189.jpg; ; (43798.99633111012, 8482.547381905784) +S200-6-320x_p190.jpg; ; (46103.519850318466, 8474.413367708186) +S200-6-320x_p191.jpg; ; (48405.40452416137, 8467.18941896801) +S200-6-320x_p192.jpg; ; (50708.978265733356, 8460.29978071887) +S200-6-320x_p193.jpg; ; (53014.62438277154, 8452.416311627656) +S200-6-320x_p194.jpg; ; (55315.60296892612, 8445.937621969837) +S200-6-320x_p195.jpg; ; (57620.00069271488, 8438.033649961986) +S200-6-320x_p196.jpg; ; (59922.39182625906, 8430.539115755259) +S200-6-320x_p197.jpg; ; (62225.896360513536, 8423.380343101217) +S200-6-320x_p198.jpg; ; (64529.945850387885, 8415.782356787318) +S200-6-320x_p199.jpg; ; (66831.65552690093, 8408.610021337328) +S200-6-320x_p200.jpg; ; (69134.49879503732, 8401.107757511785) +S200-6-320x_p201.jpg; ; (71437.16281064242, 8393.816651590241) +S200-6-320x_p202.jpg; ; (73738.68081544762, 8386.860996250298) +S200-6-320x_p203.jpg; ; (76042.60315421551, 8379.371511638052) +S200-6-320x_p204.jpg; ; (34.71559785600641, 10349.165228769474) +S200-6-320x_p205.jpg; ; (2337.4400308760078, 10342.051821615256) +S200-6-320x_p206.jpg; ; (4640.542259630197, 10334.327047320076) +S200-6-320x_p207.jpg; ; (6943.592309625983, 10326.562931318713) +S200-6-320x_p208.jpg; ; (9245.379887872605, 10319.408119564485) +S200-6-320x_p209.jpg; ; (11551.064224990088, 10311.499141777935) +S200-6-320x_p210.jpg; ; (13854.481187394376, 10304.197728241543) +S200-6-320x_p211.jpg; ; (16157.235760243426, 10296.779431313278) +S200-6-320x_p212.jpg; ; (18460.80266980765, 10288.907256182501) +S200-6-320x_p213.jpg; ; (20765.58210881186, 10281.78105980343) +S200-6-320x_p214.jpg; ; (23070.565778053722, 10274.367176273676) +S200-6-320x_p215.jpg; ; (25374.56176150775, 10266.602106575667) +S200-6-320x_p216.jpg; ; (27676.739124261374, 10259.230115105805) +S200-6-320x_p217.jpg; ; (29981.555704538783, 10251.768343494467) +S200-6-320x_p218.jpg; ; (32285.796834636596, 10244.479398743475) +S200-6-320x_p219.jpg; ; (34589.91104601213, 10237.161622699432) +S200-6-320x_p220.jpg; ; (36893.17041220007, 10229.604482950377) +S200-6-320x_p221.jpg; ; (39195.075719182285, 10222.170146352024) +S200-6-320x_p222.jpg; ; (41503.28948928965, 10214.556076301818) +S200-6-320x_p223.jpg; ; (43804.11816438989, 10207.791684740248) +S200-6-320x_p224.jpg; ; (46109.233940446684, 10199.681359484284) +S200-6-320x_p225.jpg; ; (48411.8963088267, 10192.532292402844) +S200-6-320x_p226.jpg; ; (50714.980909576196, 10185.484539019553) +S200-6-320x_p227.jpg; ; (53021.129466611674, 10177.401854695036) +S200-6-320x_p228.jpg; ; (55321.23163596168, 10170.860103410369) +S200-6-320x_p229.jpg; ; (57625.82455820479, 10162.973695505325) +S200-6-320x_p230.jpg; ; (59928.43479379948, 10155.637330339112) +S200-6-320x_p231.jpg; ; (62231.87513584472, 10148.341993095328) +S200-6-320x_p232.jpg; ; (64535.69219323375, 10140.724980540654) +S200-6-320x_p233.jpg; ; (66838.53337254663, 10133.790794156605) +S200-6-320x_p234.jpg; ; (69139.78925898173, 10126.004452482892) +S200-6-320x_p235.jpg; ; (71442.85671551437, 10118.82612873267) +S200-6-320x_p236.jpg; ; (73743.8129644853, 10111.902914316617) +S200-6-320x_p237.jpg; ; (76048.9407261672, 10104.428611869407) +S200-6-320x_p238.jpg; ; (41.71484791187112, 12093.574212910973) +S200-6-320x_p239.jpg; ; (2343.8311049273293, 12086.13225300936) +S200-6-320x_p240.jpg; ; (4647.741344485128, 12078.522642360078) +S200-6-320x_p241.jpg; ; (6949.964142440144, 12070.787803263469) +S200-6-320x_p242.jpg; ; (9252.83743932809, 12063.605546942588) +S200-6-320x_p243.jpg; ; (11558.043233619528, 12055.637881651766) +S200-6-320x_p244.jpg; ; (13860.498822504043, 12048.492894073954) +S200-6-320x_p245.jpg; ; (16164.477645809244, 12040.920933192861) +S200-6-320x_p246.jpg; ; (18467.817780854843, 12033.073793134226) +S200-6-320x_p247.jpg; ; (20772.853019968312, 12026.009913840731) +S200-6-320x_p248.jpg; ; (23077.150132629118, 12018.235569315295) +S200-6-320x_p249.jpg; ; (25380.79476000068, 12010.761810911958) +S200-6-320x_p250.jpg; ; (27683.198975466275, 12003.249988520436) +S200-6-320x_p251.jpg; ; (29987.990602946757, 11995.861049770961) +S200-6-320x_p252.jpg; ; (32292.353386188726, 11988.518105920566) +S200-6-320x_p253.jpg; ; (34596.203291633115, 11981.159840717304) +S200-6-320x_p254.jpg; ; (36898.89531791035, 11973.575661347137) +S200-6-320x_p255.jpg; ; (39200.57156144762, 11966.14172583585) +S200-6-320x_p256.jpg; ; (41509.41829097049, 11958.444370444255) +S200-6-320x_p257.jpg; ; (43810.0943034609, 11951.644264800158) +S200-6-320x_p258.jpg; ; (46115.26356953678, 11943.595376958521) +S200-6-320x_p259.jpg; ; (48417.91121839849, 11936.061969174169) +S200-6-320x_p260.jpg; ; (50720.432140482815, 11928.946361976657) +S200-6-320x_p261.jpg; ; (53026.77684394447, 11920.892011697988) +S200-6-320x_p262.jpg; ; (55327.786577959174, 11914.312889163251) +S200-6-320x_p263.jpg; ; (57632.15097506203, 11906.316182611485) +S200-6-320x_p264.jpg; ; (59934.26975521445, 11898.993852561405) +S200-6-320x_p265.jpg; ; (62238.23320742724, 11891.529394674171) +S200-6-320x_p266.jpg; ; (64542.14768955634, 11884.034280932965) +S200-6-320x_p267.jpg; ; (66843.68803987355, 11876.76317318756) +S200-6-320x_p268.jpg; ; (69145.89092426393, 11869.445013822535) +S200-6-320x_p269.jpg; ; (71448.67386613548, 11862.020859857608) +S200-6-320x_p270.jpg; ; (73749.83640219901, 11854.961504633226) +S200-6-320x_p271.jpg; ; (76055.13181112522, 11847.438991367018) +S200-6-320x_p272.jpg; ; (46.61614535247065, 13816.756819456445) +S200-6-320x_p273.jpg; ; (2348.8350439566607, 13809.339056965326) +S200-6-320x_p274.jpg; ; (4653.370000503085, 13801.495840155787) +S200-6-320x_p275.jpg; ; (6955.684905481439, 13793.723343496164) +S200-6-320x_p276.jpg; ; (9258.400576385926, 13786.518135624752) +S200-6-320x_p277.jpg; ; (11563.264951621602, 13778.62958540803) +S200-6-320x_p278.jpg; ; (13867.146673288324, 13771.32141442399) +S200-6-320x_p279.jpg; ; (16169.756528974043, 13764.017569301897) +S200-6-320x_p280.jpg; ; (18472.374645565487, 13756.014225132489) +S200-6-320x_p281.jpg; ; (20777.324509109098, 13749.093479132558) +S200-6-320x_p282.jpg; ; (23081.700850449506, 13741.645670899139) +S200-6-320x_p283.jpg; ; (25384.41831120372, 13733.763696512122) +S200-6-320x_p284.jpg; ; (27687.865794622223, 13726.25773095751) +S200-6-320x_p285.jpg; ; (29991.7849173058, 13718.889094713984) +S200-6-320x_p286.jpg; ; (32296.021306074545, 13711.475656056056) +S200-6-320x_p287.jpg; ; (34600.187485355535, 13704.051815578832) +S200-6-320x_p288.jpg; ; (36903.60622592229, 13696.33207465875) +S200-6-320x_p289.jpg; ; (39205.62222783974, 13688.762656945433) +S200-6-320x_p290.jpg; ; (41513.92592423304, 13681.219408692801) +S200-6-320x_p291.jpg; ; (43814.53118561581, 13674.360528760502) +S200-6-320x_p292.jpg; ; (46119.46365717599, 13666.377190938972) +S200-6-320x_p293.jpg; ; (48422.48409613553, 13659.12057916199) +S200-6-320x_p294.jpg; ; (50724.653058873635, 13652.131883894317) +S200-6-320x_p295.jpg; ; (53031.077299544624, 13643.920203151145) +S200-6-320x_p296.jpg; ; (55331.350518926556, 13637.427544239252) +S200-6-320x_p297.jpg; ; (57636.18385676515, 13629.307425099727) +S200-6-320x_p298.jpg; ; (59937.64183172831, 13622.306404198238) +S200-6-320x_p299.jpg; ; (62241.58293488543, 13614.38472540096) +S200-6-320x_p300.jpg; ; (64544.29381022603, 13607.12454846525) +S200-6-320x_p301.jpg; ; (66847.2935457614, 13599.85984772638) +S200-6-320x_p302.jpg; ; (69150.65239650918, 13592.150798243261) +S200-6-320x_p303.jpg; ; (71453.11979374768, 13584.662464034673) +S200-6-320x_p304.jpg; ; (73754.41810920944, 13577.522313443022) +S200-6-320x_p305.jpg; ; (76060.47503440898, 13569.7144159688) diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..33d1bb908ac0 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreih4bobabtcickjuokrutpejcbj75v2lorzlhvinyruhgecqwg2rwm diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt new file mode 100644 index 000000000000..860ae08495f1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt @@ -0,0 +1,313 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +S200-6-320x_p000.jpg; ; (0, 0) +S200-6-320x_p001.jpg; ; (2325.51, 0) +S200-6-320x_p002.jpg; ; (4651.03, 0) +S200-6-320x_p003.jpg; ; (6976.54, 0) +S200-6-320x_p004.jpg; ; (9302.66, 0) +S200-6-320x_p005.jpg; ; (11628.2, 0) +S200-6-320x_p006.jpg; ; (13953.7, 0) +S200-6-320x_p007.jpg; ; (16279.2, 0) +S200-6-320x_p008.jpg; ; (18604.7, 0) +S200-6-320x_p009.jpg; ; (20930.2, 0) +S200-6-320x_p010.jpg; ; (23255.7, 0) +S200-6-320x_p011.jpg; ; (25581.9, 0) +S200-6-320x_p012.jpg; ; (27907.4, 0) +S200-6-320x_p013.jpg; ; (30232.9, 0) +S200-6-320x_p014.jpg; ; (32558.4, 0) +S200-6-320x_p015.jpg; ; (34883.9, 0) +S200-6-320x_p016.jpg; ; (37209.4, 0) +S200-6-320x_p017.jpg; ; (39534.9, 0) +S200-6-320x_p018.jpg; ; (41861.1, 0) +S200-6-320x_p019.jpg; ; (44186.6, 0) +S200-6-320x_p020.jpg; ; (46512.1, 0) +S200-6-320x_p021.jpg; ; (48837.6, 0) +S200-6-320x_p022.jpg; ; (51163.1, 0) +S200-6-320x_p023.jpg; ; (53488.6, 0) +S200-6-320x_p024.jpg; ; (55814.1, 0) +S200-6-320x_p025.jpg; ; (58140.3, 0) +S200-6-320x_p026.jpg; ; (60465.8, 0) +S200-6-320x_p027.jpg; ; (62791.3, 0) +S200-6-320x_p028.jpg; ; (65116.8, 0) +S200-6-320x_p029.jpg; ; (67442.3, 0) +S200-6-320x_p030.jpg; ; (69767.8, 0) +S200-6-320x_p031.jpg; ; (72093.3, 0) +S200-6-320x_p032.jpg; ; (74419.5, 0) +S200-6-320x_p033.jpg; ; (76745, 0) +S200-6-320x_p034.jpg; ; (0, 1742.66) +S200-6-320x_p035.jpg; ; (2325.51, 1742.66) +S200-6-320x_p036.jpg; ; (4651.03, 1742.66) +S200-6-320x_p037.jpg; ; (6976.54, 1742.66) +S200-6-320x_p038.jpg; ; (9302.66, 1742.66) +S200-6-320x_p039.jpg; ; (11628.2, 1742.66) +S200-6-320x_p040.jpg; ; (13953.7, 1742.66) +S200-6-320x_p041.jpg; ; (16279.2, 1742.66) +S200-6-320x_p042.jpg; ; (18604.7, 1742.66) +S200-6-320x_p043.jpg; ; (20930.2, 1742.66) +S200-6-320x_p044.jpg; ; (23255.7, 1742.66) +S200-6-320x_p045.jpg; ; (25581.9, 1742.66) +S200-6-320x_p046.jpg; ; (27907.4, 1742.66) +S200-6-320x_p047.jpg; ; (30232.9, 1742.66) +S200-6-320x_p048.jpg; ; (32558.4, 1742.66) +S200-6-320x_p049.jpg; ; (34883.9, 1742.66) +S200-6-320x_p050.jpg; ; (37209.4, 1742.66) +S200-6-320x_p051.jpg; ; (39534.9, 1742.66) +S200-6-320x_p052.jpg; ; (41861.1, 1742.66) +S200-6-320x_p053.jpg; ; (44186.6, 1742.66) +S200-6-320x_p054.jpg; ; (46512.1, 1742.66) +S200-6-320x_p055.jpg; ; (48837.6, 1742.66) +S200-6-320x_p056.jpg; ; (51163.1, 1742.66) +S200-6-320x_p057.jpg; ; (53488.6, 1742.66) +S200-6-320x_p058.jpg; ; (55814.1, 1742.66) +S200-6-320x_p059.jpg; ; (58140.3, 1742.66) +S200-6-320x_p060.jpg; ; (60465.8, 1742.66) +S200-6-320x_p061.jpg; ; (62791.3, 1742.66) +S200-6-320x_p062.jpg; ; (65116.8, 1742.66) +S200-6-320x_p063.jpg; ; (67442.3, 1742.66) +S200-6-320x_p064.jpg; ; (69767.8, 1742.66) +S200-6-320x_p065.jpg; ; (72093.3, 1742.66) +S200-6-320x_p066.jpg; ; (74419.5, 1742.66) +S200-6-320x_p067.jpg; ; (76745, 1742.66) +S200-6-320x_p068.jpg; ; (0, 3484.72) +S200-6-320x_p069.jpg; ; (2325.51, 3484.72) +S200-6-320x_p070.jpg; ; (4651.03, 3484.72) +S200-6-320x_p071.jpg; ; (6976.54, 3484.72) +S200-6-320x_p072.jpg; ; (9302.66, 3484.72) +S200-6-320x_p073.jpg; ; (11628.2, 3484.72) +S200-6-320x_p074.jpg; ; (13953.7, 3484.72) +S200-6-320x_p075.jpg; ; (16279.2, 3484.72) +S200-6-320x_p076.jpg; ; (18604.7, 3484.72) +S200-6-320x_p077.jpg; ; (20930.2, 3484.72) +S200-6-320x_p078.jpg; ; (23255.7, 3484.72) +S200-6-320x_p079.jpg; ; (25581.9, 3484.72) +S200-6-320x_p080.jpg; ; (27907.4, 3484.72) +S200-6-320x_p081.jpg; ; (30232.9, 3484.72) +S200-6-320x_p082.jpg; ; (32558.4, 3484.72) +S200-6-320x_p083.jpg; ; (34883.9, 3484.72) +S200-6-320x_p084.jpg; ; (37209.4, 3484.72) +S200-6-320x_p085.jpg; ; (39534.9, 3484.72) +S200-6-320x_p086.jpg; ; (41861.1, 3484.72) +S200-6-320x_p087.jpg; ; (44186.6, 3484.72) +S200-6-320x_p088.jpg; ; (46512.1, 3484.72) +S200-6-320x_p089.jpg; ; (48837.6, 3484.72) +S200-6-320x_p090.jpg; ; (51163.1, 3484.72) +S200-6-320x_p091.jpg; ; (53488.6, 3484.72) +S200-6-320x_p092.jpg; ; (55814.1, 3484.72) +S200-6-320x_p093.jpg; ; (58140.3, 3484.72) +S200-6-320x_p094.jpg; ; (60465.8, 3484.72) +S200-6-320x_p095.jpg; ; (62791.3, 3484.72) +S200-6-320x_p096.jpg; ; (65116.8, 3484.72) +S200-6-320x_p097.jpg; ; (67442.3, 3484.72) +S200-6-320x_p098.jpg; ; (69767.8, 3484.72) +S200-6-320x_p099.jpg; ; (72093.3, 3484.72) +S200-6-320x_p100.jpg; ; (74419.5, 3484.72) +S200-6-320x_p101.jpg; ; (76745, 3484.72) +S200-6-320x_p102.jpg; ; (0, 5227.37) +S200-6-320x_p103.jpg; ; (2325.51, 5227.37) +S200-6-320x_p104.jpg; ; (4651.03, 5227.37) +S200-6-320x_p105.jpg; ; (6976.54, 5227.37) +S200-6-320x_p106.jpg; ; (9302.66, 5227.37) +S200-6-320x_p107.jpg; ; (11628.2, 5227.37) +S200-6-320x_p108.jpg; ; (13953.7, 5227.37) +S200-6-320x_p109.jpg; ; (16279.2, 5227.37) +S200-6-320x_p110.jpg; ; (18604.7, 5227.37) +S200-6-320x_p111.jpg; ; (20930.2, 5227.37) +S200-6-320x_p112.jpg; ; (23255.7, 5227.37) +S200-6-320x_p113.jpg; ; (25581.9, 5227.37) +S200-6-320x_p114.jpg; ; (27907.4, 5227.37) +S200-6-320x_p115.jpg; ; (30232.9, 5227.37) +S200-6-320x_p116.jpg; ; (32558.4, 5227.37) +S200-6-320x_p117.jpg; ; (34883.9, 5227.37) +S200-6-320x_p118.jpg; ; (37209.4, 5227.37) +S200-6-320x_p119.jpg; ; (39534.9, 5227.37) +S200-6-320x_p120.jpg; ; (41861.1, 5227.37) +S200-6-320x_p121.jpg; ; (44186.6, 5227.37) +S200-6-320x_p122.jpg; ; (46512.1, 5227.37) +S200-6-320x_p123.jpg; ; (48837.6, 5227.37) +S200-6-320x_p124.jpg; ; (51163.1, 5227.37) +S200-6-320x_p125.jpg; ; (53488.6, 5227.37) +S200-6-320x_p126.jpg; ; (55814.1, 5227.37) +S200-6-320x_p127.jpg; ; (58140.3, 5227.37) +S200-6-320x_p128.jpg; ; (60465.8, 5227.37) +S200-6-320x_p129.jpg; ; (62791.3, 5227.37) +S200-6-320x_p130.jpg; ; (65116.8, 5227.37) +S200-6-320x_p131.jpg; ; (67442.3, 5227.37) +S200-6-320x_p132.jpg; ; (69767.8, 5227.37) +S200-6-320x_p133.jpg; ; (72093.3, 5227.37) +S200-6-320x_p134.jpg; ; (74419.5, 5227.37) +S200-6-320x_p135.jpg; ; (76745, 5227.37) +S200-6-320x_p136.jpg; ; (0, 6969.43) +S200-6-320x_p137.jpg; ; (2325.51, 6969.43) +S200-6-320x_p138.jpg; ; (4651.03, 6969.43) +S200-6-320x_p139.jpg; ; (6976.54, 6969.43) +S200-6-320x_p140.jpg; ; (9302.66, 6969.43) +S200-6-320x_p141.jpg; ; (11628.2, 6969.43) +S200-6-320x_p142.jpg; ; (13953.7, 6969.43) +S200-6-320x_p143.jpg; ; (16279.2, 6969.43) +S200-6-320x_p144.jpg; ; (18604.7, 6969.43) +S200-6-320x_p145.jpg; ; (20930.2, 6969.43) +S200-6-320x_p146.jpg; ; (23255.7, 6969.43) +S200-6-320x_p147.jpg; ; (25581.9, 6969.43) +S200-6-320x_p148.jpg; ; (27907.4, 6969.43) +S200-6-320x_p149.jpg; ; (30232.9, 6969.43) +S200-6-320x_p150.jpg; ; (32558.4, 6969.43) +S200-6-320x_p151.jpg; ; (34883.9, 6969.43) +S200-6-320x_p152.jpg; ; (37209.4, 6969.43) +S200-6-320x_p153.jpg; ; (39534.9, 6969.43) +S200-6-320x_p154.jpg; ; (41861.1, 6969.43) +S200-6-320x_p155.jpg; ; (44186.6, 6969.43) +S200-6-320x_p156.jpg; ; (46512.1, 6969.43) +S200-6-320x_p157.jpg; ; (48837.6, 6969.43) +S200-6-320x_p158.jpg; ; (51163.1, 6969.43) +S200-6-320x_p159.jpg; ; (53488.6, 6969.43) +S200-6-320x_p160.jpg; ; (55814.1, 6969.43) +S200-6-320x_p161.jpg; ; (58140.3, 6969.43) +S200-6-320x_p162.jpg; ; (60465.8, 6969.43) +S200-6-320x_p163.jpg; ; (62791.3, 6969.43) +S200-6-320x_p164.jpg; ; (65116.8, 6969.43) +S200-6-320x_p165.jpg; ; (67442.3, 6969.43) +S200-6-320x_p166.jpg; ; (69767.8, 6969.43) +S200-6-320x_p167.jpg; ; (72093.3, 6969.43) +S200-6-320x_p168.jpg; ; (74419.5, 6969.43) +S200-6-320x_p169.jpg; ; (76745, 6969.43) +S200-6-320x_p170.jpg; ; (0, 8712.09) +S200-6-320x_p171.jpg; ; (2325.51, 8712.09) +S200-6-320x_p172.jpg; ; (4651.03, 8712.09) +S200-6-320x_p173.jpg; ; (6976.54, 8712.09) +S200-6-320x_p174.jpg; ; (9302.66, 8712.09) +S200-6-320x_p175.jpg; ; (11628.2, 8712.09) +S200-6-320x_p176.jpg; ; (13953.7, 8712.09) +S200-6-320x_p177.jpg; ; (16279.2, 8712.09) +S200-6-320x_p178.jpg; ; (18604.7, 8712.09) +S200-6-320x_p179.jpg; ; (20930.2, 8712.09) +S200-6-320x_p180.jpg; ; (23255.7, 8712.09) +S200-6-320x_p181.jpg; ; (25581.9, 8712.09) +S200-6-320x_p182.jpg; ; (27907.4, 8712.09) +S200-6-320x_p183.jpg; ; (30232.9, 8712.09) +S200-6-320x_p184.jpg; ; (32558.4, 8712.09) +S200-6-320x_p185.jpg; ; (34883.9, 8712.09) +S200-6-320x_p186.jpg; ; (37209.4, 8712.09) +S200-6-320x_p187.jpg; ; (39534.9, 8712.09) +S200-6-320x_p188.jpg; ; (41861.1, 8712.09) +S200-6-320x_p189.jpg; ; (44186.6, 8712.09) +S200-6-320x_p190.jpg; ; (46512.1, 8712.09) +S200-6-320x_p191.jpg; ; (48837.6, 8712.09) +S200-6-320x_p192.jpg; ; (51163.1, 8712.09) +S200-6-320x_p193.jpg; ; (53488.6, 8712.09) +S200-6-320x_p194.jpg; ; (55814.1, 8712.09) +S200-6-320x_p195.jpg; ; (58140.3, 8712.09) +S200-6-320x_p196.jpg; ; (60465.8, 8712.09) +S200-6-320x_p197.jpg; ; (62791.3, 8712.09) +S200-6-320x_p198.jpg; ; (65116.8, 8712.09) +S200-6-320x_p199.jpg; ; (67442.3, 8712.09) +S200-6-320x_p200.jpg; ; (69767.8, 8712.09) +S200-6-320x_p201.jpg; ; (72093.3, 8712.09) +S200-6-320x_p202.jpg; ; (74419.5, 8712.09) +S200-6-320x_p203.jpg; ; (76745, 8712.09) +S200-6-320x_p204.jpg; ; (0, 10454.1) +S200-6-320x_p205.jpg; ; (2325.51, 10454.1) +S200-6-320x_p206.jpg; ; (4651.03, 10454.1) +S200-6-320x_p207.jpg; ; (6976.54, 10454.1) +S200-6-320x_p208.jpg; ; (9302.66, 10454.1) +S200-6-320x_p209.jpg; ; (11628.2, 10454.1) +S200-6-320x_p210.jpg; ; (13953.7, 10454.1) +S200-6-320x_p211.jpg; ; (16279.2, 10454.1) +S200-6-320x_p212.jpg; ; (18604.7, 10454.1) +S200-6-320x_p213.jpg; ; (20930.2, 10454.1) +S200-6-320x_p214.jpg; ; (23255.7, 10454.1) +S200-6-320x_p215.jpg; ; (25581.9, 10454.1) +S200-6-320x_p216.jpg; ; (27907.4, 10454.1) +S200-6-320x_p217.jpg; ; (30232.9, 10454.1) +S200-6-320x_p218.jpg; ; (32558.4, 10454.1) +S200-6-320x_p219.jpg; ; (34883.9, 10454.1) +S200-6-320x_p220.jpg; ; (37209.4, 10454.1) +S200-6-320x_p221.jpg; ; (39534.9, 10454.1) +S200-6-320x_p222.jpg; ; (41861.1, 10454.1) +S200-6-320x_p223.jpg; ; (44186.6, 10454.1) +S200-6-320x_p224.jpg; ; (46512.1, 10454.1) +S200-6-320x_p225.jpg; ; (48837.6, 10454.1) +S200-6-320x_p226.jpg; ; (51163.1, 10454.1) +S200-6-320x_p227.jpg; ; (53488.6, 10454.1) +S200-6-320x_p228.jpg; ; (55814.1, 10454.1) +S200-6-320x_p229.jpg; ; (58140.3, 10454.1) +S200-6-320x_p230.jpg; ; (60465.8, 10454.1) +S200-6-320x_p231.jpg; ; (62791.3, 10454.1) +S200-6-320x_p232.jpg; ; (65116.8, 10454.1) +S200-6-320x_p233.jpg; ; (67442.3, 10454.1) +S200-6-320x_p234.jpg; ; (69767.8, 10454.1) +S200-6-320x_p235.jpg; ; (72093.3, 10454.1) +S200-6-320x_p236.jpg; ; (74419.5, 10454.1) +S200-6-320x_p237.jpg; ; (76745, 10454.1) +S200-6-320x_p238.jpg; ; (0, 12196.8) +S200-6-320x_p239.jpg; ; (2325.51, 12196.8) +S200-6-320x_p240.jpg; ; (4651.03, 12196.8) +S200-6-320x_p241.jpg; ; (6976.54, 12196.8) +S200-6-320x_p242.jpg; ; (9302.66, 12196.8) +S200-6-320x_p243.jpg; ; (11628.2, 12196.8) +S200-6-320x_p244.jpg; ; (13953.7, 12196.8) +S200-6-320x_p245.jpg; ; (16279.2, 12196.8) +S200-6-320x_p246.jpg; ; (18604.7, 12196.8) +S200-6-320x_p247.jpg; ; (20930.2, 12196.8) +S200-6-320x_p248.jpg; ; (23255.7, 12196.8) +S200-6-320x_p249.jpg; ; (25581.9, 12196.8) +S200-6-320x_p250.jpg; ; (27907.4, 12196.8) +S200-6-320x_p251.jpg; ; (30232.9, 12196.8) +S200-6-320x_p252.jpg; ; (32558.4, 12196.8) +S200-6-320x_p253.jpg; ; (34883.9, 12196.8) +S200-6-320x_p254.jpg; ; (37209.4, 12196.8) +S200-6-320x_p255.jpg; ; (39534.9, 12196.8) +S200-6-320x_p256.jpg; ; (41861.1, 12196.8) +S200-6-320x_p257.jpg; ; (44186.6, 12196.8) +S200-6-320x_p258.jpg; ; (46512.1, 12196.8) +S200-6-320x_p259.jpg; ; (48837.6, 12196.8) +S200-6-320x_p260.jpg; ; (51163.1, 12196.8) +S200-6-320x_p261.jpg; ; (53488.6, 12196.8) +S200-6-320x_p262.jpg; ; (55814.1, 12196.8) +S200-6-320x_p263.jpg; ; (58140.3, 12196.8) +S200-6-320x_p264.jpg; ; (60465.8, 12196.8) +S200-6-320x_p265.jpg; ; (62791.3, 12196.8) +S200-6-320x_p266.jpg; ; (65116.8, 12196.8) +S200-6-320x_p267.jpg; ; (67442.3, 12196.8) +S200-6-320x_p268.jpg; ; (69767.8, 12196.8) +S200-6-320x_p269.jpg; ; (72093.3, 12196.8) +S200-6-320x_p270.jpg; ; (74419.5, 12196.8) +S200-6-320x_p271.jpg; ; (76745, 12196.8) +S200-6-320x_p272.jpg; ; (0, 13939.5) +S200-6-320x_p273.jpg; ; (2325.51, 13939.5) +S200-6-320x_p274.jpg; ; (4651.03, 13939.5) +S200-6-320x_p275.jpg; ; (6976.54, 13939.5) +S200-6-320x_p276.jpg; ; (9302.66, 13939.5) +S200-6-320x_p277.jpg; ; (11628.2, 13939.5) +S200-6-320x_p278.jpg; ; (13953.7, 13939.5) +S200-6-320x_p279.jpg; ; (16279.2, 13939.5) +S200-6-320x_p280.jpg; ; (18604.7, 13939.5) +S200-6-320x_p281.jpg; ; (20930.2, 13939.5) +S200-6-320x_p282.jpg; ; (23255.7, 13939.5) +S200-6-320x_p283.jpg; ; (25581.9, 13939.5) +S200-6-320x_p284.jpg; ; (27907.4, 13939.5) +S200-6-320x_p285.jpg; ; (30232.9, 13939.5) +S200-6-320x_p286.jpg; ; (32558.4, 13939.5) +S200-6-320x_p287.jpg; ; (34883.9, 13939.5) +S200-6-320x_p288.jpg; ; (37209.4, 13939.5) +S200-6-320x_p289.jpg; ; (39534.9, 13939.5) +S200-6-320x_p290.jpg; ; (41861.1, 13939.5) +S200-6-320x_p291.jpg; ; (44186.6, 13939.5) +S200-6-320x_p292.jpg; ; (46512.1, 13939.5) +S200-6-320x_p293.jpg; ; (48837.6, 13939.5) +S200-6-320x_p294.jpg; ; (51163.1, 13939.5) +S200-6-320x_p295.jpg; ; (53488.6, 13939.5) +S200-6-320x_p296.jpg; ; (55814.1, 13939.5) +S200-6-320x_p297.jpg; ; (58140.3, 13939.5) +S200-6-320x_p298.jpg; ; (60465.8, 13939.5) +S200-6-320x_p299.jpg; ; (62791.3, 13939.5) +S200-6-320x_p300.jpg; ; (65116.8, 13939.5) +S200-6-320x_p301.jpg; ; (67442.3, 13939.5) +S200-6-320x_p302.jpg; ; (69767.8, 13939.5) +S200-6-320x_p303.jpg; ; (72093.3, 13939.5) +S200-6-320x_p304.jpg; ; (74419.5, 13939.5) +S200-6-320x_p305.jpg; ; (76745, 13939.5) diff --git a/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt.cid new file mode 100644 index 000000000000..ad8eaa1cb545 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-6-C/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreib54356tstd5cx5atvpmoewpcy6qes3q3dagc5sqyfdgmsi2vqt2a diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p032.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p032.jpg.cid new file mode 100644 index 000000000000..db117f8224ac --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p032.jpg.cid @@ -0,0 +1 @@ +bafkreifps7steb7k22v4mn4upq476rmeburhkvu7j26fookizkusndh7y4 diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p033.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p033.jpg.cid new file mode 100644 index 000000000000..7242983d9006 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p033.jpg.cid @@ -0,0 +1 @@ +bafkreif6j4ccd6go3tctio3j7mldehh6uirpqop5fnz4vtrnywsn5jtzne diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p066.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p066.jpg.cid new file mode 100644 index 000000000000..92d92c22b6b2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p066.jpg.cid @@ -0,0 +1 @@ +bafkreicrczfjrhqlqsivk4c2lroj4gk23kk2bcd53otbjkudawazxz2ddi diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p067.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p067.jpg.cid new file mode 100644 index 000000000000..8ce79ca945fd --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p067.jpg.cid @@ -0,0 +1 @@ +bafkreig44x43cs44zp5uchhi4uyvvggua2t3vksfarb372ymavbawjoy4q diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p100.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p100.jpg.cid new file mode 100644 index 000000000000..4c4b18d2271b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p100.jpg.cid @@ -0,0 +1 @@ +bafkreibqgkwfflifgjasbaco5rcqtcyoq2xlqekbo2qhlhxoszvjfagusu diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p101.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p101.jpg.cid new file mode 100644 index 000000000000..c2d775cf1b5b --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p101.jpg.cid @@ -0,0 +1 @@ +bafkreiblrbks7corro6xjkx3lmmzs5bjtytbz36eebjk2wladsflwp37v4 diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p134.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p134.jpg.cid new file mode 100644 index 000000000000..6292007fe2e9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p134.jpg.cid @@ -0,0 +1 @@ +bafkreihitgwka42yabwlpyq3tc2h3whucafu3glyogsauc3w2mlbdjcgoy diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p135.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p135.jpg.cid new file mode 100644 index 000000000000..1df8847a4d59 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p135.jpg.cid @@ -0,0 +1 @@ +bafkreiaaxp65mjjmabedx2lkdpaqwls3f7m2twwep6bluklekvomhb6wgi diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p168.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p168.jpg.cid new file mode 100644 index 000000000000..d30cdb2dc3fb --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p168.jpg.cid @@ -0,0 +1 @@ +bafkreiemklxeofor3tx2i2brhea45snzusfk7qv5qxtnoankfqx2s3acna diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p169.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p169.jpg.cid new file mode 100644 index 000000000000..abec0ddd83b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p169.jpg.cid @@ -0,0 +1 @@ +bafkreiafuzszuzv4vuquc6mvjw2y2a7fjwoyppy6jtw5ptkb7taxoxj22e diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p202.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p202.jpg.cid new file mode 100644 index 000000000000..5d460b457d22 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p202.jpg.cid @@ -0,0 +1 @@ +bafkreibj2ytw6dlblc376wbs23cwz3doboqej4zw6je5jo7tyczf7ar5qu diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p203.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p203.jpg.cid new file mode 100644 index 000000000000..37caf340ed8c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p203.jpg.cid @@ -0,0 +1 @@ +bafkreif3dvzf6qbywoc6rg75yco6u2kpsipow5bsz4futycrsmwr2mmd4m diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p236.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p236.jpg.cid new file mode 100644 index 000000000000..6d3f3d1150b5 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p236.jpg.cid @@ -0,0 +1 @@ +bafkreifau6ijq563rk36lzkk3cwihfmkqzifhje6macuscllne2jkepnaa diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p237.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p237.jpg.cid new file mode 100644 index 000000000000..03608a06d0a6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p237.jpg.cid @@ -0,0 +1 @@ +bafkreiegxoocv73s2r72tkzt3samqmovkburpzxl5hsqldlorxhtukjshq diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p270.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p270.jpg.cid new file mode 100644 index 000000000000..2fe4acb886c2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p270.jpg.cid @@ -0,0 +1 @@ +bafkreihsbzocklzbrqlzalmndcvti3qek2pslkeje4ac7awtuuw55xvvva diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p271.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p271.jpg.cid new file mode 100644 index 000000000000..c0b5703e5e9f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p271.jpg.cid @@ -0,0 +1 @@ +bafkreibmimgn2hrmtmxhsn4jfmz3riss4ju5ytxofo3b4ntfdz35pyikv4 diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p304.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p304.jpg.cid new file mode 100644 index 000000000000..31d52c19f52f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p304.jpg.cid @@ -0,0 +1 @@ +bafkreieh4cdckmaxgsbgddnc3jbt62ebsehpcx7br2bkr5jawsmf6mu4qa diff --git a/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p305.jpg.cid b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p305.jpg.cid new file mode 100644 index 000000000000..5685709283dc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/S200-6-320x_p305.jpg.cid @@ -0,0 +1 @@ +bafkreigcpqnz2w2wp74kwqofgftox5zryq3oidfiwarksblezuiiulvuau diff --git a/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..6a7a4bd44a32 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreiag7lmo6ysxdnbhfwdphc4hv4ihur6rz6ejdk3vhouisfp3xluij4 diff --git a/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.txt.cid new file mode 100644 index 000000000000..83e3e9eea829 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/S200-small/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreifyg2rvjigtomsaede2vcgijnivbhgbp5yiojtx54ud2b43gpzp3m diff --git a/Modules/Registration/Montage/test/Input/SingleLayer3D/DzZ_T1_inf.nrrd.cid b/Modules/Registration/Montage/test/Input/SingleLayer3D/DzZ_T1_inf.nrrd.cid new file mode 100644 index 000000000000..ff41f20cf824 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/SingleLayer3D/DzZ_T1_inf.nrrd.cid @@ -0,0 +1 @@ +bafkreicevajsc6377e6m63fmk6v5q2ptaybanbkmixxvik5pbwpnimzpma diff --git a/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.registered.txt new file mode 100644 index 000000000000..7bd72c61c29a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.registered.txt @@ -0,0 +1,177 @@ +# AutoGenerated grid file for config from layout : +# rows : 13 +# cols : 13 +# overlap : -1 +# size : 320 320 150 +# Define the number of dimensions we are working on +dim = 3 + +DzZ_T1_inf.nrrd;;(0,0,0) +DzZ_T1_inf.nrrd;;(280,9,-24) +DzZ_T1_inf.nrrd;;(567,-24,-25) +DzZ_T1_inf.nrrd;;(814,-17,-25) +DzZ_T1_inf.nrrd;;(1085,-2,-25) +DzZ_T1_inf.nrrd;;(1355,-3,-25) +DzZ_T1_inf.nrrd;;(1625,-4,-26) +DzZ_T1_inf.nrrd;;(1872,-29,-26) +DzZ_T1_inf.nrrd;;(2151,-17,-11) +DzZ_T1_inf.nrrd;;(2413,-14,-28) +DzZ_T1_inf.nrrd;;(2676,-7,-29) +DzZ_T1_inf.nrrd;;(2955,-8,-30) +DzZ_T1_inf.nrrd;;(3182,-10,-12) +DzZ_T1_inf.nrrd;;(-3,265,-19) +DzZ_T1_inf.nrrd;;(273,272,-19) +DzZ_T1_inf.nrrd;;(560,262,-20) +DzZ_T1_inf.nrrd;;(815,261,-21) +DzZ_T1_inf.nrrd;;(1054,284,-22) +DzZ_T1_inf.nrrd;;(1356,251,-22) +DzZ_T1_inf.nrrd;;(1626,266,-23) +DzZ_T1_inf.nrrd;;(1897,241,-24) +DzZ_T1_inf.nrrd;;(2168,236,-4) +DzZ_T1_inf.nrrd;;(2422,240,-27) +DzZ_T1_inf.nrrd;;(2701,247,-28) +DzZ_T1_inf.nrrd;;(2964,245,-29) +DzZ_T1_inf.nrrd;;(3211,252,-30) +DzZ_T1_inf.nrrd;;(19,551,-17) +DzZ_T1_inf.nrrd;;(274,534,-18) +DzZ_T1_inf.nrrd;;(561,533,-19) +DzZ_T1_inf.nrrd;;(855,484,-19) +DzZ_T1_inf.nrrd;;(1094,507,-19) +DzZ_T1_inf.nrrd;;(1365,514,-20) +DzZ_T1_inf.nrrd;;(1627,521,-21) +DzZ_T1_inf.nrrd;;(1882,536,-22) +DzZ_T1_inf.nrrd;;(2176,504,-23) +DzZ_T1_inf.nrrd;;(2415,511,-24) +DzZ_T1_inf.nrrd;;(2686,517,-25) +DzZ_T1_inf.nrrd;;(2949,516,-26) +DzZ_T1_inf.nrrd;;(3236,539,-26) +DzZ_T1_inf.nrrd;;(-2,790,-15) +DzZ_T1_inf.nrrd;;(283,789,-16) +DzZ_T1_inf.nrrd;;(538,804,-17) +DzZ_T1_inf.nrrd;;(799,790,-19) +DzZ_T1_inf.nrrd;;(1087,786,-17) +DzZ_T1_inf.nrrd;;(1342,801,-18) +DzZ_T1_inf.nrrd;;(1629,800,-19) +DzZ_T1_inf.nrrd;;(1872,812,13) +DzZ_T1_inf.nrrd;;(2169,798,-22) +DzZ_T1_inf.nrrd;;(2432,789,-23) +DzZ_T1_inf.nrrd;;(2679,804,-24) +DzZ_T1_inf.nrrd;;(2958,795,-25) +DzZ_T1_inf.nrrd;;(3252,786,-26) +DzZ_T1_inf.nrrd;;(21,1053,-16) +DzZ_T1_inf.nrrd;;(308,1068,-16) +DzZ_T1_inf.nrrd;;(499,1080,-38) +DzZ_T1_inf.nrrd;;(817,1058,-15) +DzZ_T1_inf.nrrd;;(1080,1065,-16) +DzZ_T1_inf.nrrd;;(1351,1072,-17) +DzZ_T1_inf.nrrd;;(1622,1087,-18) +DzZ_T1_inf.nrrd;;(1889,1066,20) +DzZ_T1_inf.nrrd;;(2146,1069,-21) +DzZ_T1_inf.nrrd;;(2409,1060,-22) +DzZ_T1_inf.nrrd;;(2696,1051,-23) +DzZ_T1_inf.nrrd;;(2967,1066,-23) +DzZ_T1_inf.nrrd;;(3245,1050,-25) +DzZ_T1_inf.nrrd;;(6,1316,-14) +DzZ_T1_inf.nrrd;;(301,1323,-15) +DzZ_T1_inf.nrrd;;(516,1334,-31) +DzZ_T1_inf.nrrd;;(810,1345,-14) +DzZ_T1_inf.nrrd;;(1073,1328,-15) +DzZ_T1_inf.nrrd;;(1328,1327,-16) +DzZ_T1_inf.nrrd;;(1614,1342,-17) +DzZ_T1_inf.nrrd;;(1903,1333,21) +DzZ_T1_inf.nrrd;;(2156,1324,-20) +DzZ_T1_inf.nrrd;;(2418,1323,-21) +DzZ_T1_inf.nrrd;;(2681,1346,-23) +DzZ_T1_inf.nrrd;;(2960,1337,-24) +DzZ_T1_inf.nrrd;;(3246,1320,-24) +DzZ_T1_inf.nrrd;;(7,1604,6) +DzZ_T1_inf.nrrd;;(270,1617,-15) +DzZ_T1_inf.nrrd;;(533,1588,-24) +DzZ_T1_inf.nrrd;;(827,1608,-14) +DzZ_T1_inf.nrrd;;(1082,1607,-15) +DzZ_T1_inf.nrrd;;(1352,1598,-16) +DzZ_T1_inf.nrrd;;(1639,1605,-17) +DzZ_T1_inf.nrrd;;(1920,1587,28) +DzZ_T1_inf.nrrd;;(2153,1583,-4) +DzZ_T1_inf.nrrd;;(2411,1594,-21) +DzZ_T1_inf.nrrd;;(2682,1601,-22) +DzZ_T1_inf.nrrd;;(2969,1608,-23) +DzZ_T1_inf.nrrd;;(3232,1599,-23) +DzZ_T1_inf.nrrd;;(8,1859,-16) +DzZ_T1_inf.nrrd;;(278,1857,-14) +DzZ_T1_inf.nrrd;;(541,1864,-15) +DzZ_T1_inf.nrrd;;(820,1855,-15) +DzZ_T1_inf.nrrd;;(1075,1854,-16) +DzZ_T1_inf.nrrd;;(1361,1868,-17) +DzZ_T1_inf.nrrd;;(1648,1851,-17) +DzZ_T1_inf.nrrd;;(1937,1841,35) +DzZ_T1_inf.nrrd;;(2170,1837,2) +DzZ_T1_inf.nrrd;;(2428,1857,-21) +DzZ_T1_inf.nrrd;;(2691,1840,-22) +DzZ_T1_inf.nrrd;;(2970,1854,-22) +DzZ_T1_inf.nrrd;;(3233,1893,-23) +DzZ_T1_inf.nrrd;;(25,2113,-9) +DzZ_T1_inf.nrrd;;(287,2112,-11) +DzZ_T1_inf.nrrd;;(566,2126,-15) +DzZ_T1_inf.nrrd;;(837,2149,-16) +DzZ_T1_inf.nrrd;;(1099,2148,-17) +DzZ_T1_inf.nrrd;;(1362,2131,-17) +DzZ_T1_inf.nrrd;;(1633,2122,-18) +DzZ_T1_inf.nrrd;;(1954,2095,42) +DzZ_T1_inf.nrrd;;(2187,2091,9) +DzZ_T1_inf.nrrd;;(2437,2128,-20) +DzZ_T1_inf.nrrd;;(2700,2119,-21) +DzZ_T1_inf.nrrd;;(2972,2118,-22) +DzZ_T1_inf.nrrd;;(3203,2157,-11) +DzZ_T1_inf.nrrd;;(42,2366,-2) +DzZ_T1_inf.nrrd;;(304,2365,-4) +DzZ_T1_inf.nrrd;;(551,2382,16) +DzZ_T1_inf.nrrd;;(813,2404,-16) +DzZ_T1_inf.nrrd;;(1076,2403,-16) +DzZ_T1_inf.nrrd;;(1363,2418,-18) +DzZ_T1_inf.nrrd;;(1626,2441,-18) +DzZ_T1_inf.nrrd;;(1897,2392,-19) +DzZ_T1_inf.nrrd;;(2151,2415,-20) +DzZ_T1_inf.nrrd;;(2446,2398,-21) +DzZ_T1_inf.nrrd;;(2717,2397,-22) +DzZ_T1_inf.nrrd;;(2988,2428,-23) +DzZ_T1_inf.nrrd;;(3220,2411,-5) +DzZ_T1_inf.nrrd;;(59,2620,4) +DzZ_T1_inf.nrrd;;(321,2619,2) +DzZ_T1_inf.nrrd;;(568,2636,23) +DzZ_T1_inf.nrrd;;(846,2666,9) +DzZ_T1_inf.nrrd;;(1093,2682,-16) +DzZ_T1_inf.nrrd;;(1356,2657,-17) +DzZ_T1_inf.nrrd;;(1618,2656,-19) +DzZ_T1_inf.nrrd;;(1906,2655,-19) +DzZ_T1_inf.nrrd;;(2160,2670,-20) +DzZ_T1_inf.nrrd;;(2447,2669,-20) +DzZ_T1_inf.nrrd;;(2710,2676,-21) +DzZ_T1_inf.nrrd;;(2967,2662,-25) +DzZ_T1_inf.nrrd;;(3237,2665,1) +DzZ_T1_inf.nrrd;;(76,2874,11) +DzZ_T1_inf.nrrd;;(338,2873,9) +DzZ_T1_inf.nrrd;;(585,2890,30) +DzZ_T1_inf.nrrd;;(863,2920,16) +DzZ_T1_inf.nrrd;;(1087,2953,1) +DzZ_T1_inf.nrrd;;(1351,2893,-9) +DzZ_T1_inf.nrrd;;(1628,2919,-18) +DzZ_T1_inf.nrrd;;(1899,2934,-18) +DzZ_T1_inf.nrrd;;(2161,2932,-19) +DzZ_T1_inf.nrrd;;(2437,2915,-26) +DzZ_T1_inf.nrrd;;(2730,2948,-34) +DzZ_T1_inf.nrrd;;(2984,2916,-18) +DzZ_T1_inf.nrrd;;(3254,2919,8) +DzZ_T1_inf.nrrd;;(93,3128,18) +DzZ_T1_inf.nrrd;;(355,3127,16) +DzZ_T1_inf.nrrd;;(602,3144,37) +DzZ_T1_inf.nrrd;;(880,3174,22) +DzZ_T1_inf.nrrd;;(1104,3207,7) +DzZ_T1_inf.nrrd;;(1368,3147,-2) +DzZ_T1_inf.nrrd;;(1642,3181,21) +DzZ_T1_inf.nrrd;;(1903,3188,-6) +DzZ_T1_inf.nrrd;;(2155,3189,-9) +DzZ_T1_inf.nrrd;;(2454,3169,-19) +DzZ_T1_inf.nrrd;;(2748,3202,-27) +DzZ_T1_inf.nrrd;;(3002,3170,-11) +DzZ_T1_inf.nrrd;;(3271,3173,15) diff --git a/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.txt new file mode 100644 index 000000000000..33134eebf2bf --- /dev/null +++ b/Modules/Registration/Montage/test/Input/SingleLayer3D/TileConfiguration.txt @@ -0,0 +1,177 @@ +# AutoGenerated grid file for config : +# rows : 13 +# cols : 13 +# overlap : 40 +# size : 320 320 150 +# Define the number of dimensions we are working on +dim = 3 + +DzZ_T1_inf.nrrd;;(0,0,0) +DzZ_T1_inf.nrrd;;(280,0,0) +DzZ_T1_inf.nrrd;;(560,0,0) +DzZ_T1_inf.nrrd;;(840,0,0) +DzZ_T1_inf.nrrd;;(1120,0,0) +DzZ_T1_inf.nrrd;;(1400,0,0) +DzZ_T1_inf.nrrd;;(1680,0,0) +DzZ_T1_inf.nrrd;;(1960,0,0) +DzZ_T1_inf.nrrd;;(2240,0,0) +DzZ_T1_inf.nrrd;;(2520,0,0) +DzZ_T1_inf.nrrd;;(2800,0,0) +DzZ_T1_inf.nrrd;;(3080,0,0) +DzZ_T1_inf.nrrd;;(3360,0,0) +DzZ_T1_inf.nrrd;;(0,280,0) +DzZ_T1_inf.nrrd;;(280,280,0) +DzZ_T1_inf.nrrd;;(560,280,0) +DzZ_T1_inf.nrrd;;(840,280,0) +DzZ_T1_inf.nrrd;;(1120,280,0) +DzZ_T1_inf.nrrd;;(1400,280,0) +DzZ_T1_inf.nrrd;;(1680,280,0) +DzZ_T1_inf.nrrd;;(1960,280,0) +DzZ_T1_inf.nrrd;;(2240,280,0) +DzZ_T1_inf.nrrd;;(2520,280,0) +DzZ_T1_inf.nrrd;;(2800,280,0) +DzZ_T1_inf.nrrd;;(3080,280,0) +DzZ_T1_inf.nrrd;;(3360,280,0) +DzZ_T1_inf.nrrd;;(0,560,0) +DzZ_T1_inf.nrrd;;(280,560,0) +DzZ_T1_inf.nrrd;;(560,560,0) +DzZ_T1_inf.nrrd;;(840,560,0) +DzZ_T1_inf.nrrd;;(1120,560,0) +DzZ_T1_inf.nrrd;;(1400,560,0) +DzZ_T1_inf.nrrd;;(1680,560,0) +DzZ_T1_inf.nrrd;;(1960,560,0) +DzZ_T1_inf.nrrd;;(2240,560,0) +DzZ_T1_inf.nrrd;;(2520,560,0) +DzZ_T1_inf.nrrd;;(2800,560,0) +DzZ_T1_inf.nrrd;;(3080,560,0) +DzZ_T1_inf.nrrd;;(3360,560,0) +DzZ_T1_inf.nrrd;;(0,840,0) +DzZ_T1_inf.nrrd;;(280,840,0) +DzZ_T1_inf.nrrd;;(560,840,0) +DzZ_T1_inf.nrrd;;(840,840,0) +DzZ_T1_inf.nrrd;;(1120,840,0) +DzZ_T1_inf.nrrd;;(1400,840,0) +DzZ_T1_inf.nrrd;;(1680,840,0) +DzZ_T1_inf.nrrd;;(1960,840,0) +DzZ_T1_inf.nrrd;;(2240,840,0) +DzZ_T1_inf.nrrd;;(2520,840,0) +DzZ_T1_inf.nrrd;;(2800,840,0) +DzZ_T1_inf.nrrd;;(3080,840,0) +DzZ_T1_inf.nrrd;;(3360,840,0) +DzZ_T1_inf.nrrd;;(0,1120,0) +DzZ_T1_inf.nrrd;;(280,1120,0) +DzZ_T1_inf.nrrd;;(560,1120,0) +DzZ_T1_inf.nrrd;;(840,1120,0) +DzZ_T1_inf.nrrd;;(1120,1120,0) +DzZ_T1_inf.nrrd;;(1400,1120,0) +DzZ_T1_inf.nrrd;;(1680,1120,0) +DzZ_T1_inf.nrrd;;(1960,1120,0) +DzZ_T1_inf.nrrd;;(2240,1120,0) +DzZ_T1_inf.nrrd;;(2520,1120,0) +DzZ_T1_inf.nrrd;;(2800,1120,0) +DzZ_T1_inf.nrrd;;(3080,1120,0) +DzZ_T1_inf.nrrd;;(3360,1120,0) +DzZ_T1_inf.nrrd;;(0,1400,0) +DzZ_T1_inf.nrrd;;(280,1400,0) +DzZ_T1_inf.nrrd;;(560,1400,0) +DzZ_T1_inf.nrrd;;(840,1400,0) +DzZ_T1_inf.nrrd;;(1120,1400,0) +DzZ_T1_inf.nrrd;;(1400,1400,0) +DzZ_T1_inf.nrrd;;(1680,1400,0) +DzZ_T1_inf.nrrd;;(1960,1400,0) +DzZ_T1_inf.nrrd;;(2240,1400,0) +DzZ_T1_inf.nrrd;;(2520,1400,0) +DzZ_T1_inf.nrrd;;(2800,1400,0) +DzZ_T1_inf.nrrd;;(3080,1400,0) +DzZ_T1_inf.nrrd;;(3360,1400,0) +DzZ_T1_inf.nrrd;;(0,1680,0) +DzZ_T1_inf.nrrd;;(280,1680,0) +DzZ_T1_inf.nrrd;;(560,1680,0) +DzZ_T1_inf.nrrd;;(840,1680,0) +DzZ_T1_inf.nrrd;;(1120,1680,0) +DzZ_T1_inf.nrrd;;(1400,1680,0) +DzZ_T1_inf.nrrd;;(1680,1680,0) +DzZ_T1_inf.nrrd;;(1960,1680,0) +DzZ_T1_inf.nrrd;;(2240,1680,0) +DzZ_T1_inf.nrrd;;(2520,1680,0) +DzZ_T1_inf.nrrd;;(2800,1680,0) +DzZ_T1_inf.nrrd;;(3080,1680,0) +DzZ_T1_inf.nrrd;;(3360,1680,0) +DzZ_T1_inf.nrrd;;(0,1960,0) +DzZ_T1_inf.nrrd;;(280,1960,0) +DzZ_T1_inf.nrrd;;(560,1960,0) +DzZ_T1_inf.nrrd;;(840,1960,0) +DzZ_T1_inf.nrrd;;(1120,1960,0) +DzZ_T1_inf.nrrd;;(1400,1960,0) +DzZ_T1_inf.nrrd;;(1680,1960,0) +DzZ_T1_inf.nrrd;;(1960,1960,0) +DzZ_T1_inf.nrrd;;(2240,1960,0) +DzZ_T1_inf.nrrd;;(2520,1960,0) +DzZ_T1_inf.nrrd;;(2800,1960,0) +DzZ_T1_inf.nrrd;;(3080,1960,0) +DzZ_T1_inf.nrrd;;(3360,1960,0) +DzZ_T1_inf.nrrd;;(0,2240,0) +DzZ_T1_inf.nrrd;;(280,2240,0) +DzZ_T1_inf.nrrd;;(560,2240,0) +DzZ_T1_inf.nrrd;;(840,2240,0) +DzZ_T1_inf.nrrd;;(1120,2240,0) +DzZ_T1_inf.nrrd;;(1400,2240,0) +DzZ_T1_inf.nrrd;;(1680,2240,0) +DzZ_T1_inf.nrrd;;(1960,2240,0) +DzZ_T1_inf.nrrd;;(2240,2240,0) +DzZ_T1_inf.nrrd;;(2520,2240,0) +DzZ_T1_inf.nrrd;;(2800,2240,0) +DzZ_T1_inf.nrrd;;(3080,2240,0) +DzZ_T1_inf.nrrd;;(3360,2240,0) +DzZ_T1_inf.nrrd;;(0,2520,0) +DzZ_T1_inf.nrrd;;(280,2520,0) +DzZ_T1_inf.nrrd;;(560,2520,0) +DzZ_T1_inf.nrrd;;(840,2520,0) +DzZ_T1_inf.nrrd;;(1120,2520,0) +DzZ_T1_inf.nrrd;;(1400,2520,0) +DzZ_T1_inf.nrrd;;(1680,2520,0) +DzZ_T1_inf.nrrd;;(1960,2520,0) +DzZ_T1_inf.nrrd;;(2240,2520,0) +DzZ_T1_inf.nrrd;;(2520,2520,0) +DzZ_T1_inf.nrrd;;(2800,2520,0) +DzZ_T1_inf.nrrd;;(3080,2520,0) +DzZ_T1_inf.nrrd;;(3360,2520,0) +DzZ_T1_inf.nrrd;;(0,2800,0) +DzZ_T1_inf.nrrd;;(280,2800,0) +DzZ_T1_inf.nrrd;;(560,2800,0) +DzZ_T1_inf.nrrd;;(840,2800,0) +DzZ_T1_inf.nrrd;;(1120,2800,0) +DzZ_T1_inf.nrrd;;(1400,2800,0) +DzZ_T1_inf.nrrd;;(1680,2800,0) +DzZ_T1_inf.nrrd;;(1960,2800,0) +DzZ_T1_inf.nrrd;;(2240,2800,0) +DzZ_T1_inf.nrrd;;(2520,2800,0) +DzZ_T1_inf.nrrd;;(2800,2800,0) +DzZ_T1_inf.nrrd;;(3080,2800,0) +DzZ_T1_inf.nrrd;;(3360,2800,0) +DzZ_T1_inf.nrrd;;(0,3080,0) +DzZ_T1_inf.nrrd;;(280,3080,0) +DzZ_T1_inf.nrrd;;(560,3080,0) +DzZ_T1_inf.nrrd;;(840,3080,0) +DzZ_T1_inf.nrrd;;(1120,3080,0) +DzZ_T1_inf.nrrd;;(1400,3080,0) +DzZ_T1_inf.nrrd;;(1680,3080,0) +DzZ_T1_inf.nrrd;;(1960,3080,0) +DzZ_T1_inf.nrrd;;(2240,3080,0) +DzZ_T1_inf.nrrd;;(2520,3080,0) +DzZ_T1_inf.nrrd;;(2800,3080,0) +DzZ_T1_inf.nrrd;;(3080,3080,0) +DzZ_T1_inf.nrrd;;(3360,3080,0) +DzZ_T1_inf.nrrd;;(0,3360,0) +DzZ_T1_inf.nrrd;;(280,3360,0) +DzZ_T1_inf.nrrd;;(560,3360,0) +DzZ_T1_inf.nrrd;;(840,3360,0) +DzZ_T1_inf.nrrd;;(1120,3360,0) +DzZ_T1_inf.nrrd;;(1400,3360,0) +DzZ_T1_inf.nrrd;;(1680,3360,0) +DzZ_T1_inf.nrrd;;(1960,3360,0) +DzZ_T1_inf.nrrd;;(2240,3360,0) +DzZ_T1_inf.nrrd;;(2520,3360,0) +DzZ_T1_inf.nrrd;;(2800,3360,0) +DzZ_T1_inf.nrrd;;(3080,3360,0) +DzZ_T1_inf.nrrd;;(3360,3360,0) diff --git a/Modules/Registration/Montage/test/Input/SingleLayer3D/_readme.txt b/Modules/Registration/Montage/test/Input/SingleLayer3D/_readme.txt new file mode 100644 index 000000000000..fa43c79bc238 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/SingleLayer3D/_readme.txt @@ -0,0 +1,2 @@ +TileConfiguration3D is a 169 (13 x 13) tile montage of 320 x 320 x 150 images with an overlap of 40 pixels between tiles. +TileConfiguration3D.registered is the actual registered location of the 3D blocks. diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.mha.cid b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.mha.cid new file mode 100644 index 000000000000..4d6f873e9062 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.mha.cid @@ -0,0 +1 @@ +bafkreibm6l5ajqhve6vzqyq7ekq4zmuetmkkchpacxbyd2jip6btazfvji diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.nrrd.cid b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.nrrd.cid new file mode 100644 index 000000000000..4e0b3472983e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid1.nrrd.cid @@ -0,0 +1 @@ +bafkreifmd2uubrsvfoqwxlnlv6ttw4exoceh7l243sp7fwc2a73yqwm3ky diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.mha.cid b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.mha.cid new file mode 100644 index 000000000000..fc4ba896f709 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.mha.cid @@ -0,0 +1 @@ +bafkreidx4yoj7kef6aoewd5adwuczq6xbwb5kqspybrl263ydzbgwxgpvu diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.nrrd.cid b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.nrrd.cid new file mode 100644 index 000000000000..dc21d2eefea7 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Cuboid2.nrrd.cid @@ -0,0 +1 @@ +bafkreiearus6rugqb5jlm63cf4y5cwo6x2g3rdv4biwrib6k2pd2dd2z3a diff --git a/Modules/Registration/Montage/test/Input/Synthetic/FocusBackground.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/FocusBackground.png.cid new file mode 100644 index 000000000000..c237a5ae1699 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/FocusBackground.png.cid @@ -0,0 +1 @@ +bafkreieeecd6o3ifwumd4pwc22f24l5iiuvwgdu5w32vjy7gpvtw5ecbge diff --git a/Modules/Registration/Montage/test/Input/Synthetic/FocusSample.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/FocusSample.png.cid new file mode 100644 index 000000000000..91727cacd9e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/FocusSample.png.cid @@ -0,0 +1 @@ +bafkreibojmzncczdyv6lfbiyqux6skiicpdonirdlrbjumoudsfbc4bbqi diff --git a/Modules/Registration/Montage/test/Input/Synthetic/MNML3_03bottom.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/MNML3_03bottom.png.cid new file mode 100644 index 000000000000..4d24d45ac4d9 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/MNML3_03bottom.png.cid @@ -0,0 +1 @@ +bafkreiav66h6tgrqa7iupmow34eaaa2hngcpisepa3aa6staqfr7u2prji diff --git a/Modules/Registration/Montage/test/Input/Synthetic/MNML3_04top.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/MNML3_04top.png.cid new file mode 100644 index 000000000000..407cfcdc89e2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/MNML3_04top.png.cid @@ -0,0 +1 @@ +bafkreifgcbdlgl5yz2qqcgygfhvfwe3miptggs3mdtc5y2csviexz7gc4m diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Rect1.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/Rect1.png.cid new file mode 100644 index 000000000000..8746c3813515 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Rect1.png.cid @@ -0,0 +1 @@ +bafkreigp5amucayndk6jhkdneoshz4yz6mf2sqoga227ju4hamfy7zmz44 diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Rect1N.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/Rect1N.png.cid new file mode 100644 index 000000000000..94cab3e838f6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Rect1N.png.cid @@ -0,0 +1 @@ +bafkreidvegyxnbx3kjlisz5qfisjzg45adrnqsccn6j2ldy7h4u7w5gb3i diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Rect2.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/Rect2.png.cid new file mode 100644 index 000000000000..2548c817bfb3 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Rect2.png.cid @@ -0,0 +1 @@ +bafkreiaam33ofytsf3wmp4gakpnmwgtgtrxiyn4no7gxz7ueg4s2bbvh6e diff --git a/Modules/Registration/Montage/test/Input/Synthetic/Rect2N.png.cid b/Modules/Registration/Montage/test/Input/Synthetic/Rect2N.png.cid new file mode 100644 index 000000000000..e0ea8f884dba --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Synthetic/Rect2N.png.cid @@ -0,0 +1 @@ +bafkreieheksshyog3ddid5dj4jnda4j5pppllybwfrvzukcedeihrpka6m diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.registered.txt new file mode 100644 index 000000000000..db43fc67f564 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.registered.txt @@ -0,0 +1,331 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #1_10_Mosaic_180_p000.tif; ; (0, 30) +Ti-7Al_Region #1_10_Mosaic_180_p001.tif; ; (480, 28) +Ti-7Al_Region #1_10_Mosaic_180_p002.tif; ; (956, 26) +Ti-7Al_Region #1_10_Mosaic_180_p003.tif; ; (1436, 25) +Ti-7Al_Region #1_10_Mosaic_180_p004.tif; ; (1916, 23) +Ti-7Al_Region #1_10_Mosaic_180_p005.tif; ; (2393, 21) +Ti-7Al_Region #1_10_Mosaic_180_p006.tif; ; (2874, 20) +Ti-7Al_Region #1_10_Mosaic_180_p007.tif; ; (3354, 19) +Ti-7Al_Region #1_10_Mosaic_180_p008.tif; ; (3834, 17) +Ti-7Al_Region #1_10_Mosaic_180_p009.tif; ; (4315, 16) +Ti-7Al_Region #1_10_Mosaic_180_p010.tif; ; (4795, 14) +Ti-7Al_Region #1_10_Mosaic_180_p011.tif; ; (5274, 13) +Ti-7Al_Region #1_10_Mosaic_180_p012.tif; ; (5760, 10) +Ti-7Al_Region #1_10_Mosaic_180_p013.tif; ; (6239, 8) +Ti-7Al_Region #1_10_Mosaic_180_p014.tif; ; (6719, 5) +Ti-7Al_Region #1_10_Mosaic_180_p015.tif; ; (7200, 3) +Ti-7Al_Region #1_10_Mosaic_180_p016.tif; ; (7680, 2) +Ti-7Al_Region #1_10_Mosaic_180_p017.tif; ; (8161, 0) +Ti-7Al_Region #1_10_Mosaic_180_p035.tif; ; (2, 511) +Ti-7Al_Region #1_10_Mosaic_180_p034.tif; ; (483, 509) +Ti-7Al_Region #1_10_Mosaic_180_p033.tif; ; (963, 507) +Ti-7Al_Region #1_10_Mosaic_180_p032.tif; ; (1445, 506) +Ti-7Al_Region #1_10_Mosaic_180_p031.tif; ; (1925, 504) +Ti-7Al_Region #1_10_Mosaic_180_p030.tif; ; (2403, 502) +Ti-7Al_Region #1_10_Mosaic_180_p029.tif; ; (2884, 500) +Ti-7Al_Region #1_10_Mosaic_180_p028.tif; ; (3365, 500) +Ti-7Al_Region #1_10_Mosaic_180_p027.tif; ; (3845, 498) +Ti-7Al_Region #1_10_Mosaic_180_p026.tif; ; (4326, 495) +Ti-7Al_Region #1_10_Mosaic_180_p025.tif; ; (4806, 495) +Ti-7Al_Region #1_10_Mosaic_180_p024.tif; ; (5285, 494) +Ti-7Al_Region #1_10_Mosaic_180_p023.tif; ; (5769, 491) +Ti-7Al_Region #1_10_Mosaic_180_p022.tif; ; (6249, 489) +Ti-7Al_Region #1_10_Mosaic_180_p021.tif; ; (6729, 486) +Ti-7Al_Region #1_10_Mosaic_180_p020.tif; ; (7209, 484) +Ti-7Al_Region #1_10_Mosaic_180_p019.tif; ; (7689, 483) +Ti-7Al_Region #1_10_Mosaic_180_p018.tif; ; (8163, 481) +Ti-7Al_Region #1_10_Mosaic_180_p036.tif; ; (4, 993) +Ti-7Al_Region #1_10_Mosaic_180_p037.tif; ; (484, 991) +Ti-7Al_Region #1_10_Mosaic_180_p038.tif; ; (964, 989) +Ti-7Al_Region #1_10_Mosaic_180_p039.tif; ; (1443, 988) +Ti-7Al_Region #1_10_Mosaic_180_p040.tif; ; (1920, 986) +Ti-7Al_Region #1_10_Mosaic_180_p041.tif; ; (2398, 984) +Ti-7Al_Region #1_10_Mosaic_180_p042.tif; ; (2879, 982) +Ti-7Al_Region #1_10_Mosaic_180_p043.tif; ; (3358, 982) +Ti-7Al_Region #1_10_Mosaic_180_p044.tif; ; (3838, 980) +Ti-7Al_Region #1_10_Mosaic_180_p045.tif; ; (4321, 977) +Ti-7Al_Region #1_10_Mosaic_180_p046.tif; ; (4798, 977) +Ti-7Al_Region #1_10_Mosaic_180_p047.tif; ; (5277, 975) +Ti-7Al_Region #1_10_Mosaic_180_p048.tif; ; (5764, 973) +Ti-7Al_Region #1_10_Mosaic_180_p049.tif; ; (6242, 971) +Ti-7Al_Region #1_10_Mosaic_180_p050.tif; ; (6722, 967) +Ti-7Al_Region #1_10_Mosaic_180_p051.tif; ; (7203, 966) +Ti-7Al_Region #1_10_Mosaic_180_p052.tif; ; (7683, 965) +Ti-7Al_Region #1_10_Mosaic_180_p053.tif; ; (8165, 963) +Ti-7Al_Region #1_10_Mosaic_180_p071.tif; ; (6, 1474) +Ti-7Al_Region #1_10_Mosaic_180_p070.tif; ; (486, 1472) +Ti-7Al_Region #1_10_Mosaic_180_p069.tif; ; (967, 1470) +Ti-7Al_Region #1_10_Mosaic_180_p068.tif; ; (1448, 1467) +Ti-7Al_Region #1_10_Mosaic_180_p067.tif; ; (1928, 1466) +Ti-7Al_Region #1_10_Mosaic_180_p066.tif; ; (2407, 1464) +Ti-7Al_Region #1_10_Mosaic_180_p065.tif; ; (2887, 1462) +Ti-7Al_Region #1_10_Mosaic_180_p064.tif; ; (3369, 1462) +Ti-7Al_Region #1_10_Mosaic_180_p063.tif; ; (3849, 1460) +Ti-7Al_Region #1_10_Mosaic_180_p062.tif; ; (4330, 1458) +Ti-7Al_Region #1_10_Mosaic_180_p061.tif; ; (4809, 1457) +Ti-7Al_Region #1_10_Mosaic_180_p060.tif; ; (5288, 1456) +Ti-7Al_Region #1_10_Mosaic_180_p059.tif; ; (5772, 1453) +Ti-7Al_Region #1_10_Mosaic_180_p058.tif; ; (6252, 1451) +Ti-7Al_Region #1_10_Mosaic_180_p057.tif; ; (6732, 1448) +Ti-7Al_Region #1_10_Mosaic_180_p056.tif; ; (7212, 1447) +Ti-7Al_Region #1_10_Mosaic_180_p055.tif; ; (7692, 1446) +Ti-7Al_Region #1_10_Mosaic_180_p054.tif; ; (8167, 1444) +Ti-7Al_Region #1_10_Mosaic_180_p072.tif; ; (8, 1954) +Ti-7Al_Region #1_10_Mosaic_180_p073.tif; ; (488, 1952) +Ti-7Al_Region #1_10_Mosaic_180_p074.tif; ; (968, 1950) +Ti-7Al_Region #1_10_Mosaic_180_p075.tif; ; (1447, 1947) +Ti-7Al_Region #1_10_Mosaic_180_p076.tif; ; (1923, 1946) +Ti-7Al_Region #1_10_Mosaic_180_p077.tif; ; (2402, 1944) +Ti-7Al_Region #1_10_Mosaic_180_p078.tif; ; (2884, 1942) +Ti-7Al_Region #1_10_Mosaic_180_p079.tif; ; (3360, 1942) +Ti-7Al_Region #1_10_Mosaic_180_p080.tif; ; (3842, 1940) +Ti-7Al_Region #1_10_Mosaic_180_p081.tif; ; (4325, 1938) +Ti-7Al_Region #1_10_Mosaic_180_p082.tif; ; (4801, 1937) +Ti-7Al_Region #1_10_Mosaic_180_p083.tif; ; (5280, 1935) +Ti-7Al_Region #1_10_Mosaic_180_p084.tif; ; (5767, 1932) +Ti-7Al_Region #1_10_Mosaic_180_p085.tif; ; (6245, 1930) +Ti-7Al_Region #1_10_Mosaic_180_p086.tif; ; (6726, 1927) +Ti-7Al_Region #1_10_Mosaic_180_p087.tif; ; (7207, 1926) +Ti-7Al_Region #1_10_Mosaic_180_p088.tif; ; (7687, 1925) +Ti-7Al_Region #1_10_Mosaic_180_p089.tif; ; (8169, 1923) +Ti-7Al_Region #1_10_Mosaic_180_p107.tif; ; (10, 2434) +Ti-7Al_Region #1_10_Mosaic_180_p106.tif; ; (490, 2432) +Ti-7Al_Region #1_10_Mosaic_180_p105.tif; ; (971, 2430) +Ti-7Al_Region #1_10_Mosaic_180_p104.tif; ; (1451, 2429) +Ti-7Al_Region #1_10_Mosaic_180_p103.tif; ; (1932, 2426) +Ti-7Al_Region #1_10_Mosaic_180_p102.tif; ; (2412, 2424) +Ti-7Al_Region #1_10_Mosaic_180_p101.tif; ; (2893, 2422) +Ti-7Al_Region #1_10_Mosaic_180_p100.tif; ; (3371, 2422) +Ti-7Al_Region #1_10_Mosaic_180_p099.tif; ; (3853, 2420) +Ti-7Al_Region #1_10_Mosaic_180_p098.tif; ; (4334, 2418) +Ti-7Al_Region #1_10_Mosaic_180_p097.tif; ; (4812, 2417) +Ti-7Al_Region #1_10_Mosaic_180_p096.tif; ; (5292, 2415) +Ti-7Al_Region #1_10_Mosaic_180_p095.tif; ; (5776, 2412) +Ti-7Al_Region #1_10_Mosaic_180_p094.tif; ; (6256, 2410) +Ti-7Al_Region #1_10_Mosaic_180_p093.tif; ; (6736, 2408) +Ti-7Al_Region #1_10_Mosaic_180_p092.tif; ; (7216, 2407) +Ti-7Al_Region #1_10_Mosaic_180_p091.tif; ; (7695, 2406) +Ti-7Al_Region #1_10_Mosaic_180_p090.tif; ; (8171, 2404) +Ti-7Al_Region #1_10_Mosaic_180_p108.tif; ; (12, 2914) +Ti-7Al_Region #1_10_Mosaic_180_p109.tif; ; (492, 2912) +Ti-7Al_Region #1_10_Mosaic_180_p110.tif; ; (972, 2910) +Ti-7Al_Region #1_10_Mosaic_180_p111.tif; ; (1449, 2909) +Ti-7Al_Region #1_10_Mosaic_180_p112.tif; ; (1927, 2906) +Ti-7Al_Region #1_10_Mosaic_180_p113.tif; ; (2407, 2904) +Ti-7Al_Region #1_10_Mosaic_180_p114.tif; ; (2889, 2902) +Ti-7Al_Region #1_10_Mosaic_180_p115.tif; ; (3365, 2902) +Ti-7Al_Region #1_10_Mosaic_180_p116.tif; ; (3844, 2900) +Ti-7Al_Region #1_10_Mosaic_180_p117.tif; ; (4329, 2898) +Ti-7Al_Region #1_10_Mosaic_180_p118.tif; ; (4805, 2897) +Ti-7Al_Region #1_10_Mosaic_180_p119.tif; ; (5285, 2895) +Ti-7Al_Region #1_10_Mosaic_180_p120.tif; ; (5771, 2892) +Ti-7Al_Region #1_10_Mosaic_180_p121.tif; ; (6249, 2890) +Ti-7Al_Region #1_10_Mosaic_180_p122.tif; ; (6730, 2887) +Ti-7Al_Region #1_10_Mosaic_180_p123.tif; ; (7212, 2887) +Ti-7Al_Region #1_10_Mosaic_180_p124.tif; ; (7690, 2885) +Ti-7Al_Region #1_10_Mosaic_180_p125.tif; ; (8173, 2883) +Ti-7Al_Region #1_10_Mosaic_180_p143.tif; ; (14, 3392) +Ti-7Al_Region #1_10_Mosaic_180_p142.tif; ; (494, 3390) +Ti-7Al_Region #1_10_Mosaic_180_p141.tif; ; (974, 3388) +Ti-7Al_Region #1_10_Mosaic_180_p140.tif; ; (1455, 3387) +Ti-7Al_Region #1_10_Mosaic_180_p139.tif; ; (1936, 3384) +Ti-7Al_Region #1_10_Mosaic_180_p138.tif; ; (2416, 3382) +Ti-7Al_Region #1_10_Mosaic_180_p137.tif; ; (2897, 3380) +Ti-7Al_Region #1_10_Mosaic_180_p136.tif; ; (3376, 3380) +Ti-7Al_Region #1_10_Mosaic_180_p135.tif; ; (3856, 3378) +Ti-7Al_Region #1_10_Mosaic_180_p134.tif; ; (4338, 3376) +Ti-7Al_Region #1_10_Mosaic_180_p133.tif; ; (4816, 3375) +Ti-7Al_Region #1_10_Mosaic_180_p132.tif; ; (5296, 3374) +Ti-7Al_Region #1_10_Mosaic_180_p131.tif; ; (5780, 3371) +Ti-7Al_Region #1_10_Mosaic_180_p130.tif; ; (6260, 3369) +Ti-7Al_Region #1_10_Mosaic_180_p129.tif; ; (6740, 3366) +Ti-7Al_Region #1_10_Mosaic_180_p128.tif; ; (7221, 3366) +Ti-7Al_Region #1_10_Mosaic_180_p127.tif; ; (7699, 3364) +Ti-7Al_Region #1_10_Mosaic_180_p126.tif; ; (8175, 3363) +Ti-7Al_Region #1_10_Mosaic_180_p144.tif; ; (16, 3872) +Ti-7Al_Region #1_10_Mosaic_180_p145.tif; ; (496, 3870) +Ti-7Al_Region #1_10_Mosaic_180_p146.tif; ; (976, 3868) +Ti-7Al_Region #1_10_Mosaic_180_p147.tif; ; (1454, 3867) +Ti-7Al_Region #1_10_Mosaic_180_p148.tif; ; (1930, 3865) +Ti-7Al_Region #1_10_Mosaic_180_p149.tif; ; (2411, 3862) +Ti-7Al_Region #1_10_Mosaic_180_p150.tif; ; (2894, 3860) +Ti-7Al_Region #1_10_Mosaic_180_p151.tif; ; (3369, 3860) +Ti-7Al_Region #1_10_Mosaic_180_p152.tif; ; (3849, 3858) +Ti-7Al_Region #1_10_Mosaic_180_p153.tif; ; (4333, 3856) +Ti-7Al_Region #1_10_Mosaic_180_p154.tif; ; (4810, 3855) +Ti-7Al_Region #1_10_Mosaic_180_p155.tif; ; (5289, 3853) +Ti-7Al_Region #1_10_Mosaic_180_p156.tif; ; (5777, 3850) +Ti-7Al_Region #1_10_Mosaic_180_p157.tif; ; (6254, 3848) +Ti-7Al_Region #1_10_Mosaic_180_p158.tif; ; (6734, 3845) +Ti-7Al_Region #1_10_Mosaic_180_p159.tif; ; (7217, 3845) +Ti-7Al_Region #1_10_Mosaic_180_p160.tif; ; (7694, 3842) +Ti-7Al_Region #1_10_Mosaic_180_p161.tif; ; (8177, 3841) +Ti-7Al_Region #1_10_Mosaic_180_p179.tif; ; (18, 4351) +Ti-7Al_Region #1_10_Mosaic_180_p178.tif; ; (499, 4349) +Ti-7Al_Region #1_10_Mosaic_180_p177.tif; ; (979, 4347) +Ti-7Al_Region #1_10_Mosaic_180_p176.tif; ; (1459, 4346) +Ti-7Al_Region #1_10_Mosaic_180_p175.tif; ; (1939, 4344) +Ti-7Al_Region #1_10_Mosaic_180_p174.tif; ; (2420, 4341) +Ti-7Al_Region #1_10_Mosaic_180_p173.tif; ; (2900, 4339) +Ti-7Al_Region #1_10_Mosaic_180_p172.tif; ; (3380, 4339) +Ti-7Al_Region #1_10_Mosaic_180_p171.tif; ; (3861, 4337) +Ti-7Al_Region #1_10_Mosaic_180_p170.tif; ; (4342, 4335) +Ti-7Al_Region #1_10_Mosaic_180_p169.tif; ; (4821, 4334) +Ti-7Al_Region #1_10_Mosaic_180_p168.tif; ; (5301, 4332) +Ti-7Al_Region #1_10_Mosaic_180_p167.tif; ; (5784, 4330) +Ti-7Al_Region #1_10_Mosaic_180_p166.tif; ; (6265, 4328) +Ti-7Al_Region #1_10_Mosaic_180_p165.tif; ; (6745, 4325) +Ti-7Al_Region #1_10_Mosaic_180_p164.tif; ; (7225, 4325) +Ti-7Al_Region #1_10_Mosaic_180_p163.tif; ; (7703, 4322) +Ti-7Al_Region #1_10_Mosaic_180_p162.tif; ; (8179, 4321) +Ti-7Al_Region #1_10_Mosaic_180_p180.tif; ; (20, 4831) +Ti-7Al_Region #1_10_Mosaic_180_p181.tif; ; (500, 4829) +Ti-7Al_Region #1_10_Mosaic_180_p182.tif; ; (980, 4827) +Ti-7Al_Region #1_10_Mosaic_180_p183.tif; ; (1457, 4826) +Ti-7Al_Region #1_10_Mosaic_180_p184.tif; ; (1935, 4823) +Ti-7Al_Region #1_10_Mosaic_180_p185.tif; ; (2415, 4821) +Ti-7Al_Region #1_10_Mosaic_180_p186.tif; ; (2896, 4819) +Ti-7Al_Region #1_10_Mosaic_180_p187.tif; ; (3374, 4819) +Ti-7Al_Region #1_10_Mosaic_180_p188.tif; ; (3853, 4816) +Ti-7Al_Region #1_10_Mosaic_180_p189.tif; ; (4337, 4815) +Ti-7Al_Region #1_10_Mosaic_180_p190.tif; ; (4814, 4813) +Ti-7Al_Region #1_10_Mosaic_180_p191.tif; ; (5293, 4811) +Ti-7Al_Region #1_10_Mosaic_180_p192.tif; ; (5781, 4809) +Ti-7Al_Region #1_10_Mosaic_180_p193.tif; ; (6259, 4807) +Ti-7Al_Region #1_10_Mosaic_180_p194.tif; ; (6739, 4804) +Ti-7Al_Region #1_10_Mosaic_180_p195.tif; ; (7221, 4803) +Ti-7Al_Region #1_10_Mosaic_180_p196.tif; ; (7699, 4801) +Ti-7Al_Region #1_10_Mosaic_180_p197.tif; ; (8181, 4800) +Ti-7Al_Region #1_10_Mosaic_180_p215.tif; ; (22, 5310) +Ti-7Al_Region #1_10_Mosaic_180_p214.tif; ; (502, 5308) +Ti-7Al_Region #1_10_Mosaic_180_p213.tif; ; (983, 5306) +Ti-7Al_Region #1_10_Mosaic_180_p212.tif; ; (1463, 5305) +Ti-7Al_Region #1_10_Mosaic_180_p211.tif; ; (1944, 5302) +Ti-7Al_Region #1_10_Mosaic_180_p210.tif; ; (2424, 5300) +Ti-7Al_Region #1_10_Mosaic_180_p209.tif; ; (2904, 5298) +Ti-7Al_Region #1_10_Mosaic_180_p208.tif; ; (3384, 5297) +Ti-7Al_Region #1_10_Mosaic_180_p207.tif; ; (3865, 5295) +Ti-7Al_Region #1_10_Mosaic_180_p206.tif; ; (4346, 5294) +Ti-7Al_Region #1_10_Mosaic_180_p205.tif; ; (4826, 5292) +Ti-7Al_Region #1_10_Mosaic_180_p204.tif; ; (5305, 5290) +Ti-7Al_Region #1_10_Mosaic_180_p203.tif; ; (5788, 5288) +Ti-7Al_Region #1_10_Mosaic_180_p202.tif; ; (6270, 5287) +Ti-7Al_Region #1_10_Mosaic_180_p201.tif; ; (6749, 5284) +Ti-7Al_Region #1_10_Mosaic_180_p200.tif; ; (7229, 5283) +Ti-7Al_Region #1_10_Mosaic_180_p199.tif; ; (7707, 5281) +Ti-7Al_Region #1_10_Mosaic_180_p198.tif; ; (8183, 5280) +Ti-7Al_Region #1_10_Mosaic_180_p216.tif; ; (24, 5791) +Ti-7Al_Region #1_10_Mosaic_180_p217.tif; ; (504, 5789) +Ti-7Al_Region #1_10_Mosaic_180_p218.tif; ; (984, 5787) +Ti-7Al_Region #1_10_Mosaic_180_p219.tif; ; (1464, 5785) +Ti-7Al_Region #1_10_Mosaic_180_p220.tif; ; (1941, 5783) +Ti-7Al_Region #1_10_Mosaic_180_p221.tif; ; (2419, 5781) +Ti-7Al_Region #1_10_Mosaic_180_p222.tif; ; (2902, 5779) +Ti-7Al_Region #1_10_Mosaic_180_p223.tif; ; (3377, 5777) +Ti-7Al_Region #1_10_Mosaic_180_p224.tif; ; (3857, 5775) +Ti-7Al_Region #1_10_Mosaic_180_p225.tif; ; (4342, 5774) +Ti-7Al_Region #1_10_Mosaic_180_p226.tif; ; (4819, 5772) +Ti-7Al_Region #1_10_Mosaic_180_p227.tif; ; (5299, 5770) +Ti-7Al_Region #1_10_Mosaic_180_p228.tif; ; (5784, 5768) +Ti-7Al_Region #1_10_Mosaic_180_p229.tif; ; (6261, 5766) +Ti-7Al_Region #1_10_Mosaic_180_p230.tif; ; (6741, 5765) +Ti-7Al_Region #1_10_Mosaic_180_p231.tif; ; (7224, 5763) +Ti-7Al_Region #1_10_Mosaic_180_p232.tif; ; (7702, 5761) +Ti-7Al_Region #1_10_Mosaic_180_p233.tif; ; (8185, 5760) +Ti-7Al_Region #1_10_Mosaic_180_p251.tif; ; (26, 6269) +Ti-7Al_Region #1_10_Mosaic_180_p250.tif; ; (507, 6267) +Ti-7Al_Region #1_10_Mosaic_180_p249.tif; ; (987, 6265) +Ti-7Al_Region #1_10_Mosaic_180_p248.tif; ; (1468, 6263) +Ti-7Al_Region #1_10_Mosaic_180_p247.tif; ; (1948, 6261) +Ti-7Al_Region #1_10_Mosaic_180_p246.tif; ; (2428, 6259) +Ti-7Al_Region #1_10_Mosaic_180_p245.tif; ; (2909, 6257) +Ti-7Al_Region #1_10_Mosaic_180_p244.tif; ; (3389, 6255) +Ti-7Al_Region #1_10_Mosaic_180_p243.tif; ; (3869, 6253) +Ti-7Al_Region #1_10_Mosaic_180_p242.tif; ; (4351, 6252) +Ti-7Al_Region #1_10_Mosaic_180_p241.tif; ; (4830, 6250) +Ti-7Al_Region #1_10_Mosaic_180_p240.tif; ; (5311, 6248) +Ti-7Al_Region #1_10_Mosaic_180_p239.tif; ; (5792, 6246) +Ti-7Al_Region #1_10_Mosaic_180_p238.tif; ; (6272, 6244) +Ti-7Al_Region #1_10_Mosaic_180_p237.tif; ; (6751, 6243) +Ti-7Al_Region #1_10_Mosaic_180_p236.tif; ; (7233, 6241) +Ti-7Al_Region #1_10_Mosaic_180_p235.tif; ; (7711, 6239) +Ti-7Al_Region #1_10_Mosaic_180_p234.tif; ; (8187, 6239) +Ti-7Al_Region #1_10_Mosaic_180_p252.tif; ; (28, 6749) +Ti-7Al_Region #1_10_Mosaic_180_p253.tif; ; (508, 6747) +Ti-7Al_Region #1_10_Mosaic_180_p254.tif; ; (988, 6745) +Ti-7Al_Region #1_10_Mosaic_180_p255.tif; ; (1467, 6741) +Ti-7Al_Region #1_10_Mosaic_180_p256.tif; ; (1945, 6740) +Ti-7Al_Region #1_10_Mosaic_180_p257.tif; ; (2424, 6738) +Ti-7Al_Region #1_10_Mosaic_180_p258.tif; ; (2907, 6736) +Ti-7Al_Region #1_10_Mosaic_180_p259.tif; ; (3383, 6734) +Ti-7Al_Region #1_10_Mosaic_180_p260.tif; ; (3862, 6732) +Ti-7Al_Region #1_10_Mosaic_180_p261.tif; ; (4349, 6731) +Ti-7Al_Region #1_10_Mosaic_180_p262.tif; ; (4823, 6729) +Ti-7Al_Region #1_10_Mosaic_180_p263.tif; ; (5304, 6727) +Ti-7Al_Region #1_10_Mosaic_180_p264.tif; ; (5791, 6725) +Ti-7Al_Region #1_10_Mosaic_180_p265.tif; ; (6266, 6723) +Ti-7Al_Region #1_10_Mosaic_180_p266.tif; ; (6745, 6721) +Ti-7Al_Region #1_10_Mosaic_180_p267.tif; ; (7230, 6719) +Ti-7Al_Region #1_10_Mosaic_180_p268.tif; ; (7708, 6717) +Ti-7Al_Region #1_10_Mosaic_180_p269.tif; ; (8189, 6717) +Ti-7Al_Region #1_10_Mosaic_180_p287.tif; ; (30, 7229) +Ti-7Al_Region #1_10_Mosaic_180_p286.tif; ; (510, 7227) +Ti-7Al_Region #1_10_Mosaic_180_p285.tif; ; (991, 7225) +Ti-7Al_Region #1_10_Mosaic_180_p284.tif; ; (1472, 7221) +Ti-7Al_Region #1_10_Mosaic_180_p283.tif; ; (1952, 7220) +Ti-7Al_Region #1_10_Mosaic_180_p282.tif; ; (2433, 7218) +Ti-7Al_Region #1_10_Mosaic_180_p281.tif; ; (2913, 7216) +Ti-7Al_Region #1_10_Mosaic_180_p280.tif; ; (3394, 7214) +Ti-7Al_Region #1_10_Mosaic_180_p279.tif; ; (3873, 7212) +Ti-7Al_Region #1_10_Mosaic_180_p278.tif; ; (4354, 7211) +Ti-7Al_Region #1_10_Mosaic_180_p277.tif; ; (4834, 7209) +Ti-7Al_Region #1_10_Mosaic_180_p276.tif; ; (5316, 7207) +Ti-7Al_Region #1_10_Mosaic_180_p275.tif; ; (5796, 7205) +Ti-7Al_Region #1_10_Mosaic_180_p274.tif; ; (6276, 7203) +Ti-7Al_Region #1_10_Mosaic_180_p273.tif; ; (6755, 7201) +Ti-7Al_Region #1_10_Mosaic_180_p272.tif; ; (7237, 7200) +Ti-7Al_Region #1_10_Mosaic_180_p271.tif; ; (7716, 7198) +Ti-7Al_Region #1_10_Mosaic_180_p270.tif; ; (8191, 7198) +Ti-7Al_Region #1_10_Mosaic_180_p288.tif; ; (32, 7709) +Ti-7Al_Region #1_10_Mosaic_180_p289.tif; ; (512, 7707) +Ti-7Al_Region #1_10_Mosaic_180_p290.tif; ; (992, 7705) +Ti-7Al_Region #1_10_Mosaic_180_p291.tif; ; (1473, 7701) +Ti-7Al_Region #1_10_Mosaic_180_p292.tif; ; (1949, 7700) +Ti-7Al_Region #1_10_Mosaic_180_p293.tif; ; (2429, 7698) +Ti-7Al_Region #1_10_Mosaic_180_p294.tif; ; (2911, 7696) +Ti-7Al_Region #1_10_Mosaic_180_p295.tif; ; (3388, 7694) +Ti-7Al_Region #1_10_Mosaic_180_p296.tif; ; (3866, 7692) +Ti-7Al_Region #1_10_Mosaic_180_p297.tif; ; (4352, 7691) +Ti-7Al_Region #1_10_Mosaic_180_p298.tif; ; (4827, 7689) +Ti-7Al_Region #1_10_Mosaic_180_p299.tif; ; (5309, 7687) +Ti-7Al_Region #1_10_Mosaic_180_p300.tif; ; (5796, 7685) +Ti-7Al_Region #1_10_Mosaic_180_p301.tif; ; (6270, 7683) +Ti-7Al_Region #1_10_Mosaic_180_p302.tif; ; (6750, 7681) +Ti-7Al_Region #1_10_Mosaic_180_p303.tif; ; (7236, 7680) +Ti-7Al_Region #1_10_Mosaic_180_p304.tif; ; (7712, 7678) +Ti-7Al_Region #1_10_Mosaic_180_p305.tif; ; (8193, 7678) +Ti-7Al_Region #1_10_Mosaic_180_p323.tif; ; (34, 8189) +Ti-7Al_Region #1_10_Mosaic_180_p322.tif; ; (515, 8187) +Ti-7Al_Region #1_10_Mosaic_180_p321.tif; ; (995, 8185) +Ti-7Al_Region #1_10_Mosaic_180_p320.tif; ; (1476, 8182) +Ti-7Al_Region #1_10_Mosaic_180_p319.tif; ; (1956, 8180) +Ti-7Al_Region #1_10_Mosaic_180_p318.tif; ; (2437, 8178) +Ti-7Al_Region #1_10_Mosaic_180_p317.tif; ; (2917, 8175) +Ti-7Al_Region #1_10_Mosaic_180_p316.tif; ; (3398, 8174) +Ti-7Al_Region #1_10_Mosaic_180_p315.tif; ; (3878, 8172) +Ti-7Al_Region #1_10_Mosaic_180_p314.tif; ; (4359, 8171) +Ti-7Al_Region #1_10_Mosaic_180_p313.tif; ; (4838, 8169) +Ti-7Al_Region #1_10_Mosaic_180_p312.tif; ; (5320, 8167) +Ti-7Al_Region #1_10_Mosaic_180_p311.tif; ; (5800, 8165) +Ti-7Al_Region #1_10_Mosaic_180_p310.tif; ; (6280, 8163) +Ti-7Al_Region #1_10_Mosaic_180_p309.tif; ; (6760, 8161) +Ti-7Al_Region #1_10_Mosaic_180_p308.tif; ; (7241, 8160) +Ti-7Al_Region #1_10_Mosaic_180_p307.tif; ; (7720, 8158) +Ti-7Al_Region #1_10_Mosaic_180_p306.tif; ; (8195, 8158) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.txt new file mode 100644 index 000000000000..e7184638d41a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic180/TileConfiguration.txt @@ -0,0 +1,331 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #1_10_Mosaic_180_p000.tif; ; (0, 0) +Ti-7Al_Region #1_10_Mosaic_180_p001.tif; ; (480.022, 0) +Ti-7Al_Region #1_10_Mosaic_180_p002.tif; ; (960.045, 0) +Ti-7Al_Region #1_10_Mosaic_180_p003.tif; ; (1440.19, 0) +Ti-7Al_Region #1_10_Mosaic_180_p004.tif; ; (1919.97, 0) +Ti-7Al_Region #1_10_Mosaic_180_p005.tif; ; (2399.99, 0) +Ti-7Al_Region #1_10_Mosaic_180_p006.tif; ; (2880.02, 0) +Ti-7Al_Region #1_10_Mosaic_180_p007.tif; ; (3360.04, 0) +Ti-7Al_Region #1_10_Mosaic_180_p008.tif; ; (3840.06, 0) +Ti-7Al_Region #1_10_Mosaic_180_p009.tif; ; (4319.96, 0) +Ti-7Al_Region #1_10_Mosaic_180_p010.tif; ; (4799.99, 0) +Ti-7Al_Region #1_10_Mosaic_180_p011.tif; ; (5280.01, 0) +Ti-7Al_Region #1_10_Mosaic_180_p012.tif; ; (5760.03, 0) +Ti-7Al_Region #1_10_Mosaic_180_p013.tif; ; (6240.05, 0) +Ti-7Al_Region #1_10_Mosaic_180_p014.tif; ; (6719.96, 0) +Ti-7Al_Region #1_10_Mosaic_180_p015.tif; ; (7199.98, 0) +Ti-7Al_Region #1_10_Mosaic_180_p016.tif; ; (7680, 0) +Ti-7Al_Region #1_10_Mosaic_180_p017.tif; ; (8160.02, 0) +Ti-7Al_Region #1_10_Mosaic_180_p035.tif; ; (0, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p034.tif; ; (479.903, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p033.tif; ; (960.045, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p032.tif; ; (1440.07, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p031.tif; ; (1919.97, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p030.tif; ; (2399.99, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p029.tif; ; (2880.02, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p028.tif; ; (3360.04, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p027.tif; ; (3840.06, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p026.tif; ; (4319.96, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p025.tif; ; (4799.99, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p024.tif; ; (5280.01, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p023.tif; ; (5760.03, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p022.tif; ; (6240.05, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p021.tif; ; (6719.96, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p020.tif; ; (7199.98, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p019.tif; ; (7680, 479.969) +Ti-7Al_Region #1_10_Mosaic_180_p018.tif; ; (8160.02, 480.089) +Ti-7Al_Region #1_10_Mosaic_180_p036.tif; ; (0, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p037.tif; ; (480.022, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p038.tif; ; (960.045, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p039.tif; ; (1440.07, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p040.tif; ; (1919.97, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p041.tif; ; (2399.99, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p042.tif; ; (2880.02, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p043.tif; ; (3360.04, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p044.tif; ; (3840.06, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p045.tif; ; (4319.96, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p046.tif; ; (4799.99, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p047.tif; ; (5280.01, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p048.tif; ; (5760.03, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p049.tif; ; (6240.05, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p050.tif; ; (6719.96, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p051.tif; ; (7199.98, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p052.tif; ; (7680, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p053.tif; ; (8160.02, 959.938) +Ti-7Al_Region #1_10_Mosaic_180_p071.tif; ; (0, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p070.tif; ; (480.022, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p069.tif; ; (960.045, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p068.tif; ; (1440.07, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p067.tif; ; (1919.97, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p066.tif; ; (2399.99, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p065.tif; ; (2880.02, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p064.tif; ; (3360.04, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p063.tif; ; (3840.06, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p062.tif; ; (4319.96, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p061.tif; ; (4799.99, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p060.tif; ; (5280.13, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p059.tif; ; (5760.03, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p058.tif; ; (6240.05, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p057.tif; ; (6719.96, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p056.tif; ; (7199.98, 1440.03) +Ti-7Al_Region #1_10_Mosaic_180_p055.tif; ; (7680, 1440.15) +Ti-7Al_Region #1_10_Mosaic_180_p054.tif; ; (8160.02, 1440.15) +Ti-7Al_Region #1_10_Mosaic_180_p072.tif; ; (0, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p073.tif; ; (480.022, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p074.tif; ; (960.045, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p075.tif; ; (1440.07, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p076.tif; ; (1919.97, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p077.tif; ; (2399.99, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p078.tif; ; (2880.02, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p079.tif; ; (3360.04, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p080.tif; ; (3840.06, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p081.tif; ; (4319.96, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p082.tif; ; (4799.99, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p083.tif; ; (5280.01, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p084.tif; ; (5760.03, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p085.tif; ; (6240.05, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p086.tif; ; (6719.96, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p087.tif; ; (7199.98, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p088.tif; ; (7680, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p089.tif; ; (8160.02, 1920) +Ti-7Al_Region #1_10_Mosaic_180_p107.tif; ; (0.119856, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p106.tif; ; (479.903, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p105.tif; ; (960.045, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p104.tif; ; (1440.07, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p103.tif; ; (1919.97, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p102.tif; ; (2399.99, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p101.tif; ; (2880.02, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p100.tif; ; (3360.04, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p099.tif; ; (3840.06, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p098.tif; ; (4319.96, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p097.tif; ; (4799.99, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p096.tif; ; (5280.01, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p095.tif; ; (5760.03, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p094.tif; ; (6240.05, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p093.tif; ; (6719.96, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p092.tif; ; (7199.98, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p091.tif; ; (7680, 2399.96) +Ti-7Al_Region #1_10_Mosaic_180_p090.tif; ; (8160.02, 2400.08) +Ti-7Al_Region #1_10_Mosaic_180_p108.tif; ; (0.119856, 2880.05) +Ti-7Al_Region #1_10_Mosaic_180_p109.tif; ; (480.142, 2880.05) +Ti-7Al_Region #1_10_Mosaic_180_p110.tif; ; (960.165, 2880.05) +Ti-7Al_Region #1_10_Mosaic_180_p111.tif; ; (1440.19, 2880.05) +Ti-7Al_Region #1_10_Mosaic_180_p112.tif; ; (1920.09, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p113.tif; ; (2399.99, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p114.tif; ; (2880.14, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p115.tif; ; (3360.04, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p116.tif; ; (3840.06, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p117.tif; ; (4319.96, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p118.tif; ; (4799.99, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p119.tif; ; (5280.01, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p120.tif; ; (5760.03, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p121.tif; ; (6240.05, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p122.tif; ; (6719.96, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p123.tif; ; (7199.98, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p124.tif; ; (7680, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p125.tif; ; (8160.02, 2879.93) +Ti-7Al_Region #1_10_Mosaic_180_p143.tif; ; (0, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p142.tif; ; (480.022, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p141.tif; ; (960.045, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p140.tif; ; (1440.07, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p139.tif; ; (1919.97, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p138.tif; ; (2399.99, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p137.tif; ; (2880.02, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p136.tif; ; (3360.04, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p135.tif; ; (3840.06, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p134.tif; ; (4319.96, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p133.tif; ; (4799.99, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p132.tif; ; (5280.01, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p131.tif; ; (5760.03, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p130.tif; ; (6240.05, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p129.tif; ; (6719.96, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p128.tif; ; (7199.98, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p127.tif; ; (7680, 3360.02) +Ti-7Al_Region #1_10_Mosaic_180_p126.tif; ; (8160.02, 3360.14) +Ti-7Al_Region #1_10_Mosaic_180_p144.tif; ; (0, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p145.tif; ; (480.142, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p146.tif; ; (960.165, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p147.tif; ; (1440.07, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p148.tif; ; (1920.09, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p149.tif; ; (2400.11, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p150.tif; ; (2880.02, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p151.tif; ; (3360.04, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p152.tif; ; (3840.06, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p153.tif; ; (4319.96, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p154.tif; ; (4799.99, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p155.tif; ; (5280.01, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p156.tif; ; (5760.03, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p157.tif; ; (6240.05, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p158.tif; ; (6719.96, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p159.tif; ; (7199.98, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p160.tif; ; (7680, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p161.tif; ; (8160.02, 3839.99) +Ti-7Al_Region #1_10_Mosaic_180_p179.tif; ; (0.119856, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p178.tif; ; (480.142, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p177.tif; ; (960.165, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p176.tif; ; (1440.19, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p175.tif; ; (1919.97, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p174.tif; ; (2399.99, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p173.tif; ; (2880.14, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p172.tif; ; (3360.04, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p171.tif; ; (3840.06, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p170.tif; ; (4320.08, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p169.tif; ; (4799.99, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p168.tif; ; (5280.01, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p167.tif; ; (5760.15, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p166.tif; ; (6240.05, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p165.tif; ; (6719.96, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p164.tif; ; (7199.98, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p163.tif; ; (7680, 4319.96) +Ti-7Al_Region #1_10_Mosaic_180_p162.tif; ; (8160.02, 4320.08) +Ti-7Al_Region #1_10_Mosaic_180_p180.tif; ; (0.119856, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p181.tif; ; (480.142, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p182.tif; ; (960.165, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p183.tif; ; (1440.07, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p184.tif; ; (1920.09, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p185.tif; ; (2399.99, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p186.tif; ; (2880.02, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p187.tif; ; (3360.16, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p188.tif; ; (3840.06, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p189.tif; ; (4319.96, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p190.tif; ; (4799.99, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p191.tif; ; (5280.01, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p192.tif; ; (5760.03, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p193.tif; ; (6240.05, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p194.tif; ; (6719.96, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p195.tif; ; (7199.98, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p196.tif; ; (7680, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p197.tif; ; (8160.02, 4799.93) +Ti-7Al_Region #1_10_Mosaic_180_p215.tif; ; (0.119856, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p214.tif; ; (480.022, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p213.tif; ; (960.165, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p212.tif; ; (1439.95, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p211.tif; ; (1920.09, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p210.tif; ; (2399.99, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p209.tif; ; (2880.02, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p208.tif; ; (3360.04, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p207.tif; ; (3840.06, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p206.tif; ; (4320.08, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p205.tif; ; (4799.99, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p204.tif; ; (5280.01, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p203.tif; ; (5760.15, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p202.tif; ; (6240.05, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p201.tif; ; (6719.96, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p200.tif; ; (7199.98, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p199.tif; ; (7680, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p198.tif; ; (8160.02, 5280.02) +Ti-7Al_Region #1_10_Mosaic_180_p216.tif; ; (0.119856, 5760.11) +Ti-7Al_Region #1_10_Mosaic_180_p217.tif; ; (480.142, 5760.11) +Ti-7Al_Region #1_10_Mosaic_180_p218.tif; ; (960.045, 5760.11) +Ti-7Al_Region #1_10_Mosaic_180_p219.tif; ; (1440.07, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p220.tif; ; (1920.09, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p221.tif; ; (2399.99, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p222.tif; ; (2880.02, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p223.tif; ; (3360.04, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p224.tif; ; (3840.06, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p225.tif; ; (4319.96, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p226.tif; ; (4799.99, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p227.tif; ; (5280.01, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p228.tif; ; (5760.03, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p229.tif; ; (6240.05, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p230.tif; ; (6719.96, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p231.tif; ; (7199.98, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p232.tif; ; (7680, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p233.tif; ; (8160.02, 5759.99) +Ti-7Al_Region #1_10_Mosaic_180_p251.tif; ; (0, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p250.tif; ; (480.022, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p249.tif; ; (960.045, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p248.tif; ; (1440.07, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p247.tif; ; (1919.97, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p246.tif; ; (2399.99, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p245.tif; ; (2880.02, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p244.tif; ; (3360.04, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p243.tif; ; (3840.06, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p242.tif; ; (4319.96, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p241.tif; ; (4799.99, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p240.tif; ; (5280.01, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p239.tif; ; (5760.03, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p238.tif; ; (6240.05, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p237.tif; ; (6719.96, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p236.tif; ; (7199.98, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p235.tif; ; (7680, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p234.tif; ; (8160.02, 6239.96) +Ti-7Al_Region #1_10_Mosaic_180_p252.tif; ; (0, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p253.tif; ; (480.022, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p254.tif; ; (960.045, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p255.tif; ; (1440.19, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p256.tif; ; (1919.97, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p257.tif; ; (2399.99, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p258.tif; ; (2880.02, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p259.tif; ; (3360.04, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p260.tif; ; (3840.06, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p261.tif; ; (4319.96, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p262.tif; ; (4799.99, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p263.tif; ; (5280.01, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p264.tif; ; (5760.03, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p265.tif; ; (6240.05, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p266.tif; ; (6719.96, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p267.tif; ; (7199.98, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p268.tif; ; (7680, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p269.tif; ; (8160.02, 6719.92) +Ti-7Al_Region #1_10_Mosaic_180_p287.tif; ; (0, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p286.tif; ; (480.022, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p285.tif; ; (960.045, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p284.tif; ; (1440.07, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p283.tif; ; (1919.97, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p282.tif; ; (2399.99, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p281.tif; ; (2880.02, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p280.tif; ; (3360.04, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p279.tif; ; (3840.06, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p278.tif; ; (4319.96, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p277.tif; ; (4799.99, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p276.tif; ; (5280.01, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p275.tif; ; (5760.03, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p274.tif; ; (6240.05, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p273.tif; ; (6719.96, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p272.tif; ; (7199.98, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p271.tif; ; (7680, 7200.01) +Ti-7Al_Region #1_10_Mosaic_180_p270.tif; ; (8160.02, 7200.13) +Ti-7Al_Region #1_10_Mosaic_180_p288.tif; ; (0, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p289.tif; ; (480.022, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p290.tif; ; (960.045, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p291.tif; ; (1440.19, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p292.tif; ; (1919.97, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p293.tif; ; (2399.99, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p294.tif; ; (2880.02, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p295.tif; ; (3360.04, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p296.tif; ; (3840.06, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p297.tif; ; (4320.08, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p298.tif; ; (4799.99, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p299.tif; ; (5280.01, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p300.tif; ; (5760.03, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p301.tif; ; (6240.05, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p302.tif; ; (6719.96, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p303.tif; ; (7199.98, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p304.tif; ; (7680, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p305.tif; ; (8160.02, 7679.98) +Ti-7Al_Region #1_10_Mosaic_180_p323.tif; ; (0, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p322.tif; ; (480.022, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p321.tif; ; (960.045, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p320.tif; ; (1440.07, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p319.tif; ; (1919.97, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p318.tif; ; (2399.99, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p317.tif; ; (2880.02, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p316.tif; ; (3360.04, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p315.tif; ; (3840.06, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p314.tif; ; (4319.96, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p313.tif; ; (4799.99, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p312.tif; ; (5280.01, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p311.tif; ; (5760.03, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p310.tif; ; (6240.05, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p309.tif; ; (6719.96, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p308.tif; ; (7199.98, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p307.tif; ; (7680, 8159.95) +Ti-7Al_Region #1_10_Mosaic_180_p306.tif; ; (8160.02, 8159.95) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.registered.txt new file mode 100644 index 000000000000..3153d5bfdfd6 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.registered.txt @@ -0,0 +1,331 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #1_10_Mosaic_36_p000.tif; ; (0, 30) +Ti-7Al_Region #1_10_Mosaic_36_p001.tif; ; (480, 28) +Ti-7Al_Region #1_10_Mosaic_36_p002.tif; ; (960, 26) +Ti-7Al_Region #1_10_Mosaic_36_p003.tif; ; (1440, 24) +Ti-7Al_Region #1_10_Mosaic_36_p004.tif; ; (1920, 22) +Ti-7Al_Region #1_10_Mosaic_36_p005.tif; ; (2401, 21) +Ti-7Al_Region #1_10_Mosaic_36_p006.tif; ; (2879, 20) +Ti-7Al_Region #1_10_Mosaic_36_p007.tif; ; (3354, 18) +Ti-7Al_Region #1_10_Mosaic_36_p008.tif; ; (3832, 16) +Ti-7Al_Region #1_10_Mosaic_36_p009.tif; ; (4312, 15) +Ti-7Al_Region #1_10_Mosaic_36_p010.tif; ; (4793, 13) +Ti-7Al_Region #1_10_Mosaic_36_p011.tif; ; (5272, 12) +Ti-7Al_Region #1_10_Mosaic_36_p012.tif; ; (5753, 10) +Ti-7Al_Region #1_10_Mosaic_36_p013.tif; ; (6233, 8) +Ti-7Al_Region #1_10_Mosaic_36_p014.tif; ; (6713, 7) +Ti-7Al_Region #1_10_Mosaic_36_p015.tif; ; (7194, 4) +Ti-7Al_Region #1_10_Mosaic_36_p016.tif; ; (7675, 2) +Ti-7Al_Region #1_10_Mosaic_36_p017.tif; ; (8156, 0) +Ti-7Al_Region #1_10_Mosaic_36_p035.tif; ; (2, 510) +Ti-7Al_Region #1_10_Mosaic_36_p034.tif; ; (482, 508) +Ti-7Al_Region #1_10_Mosaic_36_p033.tif; ; (963, 506) +Ti-7Al_Region #1_10_Mosaic_36_p032.tif; ; (1443, 504) +Ti-7Al_Region #1_10_Mosaic_36_p031.tif; ; (1924, 502) +Ti-7Al_Region #1_10_Mosaic_36_p030.tif; ; (2404, 501) +Ti-7Al_Region #1_10_Mosaic_36_p029.tif; ; (2882, 500) +Ti-7Al_Region #1_10_Mosaic_36_p028.tif; ; (3362, 497) +Ti-7Al_Region #1_10_Mosaic_36_p027.tif; ; (3842, 496) +Ti-7Al_Region #1_10_Mosaic_36_p026.tif; ; (4323, 495) +Ti-7Al_Region #1_10_Mosaic_36_p025.tif; ; (4803, 493) +Ti-7Al_Region #1_10_Mosaic_36_p024.tif; ; (5282, 492) +Ti-7Al_Region #1_10_Mosaic_36_p023.tif; ; (5762, 490) +Ti-7Al_Region #1_10_Mosaic_36_p022.tif; ; (6242, 488) +Ti-7Al_Region #1_10_Mosaic_36_p021.tif; ; (6722, 487) +Ti-7Al_Region #1_10_Mosaic_36_p020.tif; ; (7202, 484) +Ti-7Al_Region #1_10_Mosaic_36_p019.tif; ; (7682, 482) +Ti-7Al_Region #1_10_Mosaic_36_p018.tif; ; (8158, 480) +Ti-7Al_Region #1_10_Mosaic_36_p036.tif; ; (4, 990) +Ti-7Al_Region #1_10_Mosaic_36_p037.tif; ; (483, 988) +Ti-7Al_Region #1_10_Mosaic_36_p038.tif; ; (964, 986) +Ti-7Al_Region #1_10_Mosaic_36_p039.tif; ; (1442, 984) +Ti-7Al_Region #1_10_Mosaic_36_p040.tif; ; (1923, 983) +Ti-7Al_Region #1_10_Mosaic_36_p041.tif; ; (2404, 981) +Ti-7Al_Region #1_10_Mosaic_36_p042.tif; ; (2883, 980) +Ti-7Al_Region #1_10_Mosaic_36_p043.tif; ; (3359, 977) +Ti-7Al_Region #1_10_Mosaic_36_p044.tif; ; (3838, 976) +Ti-7Al_Region #1_10_Mosaic_36_p045.tif; ; (4316, 974) +Ti-7Al_Region #1_10_Mosaic_36_p046.tif; ; (4796, 973) +Ti-7Al_Region #1_10_Mosaic_36_p047.tif; ; (5276, 971) +Ti-7Al_Region #1_10_Mosaic_36_p048.tif; ; (5756, 969) +Ti-7Al_Region #1_10_Mosaic_36_p049.tif; ; (6236, 967) +Ti-7Al_Region #1_10_Mosaic_36_p050.tif; ; (6717, 965) +Ti-7Al_Region #1_10_Mosaic_36_p051.tif; ; (7198, 963) +Ti-7Al_Region #1_10_Mosaic_36_p052.tif; ; (7678, 961) +Ti-7Al_Region #1_10_Mosaic_36_p053.tif; ; (8160, 959) +Ti-7Al_Region #1_10_Mosaic_36_p071.tif; ; (6, 1470) +Ti-7Al_Region #1_10_Mosaic_36_p070.tif; ; (486, 1468) +Ti-7Al_Region #1_10_Mosaic_36_p069.tif; ; (966, 1466) +Ti-7Al_Region #1_10_Mosaic_36_p068.tif; ; (1446, 1465) +Ti-7Al_Region #1_10_Mosaic_36_p067.tif; ; (1926, 1463) +Ti-7Al_Region #1_10_Mosaic_36_p066.tif; ; (2407, 1461) +Ti-7Al_Region #1_10_Mosaic_36_p065.tif; ; (2886, 1460) +Ti-7Al_Region #1_10_Mosaic_36_p064.tif; ; (3366, 1458) +Ti-7Al_Region #1_10_Mosaic_36_p063.tif; ; (3846, 1456) +Ti-7Al_Region #1_10_Mosaic_36_p062.tif; ; (4326, 1454) +Ti-7Al_Region #1_10_Mosaic_36_p061.tif; ; (4806, 1453) +Ti-7Al_Region #1_10_Mosaic_36_p060.tif; ; (5286, 1451) +Ti-7Al_Region #1_10_Mosaic_36_p059.tif; ; (5765, 1449) +Ti-7Al_Region #1_10_Mosaic_36_p058.tif; ; (6245, 1447) +Ti-7Al_Region #1_10_Mosaic_36_p057.tif; ; (6726, 1445) +Ti-7Al_Region #1_10_Mosaic_36_p056.tif; ; (7206, 1443) +Ti-7Al_Region #1_10_Mosaic_36_p055.tif; ; (7686, 1441) +Ti-7Al_Region #1_10_Mosaic_36_p054.tif; ; (8162, 1439) +Ti-7Al_Region #1_10_Mosaic_36_p072.tif; ; (8, 1948) +Ti-7Al_Region #1_10_Mosaic_36_p073.tif; ; (488, 1946) +Ti-7Al_Region #1_10_Mosaic_36_p074.tif; ; (968, 1945) +Ti-7Al_Region #1_10_Mosaic_36_p075.tif; ; (1443, 1943) +Ti-7Al_Region #1_10_Mosaic_36_p076.tif; ; (1927, 1941) +Ti-7Al_Region #1_10_Mosaic_36_p077.tif; ; (2408, 1939) +Ti-7Al_Region #1_10_Mosaic_36_p078.tif; ; (2887, 1938) +Ti-7Al_Region #1_10_Mosaic_36_p079.tif; ; (3362, 1936) +Ti-7Al_Region #1_10_Mosaic_36_p080.tif; ; (3841, 1934) +Ti-7Al_Region #1_10_Mosaic_36_p081.tif; ; (4320, 1932) +Ti-7Al_Region #1_10_Mosaic_36_p082.tif; ; (4799, 1931) +Ti-7Al_Region #1_10_Mosaic_36_p083.tif; ; (5280, 1929) +Ti-7Al_Region #1_10_Mosaic_36_p084.tif; ; (5760, 1927) +Ti-7Al_Region #1_10_Mosaic_36_p085.tif; ; (6240, 1925) +Ti-7Al_Region #1_10_Mosaic_36_p086.tif; ; (6721, 1923) +Ti-7Al_Region #1_10_Mosaic_36_p087.tif; ; (7202, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p088.tif; ; (7682, 1919) +Ti-7Al_Region #1_10_Mosaic_36_p089.tif; ; (8164, 1917) +Ti-7Al_Region #1_10_Mosaic_36_p107.tif; ; (10, 2426) +Ti-7Al_Region #1_10_Mosaic_36_p106.tif; ; (490, 2424) +Ti-7Al_Region #1_10_Mosaic_36_p105.tif; ; (971, 2424) +Ti-7Al_Region #1_10_Mosaic_36_p104.tif; ; (1450, 2421) +Ti-7Al_Region #1_10_Mosaic_36_p103.tif; ; (1930, 2419) +Ti-7Al_Region #1_10_Mosaic_36_p102.tif; ; (2412, 2417) +Ti-7Al_Region #1_10_Mosaic_36_p101.tif; ; (2891, 2416) +Ti-7Al_Region #1_10_Mosaic_36_p100.tif; ; (3370, 2414) +Ti-7Al_Region #1_10_Mosaic_36_p099.tif; ; (3850, 2412) +Ti-7Al_Region #1_10_Mosaic_36_p098.tif; ; (4330, 2411) +Ti-7Al_Region #1_10_Mosaic_36_p097.tif; ; (4810, 2409) +Ti-7Al_Region #1_10_Mosaic_36_p096.tif; ; (5290, 2408) +Ti-7Al_Region #1_10_Mosaic_36_p095.tif; ; (5769, 2406) +Ti-7Al_Region #1_10_Mosaic_36_p094.tif; ; (6249, 2404) +Ti-7Al_Region #1_10_Mosaic_36_p093.tif; ; (6730, 2400) +Ti-7Al_Region #1_10_Mosaic_36_p092.tif; ; (7211, 2399) +Ti-7Al_Region #1_10_Mosaic_36_p091.tif; ; (7690, 2398) +Ti-7Al_Region #1_10_Mosaic_36_p090.tif; ; (8167, 2395) +Ti-7Al_Region #1_10_Mosaic_36_p108.tif; ; (12, 2906) +Ti-7Al_Region #1_10_Mosaic_36_p109.tif; ; (490, 2905) +Ti-7Al_Region #1_10_Mosaic_36_p110.tif; ; (971, 2903) +Ti-7Al_Region #1_10_Mosaic_36_p111.tif; ; (1448, 2901) +Ti-7Al_Region #1_10_Mosaic_36_p112.tif; ; (1932, 2899) +Ti-7Al_Region #1_10_Mosaic_36_p113.tif; ; (2412, 2897) +Ti-7Al_Region #1_10_Mosaic_36_p114.tif; ; (2891, 2896) +Ti-7Al_Region #1_10_Mosaic_36_p115.tif; ; (3364, 2894) +Ti-7Al_Region #1_10_Mosaic_36_p116.tif; ; (3845, 2892) +Ti-7Al_Region #1_10_Mosaic_36_p117.tif; ; (4324, 2891) +Ti-7Al_Region #1_10_Mosaic_36_p118.tif; ; (4803, 2889) +Ti-7Al_Region #1_10_Mosaic_36_p119.tif; ; (5284, 2888) +Ti-7Al_Region #1_10_Mosaic_36_p120.tif; ; (5764, 2886) +Ti-7Al_Region #1_10_Mosaic_36_p121.tif; ; (6244, 2884) +Ti-7Al_Region #1_10_Mosaic_36_p122.tif; ; (6725, 2880) +Ti-7Al_Region #1_10_Mosaic_36_p123.tif; ; (7207, 2879) +Ti-7Al_Region #1_10_Mosaic_36_p124.tif; ; (7688, 2876) +Ti-7Al_Region #1_10_Mosaic_36_p125.tif; ; (8169, 2875) +Ti-7Al_Region #1_10_Mosaic_36_p143.tif; ; (13, 3385) +Ti-7Al_Region #1_10_Mosaic_36_p142.tif; ; (493, 3383) +Ti-7Al_Region #1_10_Mosaic_36_p141.tif; ; (974, 3381) +Ti-7Al_Region #1_10_Mosaic_36_p140.tif; ; (1454, 3379) +Ti-7Al_Region #1_10_Mosaic_36_p139.tif; ; (1934, 3377) +Ti-7Al_Region #1_10_Mosaic_36_p138.tif; ; (2415, 3375) +Ti-7Al_Region #1_10_Mosaic_36_p137.tif; ; (2894, 3374) +Ti-7Al_Region #1_10_Mosaic_36_p136.tif; ; (3374, 3372) +Ti-7Al_Region #1_10_Mosaic_36_p135.tif; ; (3854, 3370) +Ti-7Al_Region #1_10_Mosaic_36_p134.tif; ; (4334, 3368) +Ti-7Al_Region #1_10_Mosaic_36_p133.tif; ; (4814, 3367) +Ti-7Al_Region #1_10_Mosaic_36_p132.tif; ; (5294, 3366) +Ti-7Al_Region #1_10_Mosaic_36_p131.tif; ; (5772, 3364) +Ti-7Al_Region #1_10_Mosaic_36_p130.tif; ; (6253, 3362) +Ti-7Al_Region #1_10_Mosaic_36_p129.tif; ; (6734, 3359) +Ti-7Al_Region #1_10_Mosaic_36_p128.tif; ; (7215, 3357) +Ti-7Al_Region #1_10_Mosaic_36_p127.tif; ; (7695, 3355) +Ti-7Al_Region #1_10_Mosaic_36_p126.tif; ; (8171, 3354) +Ti-7Al_Region #1_10_Mosaic_36_p144.tif; ; (15, 3865) +Ti-7Al_Region #1_10_Mosaic_36_p145.tif; ; (494, 3863) +Ti-7Al_Region #1_10_Mosaic_36_p146.tif; ; (974, 3861) +Ti-7Al_Region #1_10_Mosaic_36_p147.tif; ; (1453, 3859) +Ti-7Al_Region #1_10_Mosaic_36_p148.tif; ; (1935, 3857) +Ti-7Al_Region #1_10_Mosaic_36_p149.tif; ; (2415, 3855) +Ti-7Al_Region #1_10_Mosaic_36_p150.tif; ; (2895, 3853) +Ti-7Al_Region #1_10_Mosaic_36_p151.tif; ; (3368, 3851) +Ti-7Al_Region #1_10_Mosaic_36_p152.tif; ; (3849, 3849) +Ti-7Al_Region #1_10_Mosaic_36_p153.tif; ; (4328, 3847) +Ti-7Al_Region #1_10_Mosaic_36_p154.tif; ; (4808, 3846) +Ti-7Al_Region #1_10_Mosaic_36_p155.tif; ; (5288, 3845) +Ti-7Al_Region #1_10_Mosaic_36_p156.tif; ; (5768, 3843) +Ti-7Al_Region #1_10_Mosaic_36_p157.tif; ; (6248, 3841) +Ti-7Al_Region #1_10_Mosaic_36_p158.tif; ; (6730, 3838) +Ti-7Al_Region #1_10_Mosaic_36_p159.tif; ; (7211, 3836) +Ti-7Al_Region #1_10_Mosaic_36_p160.tif; ; (7692, 3834) +Ti-7Al_Region #1_10_Mosaic_36_p161.tif; ; (8173, 3833) +Ti-7Al_Region #1_10_Mosaic_36_p179.tif; ; (17, 4344) +Ti-7Al_Region #1_10_Mosaic_36_p178.tif; ; (497, 4342) +Ti-7Al_Region #1_10_Mosaic_36_p177.tif; ; (977, 4340) +Ti-7Al_Region #1_10_Mosaic_36_p176.tif; ; (1457, 4338) +Ti-7Al_Region #1_10_Mosaic_36_p175.tif; ; (1938, 4336) +Ti-7Al_Region #1_10_Mosaic_36_p174.tif; ; (2418, 4334) +Ti-7Al_Region #1_10_Mosaic_36_p173.tif; ; (2899, 4332) +Ti-7Al_Region #1_10_Mosaic_36_p172.tif; ; (3378, 4330) +Ti-7Al_Region #1_10_Mosaic_36_p171.tif; ; (3858, 4328) +Ti-7Al_Region #1_10_Mosaic_36_p170.tif; ; (4338, 4326) +Ti-7Al_Region #1_10_Mosaic_36_p169.tif; ; (4818, 4325) +Ti-7Al_Region #1_10_Mosaic_36_p168.tif; ; (5298, 4324) +Ti-7Al_Region #1_10_Mosaic_36_p167.tif; ; (5776, 4322) +Ti-7Al_Region #1_10_Mosaic_36_p166.tif; ; (6257, 4320) +Ti-7Al_Region #1_10_Mosaic_36_p165.tif; ; (6739, 4317) +Ti-7Al_Region #1_10_Mosaic_36_p164.tif; ; (7218, 4315) +Ti-7Al_Region #1_10_Mosaic_36_p163.tif; ; (7699, 4314) +Ti-7Al_Region #1_10_Mosaic_36_p162.tif; ; (8175, 4312) +Ti-7Al_Region #1_10_Mosaic_36_p180.tif; ; (19, 4822) +Ti-7Al_Region #1_10_Mosaic_36_p181.tif; ; (498, 4820) +Ti-7Al_Region #1_10_Mosaic_36_p182.tif; ; (978, 4818) +Ti-7Al_Region #1_10_Mosaic_36_p183.tif; ; (1456, 4816) +Ti-7Al_Region #1_10_Mosaic_36_p184.tif; ; (1939, 4814) +Ti-7Al_Region #1_10_Mosaic_36_p185.tif; ; (2419, 4812) +Ti-7Al_Region #1_10_Mosaic_36_p186.tif; ; (2899, 4810) +Ti-7Al_Region #1_10_Mosaic_36_p187.tif; ; (3373, 4808) +Ti-7Al_Region #1_10_Mosaic_36_p188.tif; ; (3853, 4806) +Ti-7Al_Region #1_10_Mosaic_36_p189.tif; ; (4332, 4804) +Ti-7Al_Region #1_10_Mosaic_36_p190.tif; ; (4812, 4803) +Ti-7Al_Region #1_10_Mosaic_36_p191.tif; ; (5293, 4802) +Ti-7Al_Region #1_10_Mosaic_36_p192.tif; ; (5772, 4800) +Ti-7Al_Region #1_10_Mosaic_36_p193.tif; ; (6252, 4798) +Ti-7Al_Region #1_10_Mosaic_36_p194.tif; ; (6735, 4795) +Ti-7Al_Region #1_10_Mosaic_36_p195.tif; ; (7216, 4794) +Ti-7Al_Region #1_10_Mosaic_36_p196.tif; ; (7696, 4792) +Ti-7Al_Region #1_10_Mosaic_36_p197.tif; ; (8177, 4790) +Ti-7Al_Region #1_10_Mosaic_36_p215.tif; ; (21, 5304) +Ti-7Al_Region #1_10_Mosaic_36_p214.tif; ; (501, 5302) +Ti-7Al_Region #1_10_Mosaic_36_p213.tif; ; (981, 5300) +Ti-7Al_Region #1_10_Mosaic_36_p212.tif; ; (1461, 5298) +Ti-7Al_Region #1_10_Mosaic_36_p211.tif; ; (1942, 5296) +Ti-7Al_Region #1_10_Mosaic_36_p210.tif; ; (2422, 5294) +Ti-7Al_Region #1_10_Mosaic_36_p209.tif; ; (2902, 5292) +Ti-7Al_Region #1_10_Mosaic_36_p208.tif; ; (3382, 5290) +Ti-7Al_Region #1_10_Mosaic_36_p207.tif; ; (3861, 5288) +Ti-7Al_Region #1_10_Mosaic_36_p206.tif; ; (4342, 5286) +Ti-7Al_Region #1_10_Mosaic_36_p205.tif; ; (4822, 5285) +Ti-7Al_Region #1_10_Mosaic_36_p204.tif; ; (5302, 5284) +Ti-7Al_Region #1_10_Mosaic_36_p203.tif; ; (5781, 5282) +Ti-7Al_Region #1_10_Mosaic_36_p202.tif; ; (6263, 5279) +Ti-7Al_Region #1_10_Mosaic_36_p201.tif; ; (6742, 5278) +Ti-7Al_Region #1_10_Mosaic_36_p200.tif; ; (7223, 5276) +Ti-7Al_Region #1_10_Mosaic_36_p199.tif; ; (7703, 5274) +Ti-7Al_Region #1_10_Mosaic_36_p198.tif; ; (8179, 5272) +Ti-7Al_Region #1_10_Mosaic_36_p216.tif; ; (23, 5782) +Ti-7Al_Region #1_10_Mosaic_36_p217.tif; ; (502, 5780) +Ti-7Al_Region #1_10_Mosaic_36_p218.tif; ; (982, 5778) +Ti-7Al_Region #1_10_Mosaic_36_p219.tif; ; (1458, 5776) +Ti-7Al_Region #1_10_Mosaic_36_p220.tif; ; (1943, 5774) +Ti-7Al_Region #1_10_Mosaic_36_p221.tif; ; (2422, 5772) +Ti-7Al_Region #1_10_Mosaic_36_p222.tif; ; (2902, 5770) +Ti-7Al_Region #1_10_Mosaic_36_p223.tif; ; (3376, 5768) +Ti-7Al_Region #1_10_Mosaic_36_p224.tif; ; (3856, 5766) +Ti-7Al_Region #1_10_Mosaic_36_p225.tif; ; (4337, 5764) +Ti-7Al_Region #1_10_Mosaic_36_p226.tif; ; (4815, 5763) +Ti-7Al_Region #1_10_Mosaic_36_p227.tif; ; (5297, 5762) +Ti-7Al_Region #1_10_Mosaic_36_p228.tif; ; (5778, 5760) +Ti-7Al_Region #1_10_Mosaic_36_p229.tif; ; (6260, 5757) +Ti-7Al_Region #1_10_Mosaic_36_p230.tif; ; (6738, 5756) +Ti-7Al_Region #1_10_Mosaic_36_p231.tif; ; (7220, 5754) +Ti-7Al_Region #1_10_Mosaic_36_p232.tif; ; (7701, 5752) +Ti-7Al_Region #1_10_Mosaic_36_p233.tif; ; (8181, 5750) +Ti-7Al_Region #1_10_Mosaic_36_p251.tif; ; (24, 6260) +Ti-7Al_Region #1_10_Mosaic_36_p250.tif; ; (505, 6260) +Ti-7Al_Region #1_10_Mosaic_36_p249.tif; ; (985, 6258) +Ti-7Al_Region #1_10_Mosaic_36_p248.tif; ; (1465, 6256) +Ti-7Al_Region #1_10_Mosaic_36_p247.tif; ; (1946, 6254) +Ti-7Al_Region #1_10_Mosaic_36_p246.tif; ; (2426, 6252) +Ti-7Al_Region #1_10_Mosaic_36_p245.tif; ; (2905, 6250) +Ti-7Al_Region #1_10_Mosaic_36_p244.tif; ; (3386, 6248) +Ti-7Al_Region #1_10_Mosaic_36_p243.tif; ; (3865, 6246) +Ti-7Al_Region #1_10_Mosaic_36_p242.tif; ; (4346, 6244) +Ti-7Al_Region #1_10_Mosaic_36_p241.tif; ; (4824, 6243) +Ti-7Al_Region #1_10_Mosaic_36_p240.tif; ; (5306, 6242) +Ti-7Al_Region #1_10_Mosaic_36_p239.tif; ; (5785, 6240) +Ti-7Al_Region #1_10_Mosaic_36_p238.tif; ; (6267, 6237) +Ti-7Al_Region #1_10_Mosaic_36_p237.tif; ; (6746, 6236) +Ti-7Al_Region #1_10_Mosaic_36_p236.tif; ; (7227, 6234) +Ti-7Al_Region #1_10_Mosaic_36_p235.tif; ; (7707, 6232) +Ti-7Al_Region #1_10_Mosaic_36_p234.tif; ; (8183, 6230) +Ti-7Al_Region #1_10_Mosaic_36_p252.tif; ; (26, 6740) +Ti-7Al_Region #1_10_Mosaic_36_p253.tif; ; (506, 6740) +Ti-7Al_Region #1_10_Mosaic_36_p254.tif; ; (985, 6737) +Ti-7Al_Region #1_10_Mosaic_36_p255.tif; ; (1462, 6736) +Ti-7Al_Region #1_10_Mosaic_36_p256.tif; ; (1947, 6733) +Ti-7Al_Region #1_10_Mosaic_36_p257.tif; ; (2426, 6732) +Ti-7Al_Region #1_10_Mosaic_36_p258.tif; ; (2905, 6730) +Ti-7Al_Region #1_10_Mosaic_36_p259.tif; ; (3381, 6728) +Ti-7Al_Region #1_10_Mosaic_36_p260.tif; ; (3860, 6726) +Ti-7Al_Region #1_10_Mosaic_36_p261.tif; ; (4341, 6724) +Ti-7Al_Region #1_10_Mosaic_36_p262.tif; ; (4819, 6723) +Ti-7Al_Region #1_10_Mosaic_36_p263.tif; ; (5302, 6722) +Ti-7Al_Region #1_10_Mosaic_36_p264.tif; ; (5783, 6720) +Ti-7Al_Region #1_10_Mosaic_36_p265.tif; ; (6265, 6718) +Ti-7Al_Region #1_10_Mosaic_36_p266.tif; ; (6742, 6716) +Ti-7Al_Region #1_10_Mosaic_36_p267.tif; ; (7224, 6714) +Ti-7Al_Region #1_10_Mosaic_36_p268.tif; ; (7705, 6712) +Ti-7Al_Region #1_10_Mosaic_36_p269.tif; ; (8185, 6710) +Ti-7Al_Region #1_10_Mosaic_36_p287.tif; ; (28, 7218) +Ti-7Al_Region #1_10_Mosaic_36_p286.tif; ; (509, 7218) +Ti-7Al_Region #1_10_Mosaic_36_p285.tif; ; (988, 7215) +Ti-7Al_Region #1_10_Mosaic_36_p284.tif; ; (1469, 7214) +Ti-7Al_Region #1_10_Mosaic_36_p283.tif; ; (1950, 7212) +Ti-7Al_Region #1_10_Mosaic_36_p282.tif; ; (2431, 7210) +Ti-7Al_Region #1_10_Mosaic_36_p281.tif; ; (2908, 7208) +Ti-7Al_Region #1_10_Mosaic_36_p280.tif; ; (3388, 7208) +Ti-7Al_Region #1_10_Mosaic_36_p279.tif; ; (3868, 7204) +Ti-7Al_Region #1_10_Mosaic_36_p278.tif; ; (4350, 7202) +Ti-7Al_Region #1_10_Mosaic_36_p277.tif; ; (4828, 7201) +Ti-7Al_Region #1_10_Mosaic_36_p276.tif; ; (5309, 7200) +Ti-7Al_Region #1_10_Mosaic_36_p275.tif; ; (5789, 7198) +Ti-7Al_Region #1_10_Mosaic_36_p274.tif; ; (6270, 7196) +Ti-7Al_Region #1_10_Mosaic_36_p273.tif; ; (6750, 7194) +Ti-7Al_Region #1_10_Mosaic_36_p272.tif; ; (7230, 7192) +Ti-7Al_Region #1_10_Mosaic_36_p271.tif; ; (7711, 7190) +Ti-7Al_Region #1_10_Mosaic_36_p270.tif; ; (8187, 7188) +Ti-7Al_Region #1_10_Mosaic_36_p288.tif; ; (30, 7699) +Ti-7Al_Region #1_10_Mosaic_36_p289.tif; ; (509, 7697) +Ti-7Al_Region #1_10_Mosaic_36_p290.tif; ; (989, 7695) +Ti-7Al_Region #1_10_Mosaic_36_p291.tif; ; (1469, 7694) +Ti-7Al_Region #1_10_Mosaic_36_p292.tif; ; (1950, 7692) +Ti-7Al_Region #1_10_Mosaic_36_p293.tif; ; (2431, 7691) +Ti-7Al_Region #1_10_Mosaic_36_p294.tif; ; (2908, 7689) +Ti-7Al_Region #1_10_Mosaic_36_p295.tif; ; (3385, 7688) +Ti-7Al_Region #1_10_Mosaic_36_p296.tif; ; (3864, 7684) +Ti-7Al_Region #1_10_Mosaic_36_p297.tif; ; (4346, 7683) +Ti-7Al_Region #1_10_Mosaic_36_p298.tif; ; (4825, 7682) +Ti-7Al_Region #1_10_Mosaic_36_p299.tif; ; (5308, 7681) +Ti-7Al_Region #1_10_Mosaic_36_p300.tif; ; (5787, 7679) +Ti-7Al_Region #1_10_Mosaic_36_p301.tif; ; (6269, 7677) +Ti-7Al_Region #1_10_Mosaic_36_p302.tif; ; (6747, 7675) +Ti-7Al_Region #1_10_Mosaic_36_p303.tif; ; (7228, 7673) +Ti-7Al_Region #1_10_Mosaic_36_p304.tif; ; (7709, 7671) +Ti-7Al_Region #1_10_Mosaic_36_p305.tif; ; (8189, 7669) +Ti-7Al_Region #1_10_Mosaic_36_p323.tif; ; (32, 8179) +Ti-7Al_Region #1_10_Mosaic_36_p322.tif; ; (512, 8177) +Ti-7Al_Region #1_10_Mosaic_36_p321.tif; ; (992, 8175) +Ti-7Al_Region #1_10_Mosaic_36_p320.tif; ; (1473, 8173) +Ti-7Al_Region #1_10_Mosaic_36_p319.tif; ; (1953, 8171) +Ti-7Al_Region #1_10_Mosaic_36_p318.tif; ; (2434, 8170) +Ti-7Al_Region #1_10_Mosaic_36_p317.tif; ; (2911, 8169) +Ti-7Al_Region #1_10_Mosaic_36_p316.tif; ; (3391, 8167) +Ti-7Al_Region #1_10_Mosaic_36_p315.tif; ; (3871, 8163) +Ti-7Al_Region #1_10_Mosaic_36_p314.tif; ; (4354, 8162) +Ti-7Al_Region #1_10_Mosaic_36_p313.tif; ; (4832, 8162) +Ti-7Al_Region #1_10_Mosaic_36_p312.tif; ; (5313, 8160) +Ti-7Al_Region #1_10_Mosaic_36_p311.tif; ; (5793, 8158) +Ti-7Al_Region #1_10_Mosaic_36_p310.tif; ; (6274, 8156) +Ti-7Al_Region #1_10_Mosaic_36_p309.tif; ; (6754, 8154) +Ti-7Al_Region #1_10_Mosaic_36_p308.tif; ; (7234, 8152) +Ti-7Al_Region #1_10_Mosaic_36_p307.tif; ; (7714, 8150) +Ti-7Al_Region #1_10_Mosaic_36_p306.tif; ; (8191, 8148) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.txt new file mode 100644 index 000000000000..8a3440180dbc --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region1_10_Mosaic36/TileConfiguration.txt @@ -0,0 +1,331 @@ +# File Written by DREAM.3D based on values from the _meta.xml +# Files are ordered Columns moving fastest, then rows. +# Coordinate values are in pixel coords. +# Define the number of dimensions we are working on. +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #1_10_Mosaic_36_p000.tif; ; (0, 0) +Ti-7Al_Region #1_10_Mosaic_36_p001.tif; ; (480.022, 0) +Ti-7Al_Region #1_10_Mosaic_36_p002.tif; ; (960.045, 0) +Ti-7Al_Region #1_10_Mosaic_36_p003.tif; ; (1440.07, 0) +Ti-7Al_Region #1_10_Mosaic_36_p004.tif; ; (1919.97, 0) +Ti-7Al_Region #1_10_Mosaic_36_p005.tif; ; (2399.99, 0) +Ti-7Al_Region #1_10_Mosaic_36_p006.tif; ; (2880.02, 0) +Ti-7Al_Region #1_10_Mosaic_36_p007.tif; ; (3360.04, 0) +Ti-7Al_Region #1_10_Mosaic_36_p008.tif; ; (3840.06, 0) +Ti-7Al_Region #1_10_Mosaic_36_p009.tif; ; (4319.96, 0) +Ti-7Al_Region #1_10_Mosaic_36_p010.tif; ; (4799.99, 0) +Ti-7Al_Region #1_10_Mosaic_36_p011.tif; ; (5280.01, 0) +Ti-7Al_Region #1_10_Mosaic_36_p012.tif; ; (5760.03, 0) +Ti-7Al_Region #1_10_Mosaic_36_p013.tif; ; (6240.05, 0) +Ti-7Al_Region #1_10_Mosaic_36_p014.tif; ; (6719.96, 0) +Ti-7Al_Region #1_10_Mosaic_36_p015.tif; ; (7199.98, 0) +Ti-7Al_Region #1_10_Mosaic_36_p016.tif; ; (7680, 0) +Ti-7Al_Region #1_10_Mosaic_36_p017.tif; ; (8160.02, 0) +Ti-7Al_Region #1_10_Mosaic_36_p035.tif; ; (0, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p034.tif; ; (480.022, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p033.tif; ; (960.045, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p032.tif; ; (1440.07, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p031.tif; ; (1919.97, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p030.tif; ; (2399.99, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p029.tif; ; (2880.02, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p028.tif; ; (3360.04, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p027.tif; ; (3840.06, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p026.tif; ; (4319.96, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p025.tif; ; (4799.99, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p024.tif; ; (5280.01, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p023.tif; ; (5760.03, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p022.tif; ; (6240.05, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p021.tif; ; (6719.96, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p020.tif; ; (7199.98, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p019.tif; ; (7680, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p018.tif; ; (8160.02, 479.969) +Ti-7Al_Region #1_10_Mosaic_36_p036.tif; ; (0, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p037.tif; ; (480.022, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p038.tif; ; (960.045, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p039.tif; ; (1440.07, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p040.tif; ; (1919.97, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p041.tif; ; (2399.99, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p042.tif; ; (2880.02, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p043.tif; ; (3360.04, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p044.tif; ; (3840.06, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p045.tif; ; (4319.96, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p046.tif; ; (4799.99, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p047.tif; ; (5280.01, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p048.tif; ; (5760.03, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p049.tif; ; (6240.05, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p050.tif; ; (6719.96, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p051.tif; ; (7199.98, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p052.tif; ; (7680, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p053.tif; ; (8160.02, 959.938) +Ti-7Al_Region #1_10_Mosaic_36_p071.tif; ; (0, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p070.tif; ; (480.022, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p069.tif; ; (960.045, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p068.tif; ; (1440.07, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p067.tif; ; (1919.97, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p066.tif; ; (2399.99, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p065.tif; ; (2880.02, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p064.tif; ; (3360.04, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p063.tif; ; (3840.06, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p062.tif; ; (4319.96, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p061.tif; ; (4799.99, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p060.tif; ; (5280.01, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p059.tif; ; (5760.03, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p058.tif; ; (6240.05, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p057.tif; ; (6719.96, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p056.tif; ; (7199.98, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p055.tif; ; (7680, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p054.tif; ; (8160.02, 1440.03) +Ti-7Al_Region #1_10_Mosaic_36_p072.tif; ; (0, 1920.12) +Ti-7Al_Region #1_10_Mosaic_36_p073.tif; ; (480.022, 1920.12) +Ti-7Al_Region #1_10_Mosaic_36_p074.tif; ; (960.045, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p075.tif; ; (1440.07, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p076.tif; ; (1919.97, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p077.tif; ; (2399.99, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p078.tif; ; (2880.02, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p079.tif; ; (3360.04, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p080.tif; ; (3840.06, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p081.tif; ; (4319.96, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p082.tif; ; (4799.99, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p083.tif; ; (5280.01, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p084.tif; ; (5760.03, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p085.tif; ; (6240.05, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p086.tif; ; (6719.96, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p087.tif; ; (7199.98, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p088.tif; ; (7680, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p089.tif; ; (8160.02, 1920) +Ti-7Al_Region #1_10_Mosaic_36_p107.tif; ; (0, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p106.tif; ; (480.022, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p105.tif; ; (960.045, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p104.tif; ; (1440.07, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p103.tif; ; (1919.97, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p102.tif; ; (2399.99, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p101.tif; ; (2880.02, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p100.tif; ; (3360.04, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p099.tif; ; (3840.06, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p098.tif; ; (4319.96, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p097.tif; ; (4799.99, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p096.tif; ; (5280.01, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p095.tif; ; (5760.03, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p094.tif; ; (6240.05, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p093.tif; ; (6719.96, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p092.tif; ; (7199.98, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p091.tif; ; (7680, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p090.tif; ; (8160.02, 2399.96) +Ti-7Al_Region #1_10_Mosaic_36_p108.tif; ; (0, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p109.tif; ; (480.022, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p110.tif; ; (960.045, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p111.tif; ; (1440.07, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p112.tif; ; (1919.97, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p113.tif; ; (2400.11, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p114.tif; ; (2880.14, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p115.tif; ; (3360.04, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p116.tif; ; (3840.06, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p117.tif; ; (4319.96, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p118.tif; ; (4799.99, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p119.tif; ; (5280.01, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p120.tif; ; (5760.03, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p121.tif; ; (6240.05, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p122.tif; ; (6719.96, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p123.tif; ; (7199.98, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p124.tif; ; (7680, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p125.tif; ; (8160.02, 2879.93) +Ti-7Al_Region #1_10_Mosaic_36_p143.tif; ; (0, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p142.tif; ; (480.022, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p141.tif; ; (960.045, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p140.tif; ; (1440.07, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p139.tif; ; (1919.97, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p138.tif; ; (2399.99, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p137.tif; ; (2880.02, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p136.tif; ; (3360.04, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p135.tif; ; (3840.06, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p134.tif; ; (4319.96, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p133.tif; ; (4799.99, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p132.tif; ; (5280.01, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p131.tif; ; (5760.03, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p130.tif; ; (6240.05, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p129.tif; ; (6719.96, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p128.tif; ; (7199.98, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p127.tif; ; (7680, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p126.tif; ; (8160.02, 3360.02) +Ti-7Al_Region #1_10_Mosaic_36_p144.tif; ; (0, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p145.tif; ; (480.022, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p146.tif; ; (960.045, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p147.tif; ; (1440.07, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p148.tif; ; (1919.97, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p149.tif; ; (2399.99, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p150.tif; ; (2880.02, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p151.tif; ; (3360.04, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p152.tif; ; (3840.06, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p153.tif; ; (4319.96, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p154.tif; ; (4799.99, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p155.tif; ; (5280.01, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p156.tif; ; (5760.03, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p157.tif; ; (6240.05, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p158.tif; ; (6719.96, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p159.tif; ; (7199.98, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p160.tif; ; (7680, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p161.tif; ; (8160.02, 3839.99) +Ti-7Al_Region #1_10_Mosaic_36_p179.tif; ; (0, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p178.tif; ; (480.022, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p177.tif; ; (960.045, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p176.tif; ; (1440.07, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p175.tif; ; (1919.97, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p174.tif; ; (2399.99, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p173.tif; ; (2880.02, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p172.tif; ; (3360.04, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p171.tif; ; (3840.06, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p170.tif; ; (4319.96, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p169.tif; ; (4799.99, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p168.tif; ; (5280.01, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p167.tif; ; (5760.03, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p166.tif; ; (6240.05, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p165.tif; ; (6719.96, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p164.tif; ; (7199.98, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p163.tif; ; (7680, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p162.tif; ; (8160.02, 4319.96) +Ti-7Al_Region #1_10_Mosaic_36_p180.tif; ; (0, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p181.tif; ; (480.022, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p182.tif; ; (960.045, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p183.tif; ; (1440.07, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p184.tif; ; (1919.97, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p185.tif; ; (2399.99, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p186.tif; ; (2880.02, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p187.tif; ; (3360.04, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p188.tif; ; (3840.06, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p189.tif; ; (4319.96, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p190.tif; ; (4799.99, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p191.tif; ; (5280.01, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p192.tif; ; (5760.03, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p193.tif; ; (6240.05, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p194.tif; ; (6719.96, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p195.tif; ; (7199.98, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p196.tif; ; (7680, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p197.tif; ; (8160.02, 4799.93) +Ti-7Al_Region #1_10_Mosaic_36_p215.tif; ; (0, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p214.tif; ; (480.022, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p213.tif; ; (960.045, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p212.tif; ; (1440.07, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p211.tif; ; (1919.97, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p210.tif; ; (2399.99, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p209.tif; ; (2880.02, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p208.tif; ; (3360.04, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p207.tif; ; (3840.06, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p206.tif; ; (4319.96, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p205.tif; ; (4799.99, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p204.tif; ; (5280.01, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p203.tif; ; (5760.03, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p202.tif; ; (6240.17, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p201.tif; ; (6719.96, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p200.tif; ; (7199.98, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p199.tif; ; (7680.12, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p198.tif; ; (8160.02, 5280.02) +Ti-7Al_Region #1_10_Mosaic_36_p216.tif; ; (0, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p217.tif; ; (480.022, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p218.tif; ; (960.045, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p219.tif; ; (1440.07, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p220.tif; ; (1919.97, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p221.tif; ; (2399.99, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p222.tif; ; (2880.02, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p223.tif; ; (3360.04, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p224.tif; ; (3840.06, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p225.tif; ; (4319.96, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p226.tif; ; (4799.99, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p227.tif; ; (5280.01, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p228.tif; ; (5760.03, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p229.tif; ; (6240.05, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p230.tif; ; (6719.96, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p231.tif; ; (7199.98, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p232.tif; ; (7680, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p233.tif; ; (8160.02, 5759.99) +Ti-7Al_Region #1_10_Mosaic_36_p251.tif; ; (0, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p250.tif; ; (480.022, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p249.tif; ; (960.045, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p248.tif; ; (1440.07, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p247.tif; ; (1919.97, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p246.tif; ; (2399.99, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p245.tif; ; (2880.02, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p244.tif; ; (3360.04, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p243.tif; ; (3840.06, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p242.tif; ; (4319.96, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p241.tif; ; (4799.99, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p240.tif; ; (5280.01, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p239.tif; ; (5760.03, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p238.tif; ; (6240.05, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p237.tif; ; (6719.96, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p236.tif; ; (7199.98, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p235.tif; ; (7680, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p234.tif; ; (8160.02, 6239.96) +Ti-7Al_Region #1_10_Mosaic_36_p252.tif; ; (0, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p253.tif; ; (480.022, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p254.tif; ; (960.045, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p255.tif; ; (1440.07, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p256.tif; ; (1919.97, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p257.tif; ; (2399.99, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p258.tif; ; (2880.02, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p259.tif; ; (3360.04, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p260.tif; ; (3840.06, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p261.tif; ; (4319.96, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p262.tif; ; (4799.99, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p263.tif; ; (5280.01, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p264.tif; ; (5760.03, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p265.tif; ; (6240.05, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p266.tif; ; (6719.96, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p267.tif; ; (7199.98, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p268.tif; ; (7680, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p269.tif; ; (8160.02, 6719.92) +Ti-7Al_Region #1_10_Mosaic_36_p287.tif; ; (0, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p286.tif; ; (480.022, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p285.tif; ; (960.045, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p284.tif; ; (1440.07, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p283.tif; ; (1919.97, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p282.tif; ; (2399.99, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p281.tif; ; (2880.02, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p280.tif; ; (3360.04, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p279.tif; ; (3840.06, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p278.tif; ; (4319.96, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p277.tif; ; (4799.99, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p276.tif; ; (5280.01, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p275.tif; ; (5760.03, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p274.tif; ; (6240.05, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p273.tif; ; (6719.96, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p272.tif; ; (7199.98, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p271.tif; ; (7680, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p270.tif; ; (8160.02, 7200.01) +Ti-7Al_Region #1_10_Mosaic_36_p288.tif; ; (0, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p289.tif; ; (480.022, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p290.tif; ; (960.045, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p291.tif; ; (1440.07, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p292.tif; ; (1919.97, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p293.tif; ; (2399.99, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p294.tif; ; (2880.02, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p295.tif; ; (3360.04, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p296.tif; ; (3840.06, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p297.tif; ; (4319.96, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p298.tif; ; (4799.99, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p299.tif; ; (5280.01, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p300.tif; ; (5760.03, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p301.tif; ; (6240.05, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p302.tif; ; (6719.96, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p303.tif; ; (7199.98, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p304.tif; ; (7680, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p305.tif; ; (8160.02, 7679.98) +Ti-7Al_Region #1_10_Mosaic_36_p323.tif; ; (0, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p322.tif; ; (480.022, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p321.tif; ; (960.045, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p320.tif; ; (1440.07, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p319.tif; ; (1919.97, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p318.tif; ; (2399.99, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p317.tif; ; (2880.02, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p316.tif; ; (3360.04, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p315.tif; ; (3840.06, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p314.tif; ; (4319.96, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p313.tif; ; (4799.99, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p312.tif; ; (5280.01, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p311.tif; ; (5760.03, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p310.tif; ; (6240.05, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p309.tif; ; (6719.96, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p308.tif; ; (7199.98, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p307.tif; ; (7680, 8159.95) +Ti-7Al_Region #1_10_Mosaic_36_p306.tif; ; (8160.02, 8159.95) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.registered.txt new file mode 100644 index 000000000000..790c3764543e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.registered.txt @@ -0,0 +1,328 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #2_150_Mosaic_36_p000.tif; ; (0.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p001.tif; ; (478.941022238986, -1.6801423852366544) +Ti-7Al_Region #2_150_Mosaic_36_p002.tif; ; (959.7814996006339, -3.371639313097841) +Ti-7Al_Region #2_150_Mosaic_36_p003.tif; ; (1440.3455824046434, -4.940441491668548) +Ti-7Al_Region #2_150_Mosaic_36_p004.tif; ; (1920.4714500307327, -6.184691836076395) +Ti-7Al_Region #2_150_Mosaic_36_p005.tif; ; (2399.9527753009334, -7.669913726249405) +Ti-7Al_Region #2_150_Mosaic_36_p006.tif; ; (2877.8996309309427, -9.058866488098055) +Ti-7Al_Region #2_150_Mosaic_36_p007.tif; ; (3358.3513288499726, -10.653240086260288) +Ti-7Al_Region #2_150_Mosaic_36_p008.tif; ; (3840.234172740696, -12.135583219614587) +Ti-7Al_Region #2_150_Mosaic_36_p009.tif; ; (4320.656980004847, -13.629113483880033) +Ti-7Al_Region #2_150_Mosaic_36_p010.tif; ; (4800.676838852707, -15.041380505383238) +Ti-7Al_Region #2_150_Mosaic_36_p011.tif; ; (5281.529647008541, -16.54453687094737) +Ti-7Al_Region #2_150_Mosaic_36_p012.tif; ; (5762.565796679466, -18.032277007961362) +Ti-7Al_Region #2_150_Mosaic_36_p013.tif; ; (6243.548061281286, -19.448232993388686) +Ti-7Al_Region #2_150_Mosaic_36_p014.tif; ; (6724.037834372854, -21.173941578842808) +Ti-7Al_Region #2_150_Mosaic_36_p015.tif; ; (7204.8524945689605, -22.678978070206004) +Ti-7Al_Region #2_150_Mosaic_36_p016.tif; ; (7685.250195491388, -24.229928930186905) +Ti-7Al_Region #2_150_Mosaic_36_p017.tif; ; (8166.404915852445, -25.90193089063895) +Ti-7Al_Region #2_150_Mosaic_36_p035.tif; ; (1.8512222444150837, 478.0672923435394) +Ti-7Al_Region #2_150_Mosaic_36_p034.tif; ; (481.9778812841424, 476.21734766840075) +Ti-7Al_Region #2_150_Mosaic_36_p033.tif; ; (963.0658219367749, 474.3954542706996) +Ti-7Al_Region #2_150_Mosaic_36_p032.tif; ; (1444.1266993948186, 472.664194028192) +Ti-7Al_Region #2_150_Mosaic_36_p031.tif; ; (1924.2151798474545, 471.33807430979704) +Ti-7Al_Region #2_150_Mosaic_36_p030.tif; ; (2404.219022903671, 469.7229548476495) +Ti-7Al_Region #2_150_Mosaic_36_p029.tif; ; (2884.2599924829865, 468.28497576573136) +Ti-7Al_Region #2_150_Mosaic_36_p028.tif; ; (3364.799020352351, 466.7112704745839) +Ti-7Al_Region #2_150_Mosaic_36_p027.tif; ; (3845.1810647598186, 465.2768036516427) +Ti-7Al_Region #2_150_Mosaic_36_p026.tif; ; (4325.492782598626, 463.7880469279319) +Ti-7Al_Region #2_150_Mosaic_36_p025.tif; ; (4805.737748236795, 462.28635492341346) +Ti-7Al_Region #2_150_Mosaic_36_p024.tif; ; (5286.495034487019, 460.9055801528836) +Ti-7Al_Region #2_150_Mosaic_36_p023.tif; ; (5766.68173481807, 459.45281463468166) +Ti-7Al_Region #2_150_Mosaic_36_p022.tif; ; (6247.554657713486, 458.07846874639597) +Ti-7Al_Region #2_150_Mosaic_36_p021.tif; ; (6727.618381403215, 456.6024719825648) +Ti-7Al_Region #2_150_Mosaic_36_p020.tif; ; (7208.199729706393, 455.10702837310464) +Ti-7Al_Region #2_150_Mosaic_36_p019.tif; ; (7688.105378843619, 453.61626846403334) +Ti-7Al_Region #2_150_Mosaic_36_p018.tif; ; (8168.302894314452, 452.0629572108325) +Ti-7Al_Region #2_150_Mosaic_36_p036.tif; ; (3.703900112689624, 956.2081383894808) +Ti-7Al_Region #2_150_Mosaic_36_p037.tif; ; (482.6226253177946, 954.4976694359439) +Ti-7Al_Region #2_150_Mosaic_36_p038.tif; ; (963.2542116490039, 952.7043326648605) +Ti-7Al_Region #2_150_Mosaic_36_p039.tif; ; (1444.1717717729275, 951.4179492864018) +Ti-7Al_Region #2_150_Mosaic_36_p040.tif; ; (1924.0832815944734, 949.8661170523299) +Ti-7Al_Region #2_150_Mosaic_36_p041.tif; ; (2403.1739484779246, 948.3310023467498) +Ti-7Al_Region #2_150_Mosaic_36_p042.tif; ; (2881.4182907762306, 946.8084212268457) +Ti-7Al_Region #2_150_Mosaic_36_p043.tif; ; (3362.3393781110244, 945.2570508077833) +Ti-7Al_Region #2_150_Mosaic_36_p044.tif; ; (3844.089354462122, 943.7931782949236) +Ti-7Al_Region #2_150_Mosaic_36_p045.tif; ; (4324.521887441444, 942.3090208441588) +Ti-7Al_Region #2_150_Mosaic_36_p046.tif; ; (4804.465727387838, 940.7923083248584) +Ti-7Al_Region #2_150_Mosaic_36_p047.tif; ; (5285.405319583195, 939.3913540215776) +Ti-7Al_Region #2_150_Mosaic_36_p048.tif; ; (5766.324972149515, 937.8130787750025) +Ti-7Al_Region #2_150_Mosaic_36_p049.tif; ; (6247.278487723179, 936.2761967693939) +Ti-7Al_Region #2_150_Mosaic_36_p050.tif; ; (6727.686012732564, 934.7756574951393) +Ti-7Al_Region #2_150_Mosaic_36_p051.tif; ; (7208.643675759102, 933.2913316878225) +Ti-7Al_Region #2_150_Mosaic_36_p052.tif; ; (7689.175641647034, 931.7577640066685) +Ti-7Al_Region #2_150_Mosaic_36_p053.tif; ; (8170.340929380793, 930.3103400499043) +Ti-7Al_Region #2_150_Mosaic_36_p071.tif; ; (5.588227602292164, 1434.929801705372) +Ti-7Al_Region #2_150_Mosaic_36_p070.tif; ; (485.7384748777996, 1433.3008223149463) +Ti-7Al_Region #2_150_Mosaic_36_p069.tif; ; (967.0741403465556, 1431.9546630342634) +Ti-7Al_Region #2_150_Mosaic_36_p068.tif; ; (1447.8319446178718, 1430.3218219805544) +Ti-7Al_Region #2_150_Mosaic_36_p067.tif; ; (1927.861999393645, 1428.8370403167767) +Ti-7Al_Region #2_150_Mosaic_36_p066.tif; ; (2407.9190302815227, 1427.1864385941374) +Ti-7Al_Region #2_150_Mosaic_36_p065.tif; ; (2888.050244928854, 1425.7417518078782) +Ti-7Al_Region #2_150_Mosaic_36_p064.tif; ; (3368.388718445088, 1424.214576399629) +Ti-7Al_Region #2_150_Mosaic_36_p063.tif; ; (3849.058026548986, 1422.7585101556774) +Ti-7Al_Region #2_150_Mosaic_36_p062.tif; ; (4329.239578671031, 1421.196964980243) +Ti-7Al_Region #2_150_Mosaic_36_p061.tif; ; (4809.524432564695, 1419.7448026837774) +Ti-7Al_Region #2_150_Mosaic_36_p060.tif; ; (5290.157193840665, 1418.308743976661) +Ti-7Al_Region #2_150_Mosaic_36_p059.tif; ; (5770.498040120001, 1416.736469835823) +Ti-7Al_Region #2_150_Mosaic_36_p058.tif; ; (6251.194028572614, 1415.3263234637807) +Ti-7Al_Region #2_150_Mosaic_36_p057.tif; ; (6731.560146707099, 1413.9473092903504) +Ti-7Al_Region #2_150_Mosaic_36_p056.tif; ; (7212.0858112558, 1412.6104352046855) +Ti-7Al_Region #2_150_Mosaic_36_p055.tif; ; (7691.943649495642, 1411.0345889236048) +Ti-7Al_Region #2_150_Mosaic_36_p054.tif; ; (8172.209959828317, 1410.1841755061962) +Ti-7Al_Region #2_150_Mosaic_36_p072.tif; ; (7.366239249579607, 1913.214772004178) +Ti-7Al_Region #2_150_Mosaic_36_p073.tif; ; (486.26020664502823, 1911.4685401128586) +Ti-7Al_Region #2_150_Mosaic_36_p074.tif; ; (967.01743766865, 1910.141470319313) +Ti-7Al_Region #2_150_Mosaic_36_p075.tif; ; (1447.7639536853658, 1908.6891945816226) +Ti-7Al_Region #2_150_Mosaic_36_p076.tif; ; (1927.8986453542802, 1907.2062949206872) +Ti-7Al_Region #2_150_Mosaic_36_p077.tif; ; (2406.2380952012904, 1905.6637693626474) +Ti-7Al_Region #2_150_Mosaic_36_p078.tif; ; (2885.1529585626063, 1904.1515256432835) +Ti-7Al_Region #2_150_Mosaic_36_p079.tif; ; (3366.142822418165, 1902.5328668906116) +Ti-7Al_Region #2_150_Mosaic_36_p080.tif; ; (3847.242719456611, 1901.0058780514921) +Ti-7Al_Region #2_150_Mosaic_36_p081.tif; ; (4327.983583216722, 1899.574879860338) +Ti-7Al_Region #2_150_Mosaic_36_p082.tif; ; (4808.18236296852, 1897.984176881716) +Ti-7Al_Region #2_150_Mosaic_36_p083.tif; ; (5288.769431790575, 1896.4691742575037) +Ti-7Al_Region #2_150_Mosaic_36_p084.tif; ; (5770.069906032024, 1894.9141610483814) +Ti-7Al_Region #2_150_Mosaic_36_p085.tif; ; (6251.015808385542, 1893.6324196933792) +Ti-7Al_Region #2_150_Mosaic_36_p086.tif; ; (6731.675220565819, 1892.2242647146836) +Ti-7Al_Region #2_150_Mosaic_36_p087.tif; ; (7212.566810655212, 1890.8670696769834) +Ti-7Al_Region #2_150_Mosaic_36_p088.tif; ; (7692.943827254991, 1889.406942679894) +Ti-7Al_Region #2_150_Mosaic_36_p089.tif; ; (8174.0236376380435, 1888.2951790852449) +Ti-7Al_Region #2_150_Mosaic_36_p107.tif; ; (9.632927690419876, 2391.737716781277) +Ti-7Al_Region #2_150_Mosaic_36_p106.tif; ; (489.87318935997354, 2390.652264925343) +Ti-7Al_Region #2_150_Mosaic_36_p105.tif; ; (970.968269680079, 2388.9234356513093) +Ti-7Al_Region #2_150_Mosaic_36_p104.tif; ; (1451.792561531405, 2387.347218687499) +Ti-7Al_Region #2_150_Mosaic_36_p103.tif; ; (1931.9909964782062, 2385.8961267557115) +Ti-7Al_Region #2_150_Mosaic_36_p102.tif; ; (2411.8249518996154, 2384.3064325255637) +Ti-7Al_Region #2_150_Mosaic_36_p101.tif; ; (2891.9928800009156, 2382.731345762913) +Ti-7Al_Region #2_150_Mosaic_36_p100.tif; ; (3372.48610744976, 2381.2393139517535) +Ti-7Al_Region #2_150_Mosaic_36_p099.tif; ; (3852.9973919432955, 2379.821697887464) +Ti-7Al_Region #2_150_Mosaic_36_p098.tif; ; (4333.339039189773, 2378.320596936231) +Ti-7Al_Region #2_150_Mosaic_36_p097.tif; ; (4813.588903586251, 2376.8898518275882) +Ti-7Al_Region #2_150_Mosaic_36_p096.tif; ; (5294.217272865946, 2375.459118593869) +Ti-7Al_Region #2_150_Mosaic_36_p095.tif; ; (5774.684993859939, 2374.1514953949936) +Ti-7Al_Region #2_150_Mosaic_36_p094.tif; ; (6255.3112393343845, 2372.6793810008335) +Ti-7Al_Region #2_150_Mosaic_36_p093.tif; ; (6735.745139870583, 2371.2671743417372) +Ti-7Al_Region #2_150_Mosaic_36_p092.tif; ; (7216.087960462393, 2370.0136588388) +Ti-7Al_Region #2_150_Mosaic_36_p091.tif; ; (7696.094723161003, 2368.7801095523228) +Ti-7Al_Region #2_150_Mosaic_36_p090.tif; ; (8176.420739123041, 2367.6953270406248) +Ti-7Al_Region #2_150_Mosaic_36_p108.tif; ; (11.786839382066901, 2870.114114250596) +Ti-7Al_Region #2_150_Mosaic_36_p109.tif; ; (490.56237413639514, 2868.480971605205) +Ti-7Al_Region #2_150_Mosaic_36_p110.tif; ; (971.2209546875607, 2867.069777970597) +Ti-7Al_Region #2_150_Mosaic_36_p111.tif; ; (1452.0335386518914, 2865.51657127921) +Ti-7Al_Region #2_150_Mosaic_36_p112.tif; ; (1932.05750110066, 2864.041084601629) +Ti-7Al_Region #2_150_Mosaic_36_p113.tif; ; (2410.1469677444, 2862.454460159908) +Ti-7Al_Region #2_150_Mosaic_36_p114.tif; ; (2889.6716434530244, 2860.90628044362) +Ti-7Al_Region #2_150_Mosaic_36_p115.tif; ; (3370.517708869384, 2859.399440475653) +Ti-7Al_Region #2_150_Mosaic_36_p116.tif; ; (3851.694772071077, 2857.8567179471243) +Ti-7Al_Region #2_150_Mosaic_36_p117.tif; ; (4332.146047046932, 2856.3742565357174) +Ti-7Al_Region #2_150_Mosaic_36_p118.tif; ; (4812.841199106838, 2854.872747527492) +Ti-7Al_Region #2_150_Mosaic_36_p119.tif; ; (5293.779792485423, 2853.4639946297702) +Ti-7Al_Region #2_150_Mosaic_36_p120.tif; ; (5774.856553663982, 2852.111471997355) +Ti-7Al_Region #2_150_Mosaic_36_p121.tif; ; (6255.5870402889395, 2850.6035853678627) +Ti-7Al_Region #2_150_Mosaic_36_p122.tif; ; (6736.114434642963, 2849.222603642177) +Ti-7Al_Region #2_150_Mosaic_36_p123.tif; ; (7217.066160983169, 2847.9641216200275) +Ti-7Al_Region #2_150_Mosaic_36_p124.tif; ; (7697.63893661837, 2846.529910996404) +Ti-7Al_Region #2_150_Mosaic_36_p125.tif; ; (8178.731981064769, 2845.2892288242733) +Ti-7Al_Region #2_150_Mosaic_36_p143.tif; ; (14.252914894061306, 3348.891413580871) +Ti-7Al_Region #2_150_Mosaic_36_p142.tif; ; (494.30330368606184, 3347.4155787117925) +Ti-7Al_Region #2_150_Mosaic_36_p141.tif; ; (975.2395588378532, 3345.895608859503) +Ti-7Al_Region #2_150_Mosaic_36_p140.tif; ; (1456.107458690051, 3344.2461848755897) +Ti-7Al_Region #2_150_Mosaic_36_p139.tif; ; (1936.2515763893152, 3342.722693944958) +Ti-7Al_Region #2_150_Mosaic_36_p138.tif; ; (2416.0969243904883, 3341.2042248177745) +Ti-7Al_Region #2_150_Mosaic_36_p137.tif; ; (2896.3973901706822, 3339.764268286978) +Ti-7Al_Region #2_150_Mosaic_36_p136.tif; ; (3376.6733223093192, 3338.1798389068927) +Ti-7Al_Region #2_150_Mosaic_36_p135.tif; ; (3857.3392629854293, 3336.7154372935784) +Ti-7Al_Region #2_150_Mosaic_36_p134.tif; ; (4337.627667170708, 3335.2176257632095) +Ti-7Al_Region #2_150_Mosaic_36_p133.tif; ; (4817.932176308446, 3333.7970917772673) +Ti-7Al_Region #2_150_Mosaic_36_p132.tif; ; (5298.578697829879, 3332.488226492204) +Ti-7Al_Region #2_150_Mosaic_36_p131.tif; ; (5779.196848774853, 3331.036029190754) +Ti-7Al_Region #2_150_Mosaic_36_p130.tif; ; (6259.711205787779, 3329.79340146357) +Ti-7Al_Region #2_150_Mosaic_36_p129.tif; ; (6740.215220596466, 3328.485660969824) +Ti-7Al_Region #2_150_Mosaic_36_p128.tif; ; (7220.457664738364, 3327.122329011209) +Ti-7Al_Region #2_150_Mosaic_36_p127.tif; ; (7700.44972418664, 3325.973186893206) +Ti-7Al_Region #2_150_Mosaic_36_p126.tif; ; (8180.8347480717575, 3324.872016026976) +Ti-7Al_Region #2_150_Mosaic_36_p144.tif; ; (16.34390704714302, 3828.510392434413) +Ti-7Al_Region #2_150_Mosaic_36_p145.tif; ; (494.92522921456026, 3826.84561602185) +Ti-7Al_Region #2_150_Mosaic_36_p146.tif; ; (975.7290324906664, 3825.309679731223) +Ti-7Al_Region #2_150_Mosaic_36_p147.tif; ; (1456.2372129872074, 3823.731636111088) +Ti-7Al_Region #2_150_Mosaic_36_p148.tif; ; (1936.380248544061, 3822.1850199603077) +Ti-7Al_Region #2_150_Mosaic_36_p149.tif; ; (2414.96502351707, 3820.6836896980612) +Ti-7Al_Region #2_150_Mosaic_36_p150.tif; ; (2894.134641788492, 3819.254925207966) +Ti-7Al_Region #2_150_Mosaic_36_p151.tif; ; (3375.1209578032067, 3817.651004823786) +Ti-7Al_Region #2_150_Mosaic_36_p152.tif; ; (3856.331905388987, 3816.1476910505608) +Ti-7Al_Region #2_150_Mosaic_36_p153.tif; ; (4336.66796816061, 3814.7541444258563) +Ti-7Al_Region #2_150_Mosaic_36_p154.tif; ; (4817.388880833286, 3813.238588497345) +Ti-7Al_Region #2_150_Mosaic_36_p155.tif; ; (5298.2518259283715, 3811.7770696066327) +Ti-7Al_Region #2_150_Mosaic_36_p156.tif; ; (5779.4174152830965, 3810.373085555297) +Ti-7Al_Region #2_150_Mosaic_36_p157.tif; ; (6260.299848608431, 3808.987780601419) +Ti-7Al_Region #2_150_Mosaic_36_p158.tif; ; (6740.857137068129, 3807.5018105174427) +Ti-7Al_Region #2_150_Mosaic_36_p159.tif; ; (7221.744362831401, 3806.390369021203) +Ti-7Al_Region #2_150_Mosaic_36_p160.tif; ; (7702.461026521053, 3805.034489244458) +Ti-7Al_Region #2_150_Mosaic_36_p161.tif; ; (8183.480794249134, 3803.5869650927116) +Ti-7Al_Region #2_150_Mosaic_36_p179.tif; ; (18.66491956289741, 4306.575311298261) +Ti-7Al_Region #2_150_Mosaic_36_p178.tif; ; (498.73183450355185, 4304.857510634276) +Ti-7Al_Region #2_150_Mosaic_36_p177.tif; ; (979.7149357568144, 4303.254010084232) +Ti-7Al_Region #2_150_Mosaic_36_p176.tif; ; (1460.6258545985052, 4301.641243636108) +Ti-7Al_Region #2_150_Mosaic_36_p175.tif; ; (1940.7631943314095, 4300.139422506796) +Ti-7Al_Region #2_150_Mosaic_36_p174.tif; ; (2420.7437164903045, 4298.626686759851) +Ti-7Al_Region #2_150_Mosaic_36_p173.tif; ; (2900.882913792882, 4297.16297774468) +Ti-7Al_Region #2_150_Mosaic_36_p172.tif; ; (3381.139639495267, 4295.584383070411) +Ti-7Al_Region #2_150_Mosaic_36_p171.tif; ; (3861.9658915440964, 4294.165594209679) +Ti-7Al_Region #2_150_Mosaic_36_p170.tif; ; (4342.301664161354, 4292.794713924736) +Ti-7Al_Region #2_150_Mosaic_36_p169.tif; ; (4822.374681823385, 4291.3636237872015) +Ti-7Al_Region #2_150_Mosaic_36_p168.tif; ; (5303.225534430026, 4289.955242419666) +Ti-7Al_Region #2_150_Mosaic_36_p167.tif; ; (5783.49672270799, 4288.48159826559) +Ti-7Al_Region #2_150_Mosaic_36_p166.tif; ; (6264.402259071857, 4287.1544571101795) +Ti-7Al_Region #2_150_Mosaic_36_p165.tif; ; (6744.779304298856, 4285.842250179715) +Ti-7Al_Region #2_150_Mosaic_36_p164.tif; ; (7225.392466612836, 4284.827669905614) +Ti-7Al_Region #2_150_Mosaic_36_p163.tif; ; (7705.590776274124, 4283.588223630547) +Ti-7Al_Region #2_150_Mosaic_36_p162.tif; ; (8185.8176710323, 4282.1660255244515) +Ti-7Al_Region #2_150_Mosaic_36_p180.tif; ; (20.388402272134, 4784.683497499286) +Ti-7Al_Region #2_150_Mosaic_36_p181.tif; ; (499.1806645936554, 4783.018704752669) +Ti-7Al_Region #2_150_Mosaic_36_p182.tif; ; (980.034221240437, 4781.454640129951) +Ti-7Al_Region #2_150_Mosaic_36_p183.tif; ; (1460.658090057068, 4779.821770862202) +Ti-7Al_Region #2_150_Mosaic_36_p184.tif; ; (1940.8550046769722, 4778.366741045509) +Ti-7Al_Region #2_150_Mosaic_36_p185.tif; ; (2419.990776171052, 4776.80331464391) +Ti-7Al_Region #2_150_Mosaic_36_p186.tif; ; (2899.052904118148, 4775.241499117376) +Ti-7Al_Region #2_150_Mosaic_36_p187.tif; ; (3379.8887028128515, 4773.733839756715) +Ti-7Al_Region #2_150_Mosaic_36_p188.tif; ; (3861.1994829326213, 4772.279635029069) +Ti-7Al_Region #2_150_Mosaic_36_p189.tif; ; (4341.480352433877, 4770.720466680986) +Ti-7Al_Region #2_150_Mosaic_36_p190.tif; ; (4822.4041182645315, 4769.348156005742) +Ti-7Al_Region #2_150_Mosaic_36_p191.tif; ; (5303.320222350138, 4767.9332307901905) +Ti-7Al_Region #2_150_Mosaic_36_p192.tif; ; (5784.366608821818, 4766.488259011789) +Ti-7Al_Region #2_150_Mosaic_36_p193.tif; ; (6264.901395648734, 4765.070010835906) +Ti-7Al_Region #2_150_Mosaic_36_p194.tif; ; (6745.729086614682, 4763.6691420404195) +Ti-7Al_Region #2_150_Mosaic_36_p195.tif; ; (7226.37224016322, 4762.396220829029) +Ti-7Al_Region #2_150_Mosaic_36_p196.tif; ; (7707.231805239909, 4760.967971510244) +Ti-7Al_Region #2_150_Mosaic_36_p197.tif; ; (8188.0592847640355, 4759.595135873259) +Ti-7Al_Region #2_150_Mosaic_36_p215.tif; ; (22.77001445140759, 5262.841062151088) +Ti-7Al_Region #2_150_Mosaic_36_p214.tif; ; (503.1417864926609, 5261.410521790791) +Ti-7Al_Region #2_150_Mosaic_36_p213.tif; ; (984.020754881761, 5259.939183135118) +Ti-7Al_Region #2_150_Mosaic_36_p212.tif; ; (1465.0584911417382, 5258.291567899938) +Ti-7Al_Region #2_150_Mosaic_36_p211.tif; ; (1945.2039476785965, 5256.818322719233) +Ti-7Al_Region #2_150_Mosaic_36_p210.tif; ; (2424.996927803082, 5255.273515779542) +Ti-7Al_Region #2_150_Mosaic_36_p209.tif; ; (2905.328148537549, 5253.832808417882) +Ti-7Al_Region #2_150_Mosaic_36_p208.tif; ; (3385.79305376645, 5252.35274057111) +Ti-7Al_Region #2_150_Mosaic_36_p207.tif; ; (3866.551290357396, 5250.930145475016) +Ti-7Al_Region #2_150_Mosaic_36_p206.tif; ; (4346.888492678264, 5249.524527677481) +Ti-7Al_Region #2_150_Mosaic_36_p205.tif; ; (4827.139179784087, 5248.329772346326) +Ti-7Al_Region #2_150_Mosaic_36_p204.tif; ; (5307.485986516538, 5246.724836217809) +Ti-7Al_Region #2_150_Mosaic_36_p203.tif; ; (5788.24850977849, 5245.3760410073955) +Ti-7Al_Region #2_150_Mosaic_36_p202.tif; ; (6269.104956689756, 5244.042150347195) +Ti-7Al_Region #2_150_Mosaic_36_p201.tif; ; (6749.539094650673, 5242.786815888126) +Ti-7Al_Region #2_150_Mosaic_36_p200.tif; ; (7230.163535517439, 5241.6503555888285) +Ti-7Al_Region #2_150_Mosaic_36_p199.tif; ; (7710.188814779744, 5240.373419334583) +Ti-7Al_Region #2_150_Mosaic_36_p198.tif; ; (8190.252379293269, 5239.034286915906) +Ti-7Al_Region #2_150_Mosaic_36_p216.tif; ; (24.787899935023646, 5742.263686795186) +Ti-7Al_Region #2_150_Mosaic_36_p217.tif; ; (503.66098174489593, 5740.801681363379) +Ti-7Al_Region #2_150_Mosaic_36_p218.tif; ; (984.2436954282532, 5739.1409188579255) +Ti-7Al_Region #2_150_Mosaic_36_p219.tif; ; (1465.2584774583254, 5737.484804319505) +Ti-7Al_Region #2_150_Mosaic_36_p220.tif; ; (1945.1973239348454, 5736.070619762209) +Ti-7Al_Region #2_150_Mosaic_36_p221.tif; ; (2424.3997852361717, 5734.5129134684075) +Ti-7Al_Region #2_150_Mosaic_36_p222.tif; ; (2903.6858325181097, 5733.141138969713) +Ti-7Al_Region #2_150_Mosaic_36_p223.tif; ; (3384.618153618703, 5731.615371522488) +Ti-7Al_Region #2_150_Mosaic_36_p224.tif; ; (3865.9241124066775, 5730.220138739541) +Ti-7Al_Region #2_150_Mosaic_36_p225.tif; ; (4346.24649149125, 5728.766505605346) +Ti-7Al_Region #2_150_Mosaic_36_p226.tif; ; (4826.975291788124, 5727.163967222844) +Ti-7Al_Region #2_150_Mosaic_36_p227.tif; ; (5308.002797710733, 5725.875894692768) +Ti-7Al_Region #2_150_Mosaic_36_p228.tif; ; (5788.964236356447, 5724.39181182546) +Ti-7Al_Region #2_150_Mosaic_36_p229.tif; ; (6269.423707250978, 5723.024135350888) +Ti-7Al_Region #2_150_Mosaic_36_p230.tif; ; (6750.192067367405, 5721.598440610282) +Ti-7Al_Region #2_150_Mosaic_36_p231.tif; ; (7231.278358971241, 5720.184439976645) +Ti-7Al_Region #2_150_Mosaic_36_p232.tif; ; (7711.79493116058, 5718.786668618148) +Ti-7Al_Region #2_150_Mosaic_36_p233.tif; ; (8192.76611920025, 5717.177540190328) +Ti-7Al_Region #2_150_Mosaic_36_p251.tif; ; (27.482332547151685, 6218.656657031366) +Ti-7Al_Region #2_150_Mosaic_36_p250.tif; ; (507.8364253658232, 6217.137977448376) +Ti-7Al_Region #2_150_Mosaic_36_p249.tif; ; (988.7381580739731, 6215.456435601772) +Ti-7Al_Region #2_150_Mosaic_36_p248.tif; ; (1469.6230986482556, 6213.88877109317) +Ti-7Al_Region #2_150_Mosaic_36_p247.tif; ; (1949.8103050847542, 6212.531866749592) +Ti-7Al_Region #2_150_Mosaic_36_p246.tif; ; (2429.6686233654787, 6210.922423843431) +Ti-7Al_Region #2_150_Mosaic_36_p245.tif; ; (2909.9930116197156, 6209.504929051106) +Ti-7Al_Region #2_150_Mosaic_36_p244.tif; ; (3390.672599404865, 6207.930477823533) +Ti-7Al_Region #2_150_Mosaic_36_p243.tif; ; (3871.2206157357764, 6206.71004029659) +Ti-7Al_Region #2_150_Mosaic_36_p242.tif; ; (4351.7695617623185, 6205.2134206551855) +Ti-7Al_Region #2_150_Mosaic_36_p241.tif; ; (4832.015693914739, 6203.728205721717) +Ti-7Al_Region #2_150_Mosaic_36_p240.tif; ; (5312.562233282163, 6202.327167319097) +Ti-7Al_Region #2_150_Mosaic_36_p239.tif; ; (5792.631566765329, 6200.867118066447) +Ti-7Al_Region #2_150_Mosaic_36_p238.tif; ; (6273.621853011655, 6199.634006857612) +Ti-7Al_Region #2_150_Mosaic_36_p237.tif; ; (6754.040148143318, 6198.137983744162) +Ti-7Al_Region #2_150_Mosaic_36_p236.tif; ; (7234.64848703797, 6196.861670538366) +Ti-7Al_Region #2_150_Mosaic_36_p235.tif; ; (7714.996951521638, 6195.379947822114) +Ti-7Al_Region #2_150_Mosaic_36_p234.tif; ; (8195.150114841743, 6193.997761053551) +Ti-7Al_Region #2_150_Mosaic_36_p252.tif; ; (29.376708180676587, 6696.906087783732) +Ti-7Al_Region #2_150_Mosaic_36_p253.tif; ; (507.9672345524341, 6695.244700131151) +Ti-7Al_Region #2_150_Mosaic_36_p254.tif; ; (989.1039717348751, 6693.715563622655) +Ti-7Al_Region #2_150_Mosaic_36_p255.tif; ; (1470.0946288985874, 6692.059454992546) +Ti-7Al_Region #2_150_Mosaic_36_p256.tif; ; (1949.9472088136786, 6690.544228871302) +Ti-7Al_Region #2_150_Mosaic_36_p257.tif; ; (2428.464539651655, 6689.03758649751) +Ti-7Al_Region #2_150_Mosaic_36_p258.tif; ; (2908.678447521267, 6687.4579251441155) +Ti-7Al_Region #2_150_Mosaic_36_p259.tif; ; (3389.9203513375214, 6686.211622181724) +Ti-7Al_Region #2_150_Mosaic_36_p260.tif; ; (3870.9371636735873, 6684.616238145061) +Ti-7Al_Region #2_150_Mosaic_36_p261.tif; ; (4351.696719951649, 6683.1523544795955) +Ti-7Al_Region #2_150_Mosaic_36_p262.tif; ; (4832.206981612392, 6681.625566511298) +Ti-7Al_Region #2_150_Mosaic_36_p263.tif; ; (5313.2261977212565, 6679.988462245391) +Ti-7Al_Region #2_150_Mosaic_36_p264.tif; ; (5793.872159078906, 6678.70715337606) +Ti-7Al_Region #2_150_Mosaic_36_p265.tif; ; (6274.7734369313075, 6676.958619277133) +Ti-7Al_Region #2_150_Mosaic_36_p266.tif; ; (6755.605475047003, 6675.377665078594) +Ti-7Al_Region #2_150_Mosaic_36_p267.tif; ; (7236.343173940146, 6673.683075940617) +Ti-7Al_Region #2_150_Mosaic_36_p268.tif; ; (7716.900529140991, 6672.113178951118) +Ti-7Al_Region #2_150_Mosaic_36_p269.tif; ; (8197.894697535523, 6670.264057215935) +Ti-7Al_Region #2_150_Mosaic_36_p287.tif; ; (31.79034649561335, 7176.430249987445) +Ti-7Al_Region #2_150_Mosaic_36_p286.tif; ; (512.1765428393669, 7174.6685633566285) +Ti-7Al_Region #2_150_Mosaic_36_p285.tif; ; (993.0687857306494, 7172.857598667151) +Ti-7Al_Region #2_150_Mosaic_36_p284.tif; ; (1474.2679070828217, 7171.462519767443) +Ti-7Al_Region #2_150_Mosaic_36_p283.tif; ; (1954.4844142710274, 7169.801674615452) +Ti-7Al_Region #2_150_Mosaic_36_p282.tif; ; (2434.2555158050045, 7168.2403249024155) +Ti-7Al_Region #2_150_Mosaic_36_p281.tif; ; (2914.775748695993, 7166.975048394851) +Ti-7Al_Region #2_150_Mosaic_36_p280.tif; ; (3395.310421457156, 7165.575919213378) +Ti-7Al_Region #2_150_Mosaic_36_p279.tif; ; (3875.934095438297, 7163.940775192593) +Ti-7Al_Region #2_150_Mosaic_36_p278.tif; ; (4356.294464261537, 7162.479111930408) +Ti-7Al_Region #2_150_Mosaic_36_p277.tif; ; (4836.413328300753, 7160.618343606866) +Ti-7Al_Region #2_150_Mosaic_36_p276.tif; ; (5317.381090634201, 7159.798962889653) +Ti-7Al_Region #2_150_Mosaic_36_p275.tif; ; (5797.405001104493, 7158.039789063083) +Ti-7Al_Region #2_150_Mosaic_36_p274.tif; ; (6278.4225693023745, 7156.350982936161) +Ti-7Al_Region #2_150_Mosaic_36_p273.tif; ; (6758.59358604783, 7154.682888094282) +Ti-7Al_Region #2_150_Mosaic_36_p272.tif; ; (7239.242909357374, 7153.077801894729) +Ti-7Al_Region #2_150_Mosaic_36_p271.tif; ; (7719.61979680224, 7151.605380681369) +Ti-7Al_Region #2_150_Mosaic_36_p270.tif; ; (8199.91410380765, 7150.167184374136) +Ti-7Al_Region #2_150_Mosaic_36_p288.tif; ; (33.729214078963466, 7656.664882523882) +Ti-7Al_Region #2_150_Mosaic_36_p289.tif; ; (512.3612647506897, 7654.8069844049005) +Ti-7Al_Region #2_150_Mosaic_36_p290.tif; ; (993.2791479654134, 7653.146946890708) +Ti-7Al_Region #2_150_Mosaic_36_p291.tif; ; (1474.3387282484948, 7651.637241650233) +Ti-7Al_Region #2_150_Mosaic_36_p292.tif; ; (1954.6472224653514, 7649.9597700814375) +Ti-7Al_Region #2_150_Mosaic_36_p293.tif; ; (2434.1099658992016, 7648.892532663138) +Ti-7Al_Region #2_150_Mosaic_36_p294.tif; ; (2913.6315695442613, 7647.331210047611) +Ti-7Al_Region #2_150_Mosaic_36_p295.tif; ; (3394.1555800294886, 7645.572709968323) +Ti-7Al_Region #2_150_Mosaic_36_p296.tif; ; (3875.6958165682377, 7644.135275509144) +Ti-7Al_Region #2_150_Mosaic_36_p297.tif; ; (4356.0091138741755, 7642.547489081542) +Ti-7Al_Region #2_150_Mosaic_36_p298.tif; ; (4836.680154884224, 7641.07197201625) +Ti-7Al_Region #2_150_Mosaic_36_p299.tif; ; (5317.541150591542, 7639.93648056688) +Ti-7Al_Region #2_150_Mosaic_36_p300.tif; ; (5798.424891273591, 7638.072085792112) +Ti-7Al_Region #2_150_Mosaic_36_p301.tif; ; (6279.239632266459, 7636.3535436553175) +Ti-7Al_Region #2_150_Mosaic_36_p302.tif; ; (6759.826825093774, 7634.660329531078) +Ti-7Al_Region #2_150_Mosaic_36_p303.tif; ; (7240.642109966077, 7632.95743070004) +Ti-7Al_Region #2_150_Mosaic_36_p304.tif; ; (7721.070736135312, 7631.088458586923) +Ti-7Al_Region #2_150_Mosaic_36_p305.tif; ; (8201.869937178864, 7629.450479990619) +Ti-7Al_Region #2_150_Mosaic_36_p323.tif; ; (35.78541890706276, 8134.670171814069) +Ti-7Al_Region #2_150_Mosaic_36_p322.tif; ; (516.1046960382473, 8132.86327180336) +Ti-7Al_Region #2_150_Mosaic_36_p321.tif; ; (997.258696964716, 8131.200355727378) +Ti-7Al_Region #2_150_Mosaic_36_p320.tif; ; (1478.3814311328183, 8129.636029386258) +Ti-7Al_Region #2_150_Mosaic_36_p319.tif; ; (1958.811615259157, 8128.121490725033) +Ti-7Al_Region #2_150_Mosaic_36_p318.tif; ; (2438.6875680632334, 8126.807564137156) +Ti-7Al_Region #2_150_Mosaic_36_p317.tif; ; (2919.1227542897723, 8125.280517757573) +Ti-7Al_Region #2_150_Mosaic_36_p316.tif; ; (3399.669225394061, 8123.824235294408) +Ti-7Al_Region #2_150_Mosaic_36_p315.tif; ; (3880.473758998455, 8122.2684881511495) +Ti-7Al_Region #2_150_Mosaic_36_p314.tif; ; (4360.125060214415, 8120.476422510012) +Ti-7Al_Region #2_150_Mosaic_36_p313.tif; ; (4840.343602549906, 8118.858591332563) +Ti-7Al_Region #2_150_Mosaic_36_p312.tif; ; (5321.298923127339, 8117.568213674585) +Ti-7Al_Region #2_150_Mosaic_36_p311.tif; ; (5801.751951685183, 8116.014910603519) +Ti-7Al_Region #2_150_Mosaic_36_p310.tif; ; (6282.326515076225, 8114.311187134341) +Ti-7Al_Region #2_150_Mosaic_36_p309.tif; ; (6762.7028879544005, 8112.593771790269) +Ti-7Al_Region #2_150_Mosaic_36_p308.tif; ; (7243.30498606546, 8110.887460094567) +Ti-7Al_Region #2_150_Mosaic_36_p307.tif; ; (7723.6078292558395, 8109.130457089615) +Ti-7Al_Region #2_150_Mosaic_36_p306.tif; ; (8203.846105635686, 8107.363130204017) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.txt new file mode 100644 index 000000000000..70a51d85b083 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36/Ti-7Al_Region #2_150_Mosaic_36.tif_Files/TileConfiguration.txt @@ -0,0 +1,328 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +Ti-7Al_Region #2_150_Mosaic_36_p000.tif; ; (0.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p001.tif; ; (480.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p002.tif; ; (960.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p003.tif; ; (1440.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p004.tif; ; (1920.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p005.tif; ; (2400.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p006.tif; ; (2880.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p007.tif; ; (3360.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p008.tif; ; (3840.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p009.tif; ; (4320.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p010.tif; ; (4800.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p011.tif; ; (5280.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p012.tif; ; (5760.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p013.tif; ; (6240.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p014.tif; ; (6720.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p015.tif; ; (7200.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p016.tif; ; (7680.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p017.tif; ; (8160.0, 0.0) +Ti-7Al_Region #2_150_Mosaic_36_p035.tif; ; (0.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p034.tif; ; (480.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p033.tif; ; (960.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p032.tif; ; (1440.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p031.tif; ; (1920.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p030.tif; ; (2400.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p029.tif; ; (2880.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p028.tif; ; (3360.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p027.tif; ; (3840.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p026.tif; ; (4320.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p025.tif; ; (4800.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p024.tif; ; (5280.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p023.tif; ; (5760.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p022.tif; ; (6240.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p021.tif; ; (6720.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p020.tif; ; (7200.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p019.tif; ; (7680.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p018.tif; ; (8160.0, 480.0) +Ti-7Al_Region #2_150_Mosaic_36_p036.tif; ; (0.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p037.tif; ; (480.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p038.tif; ; (960.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p039.tif; ; (1440.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p040.tif; ; (1920.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p041.tif; ; (2400.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p042.tif; ; (2880.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p043.tif; ; (3360.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p044.tif; ; (3840.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p045.tif; ; (4320.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p046.tif; ; (4800.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p047.tif; ; (5280.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p048.tif; ; (5760.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p049.tif; ; (6240.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p050.tif; ; (6720.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p051.tif; ; (7200.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p052.tif; ; (7680.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p053.tif; ; (8160.0, 960.0) +Ti-7Al_Region #2_150_Mosaic_36_p071.tif; ; (0.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p070.tif; ; (480.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p069.tif; ; (960.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p068.tif; ; (1440.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p067.tif; ; (1920.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p066.tif; ; (2400.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p065.tif; ; (2880.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p064.tif; ; (3360.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p063.tif; ; (3840.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p062.tif; ; (4320.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p061.tif; ; (4800.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p060.tif; ; (5280.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p059.tif; ; (5760.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p058.tif; ; (6240.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p057.tif; ; (6720.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p056.tif; ; (7200.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p055.tif; ; (7680.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p054.tif; ; (8160.0, 1440.0) +Ti-7Al_Region #2_150_Mosaic_36_p072.tif; ; (0.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p073.tif; ; (480.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p074.tif; ; (960.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p075.tif; ; (1440.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p076.tif; ; (1920.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p077.tif; ; (2400.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p078.tif; ; (2880.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p079.tif; ; (3360.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p080.tif; ; (3840.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p081.tif; ; (4320.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p082.tif; ; (4800.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p083.tif; ; (5280.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p084.tif; ; (5760.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p085.tif; ; (6240.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p086.tif; ; (6720.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p087.tif; ; (7200.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p088.tif; ; (7680.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p089.tif; ; (8160.0, 1920.0) +Ti-7Al_Region #2_150_Mosaic_36_p107.tif; ; (0.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p106.tif; ; (480.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p105.tif; ; (960.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p104.tif; ; (1440.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p103.tif; ; (1920.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p102.tif; ; (2400.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p101.tif; ; (2880.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p100.tif; ; (3360.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p099.tif; ; (3840.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p098.tif; ; (4320.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p097.tif; ; (4800.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p096.tif; ; (5280.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p095.tif; ; (5760.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p094.tif; ; (6240.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p093.tif; ; (6720.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p092.tif; ; (7200.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p091.tif; ; (7680.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p090.tif; ; (8160.0, 2400.0) +Ti-7Al_Region #2_150_Mosaic_36_p108.tif; ; (0.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p109.tif; ; (480.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p110.tif; ; (960.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p111.tif; ; (1440.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p112.tif; ; (1920.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p113.tif; ; (2400.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p114.tif; ; (2880.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p115.tif; ; (3360.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p116.tif; ; (3840.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p117.tif; ; (4320.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p118.tif; ; (4800.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p119.tif; ; (5280.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p120.tif; ; (5760.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p121.tif; ; (6240.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p122.tif; ; (6720.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p123.tif; ; (7200.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p124.tif; ; (7680.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p125.tif; ; (8160.0, 2880.0) +Ti-7Al_Region #2_150_Mosaic_36_p143.tif; ; (0.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p142.tif; ; (480.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p141.tif; ; (960.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p140.tif; ; (1440.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p139.tif; ; (1920.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p138.tif; ; (2400.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p137.tif; ; (2880.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p136.tif; ; (3360.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p135.tif; ; (3840.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p134.tif; ; (4320.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p133.tif; ; (4800.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p132.tif; ; (5280.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p131.tif; ; (5760.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p130.tif; ; (6240.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p129.tif; ; (6720.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p128.tif; ; (7200.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p127.tif; ; (7680.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p126.tif; ; (8160.0, 3360.0) +Ti-7Al_Region #2_150_Mosaic_36_p144.tif; ; (0.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p145.tif; ; (480.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p146.tif; ; (960.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p147.tif; ; (1440.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p148.tif; ; (1920.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p149.tif; ; (2400.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p150.tif; ; (2880.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p151.tif; ; (3360.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p152.tif; ; (3840.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p153.tif; ; (4320.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p154.tif; ; (4800.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p155.tif; ; (5280.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p156.tif; ; (5760.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p157.tif; ; (6240.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p158.tif; ; (6720.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p159.tif; ; (7200.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p160.tif; ; (7680.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p161.tif; ; (8160.0, 3840.0) +Ti-7Al_Region #2_150_Mosaic_36_p179.tif; ; (0.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p178.tif; ; (480.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p177.tif; ; (960.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p176.tif; ; (1440.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p175.tif; ; (1920.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p174.tif; ; (2400.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p173.tif; ; (2880.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p172.tif; ; (3360.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p171.tif; ; (3840.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p170.tif; ; (4320.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p169.tif; ; (4800.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p168.tif; ; (5280.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p167.tif; ; (5760.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p166.tif; ; (6240.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p165.tif; ; (6720.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p164.tif; ; (7200.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p163.tif; ; (7680.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p162.tif; ; (8160.0, 4320.0) +Ti-7Al_Region #2_150_Mosaic_36_p180.tif; ; (0.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p181.tif; ; (480.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p182.tif; ; (960.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p183.tif; ; (1440.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p184.tif; ; (1920.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p185.tif; ; (2400.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p186.tif; ; (2880.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p187.tif; ; (3360.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p188.tif; ; (3840.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p189.tif; ; (4320.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p190.tif; ; (4800.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p191.tif; ; (5280.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p192.tif; ; (5760.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p193.tif; ; (6240.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p194.tif; ; (6720.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p195.tif; ; (7200.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p196.tif; ; (7680.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p197.tif; ; (8160.0, 4800.0) +Ti-7Al_Region #2_150_Mosaic_36_p215.tif; ; (0.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p214.tif; ; (480.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p213.tif; ; (960.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p212.tif; ; (1440.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p211.tif; ; (1920.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p210.tif; ; (2400.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p209.tif; ; (2880.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p208.tif; ; (3360.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p207.tif; ; (3840.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p206.tif; ; (4320.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p205.tif; ; (4800.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p204.tif; ; (5280.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p203.tif; ; (5760.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p202.tif; ; (6240.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p201.tif; ; (6720.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p200.tif; ; (7200.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p199.tif; ; (7680.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p198.tif; ; (8160.0, 5280.0) +Ti-7Al_Region #2_150_Mosaic_36_p216.tif; ; (0.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p217.tif; ; (480.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p218.tif; ; (960.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p219.tif; ; (1440.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p220.tif; ; (1920.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p221.tif; ; (2400.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p222.tif; ; (2880.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p223.tif; ; (3360.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p224.tif; ; (3840.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p225.tif; ; (4320.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p226.tif; ; (4800.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p227.tif; ; (5280.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p228.tif; ; (5760.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p229.tif; ; (6240.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p230.tif; ; (6720.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p231.tif; ; (7200.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p232.tif; ; (7680.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p233.tif; ; (8160.0, 5760.0) +Ti-7Al_Region #2_150_Mosaic_36_p251.tif; ; (0.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p250.tif; ; (480.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p249.tif; ; (960.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p248.tif; ; (1440.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p247.tif; ; (1920.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p246.tif; ; (2400.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p245.tif; ; (2880.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p244.tif; ; (3360.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p243.tif; ; (3840.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p242.tif; ; (4320.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p241.tif; ; (4800.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p240.tif; ; (5280.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p239.tif; ; (5760.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p238.tif; ; (6240.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p237.tif; ; (6720.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p236.tif; ; (7200.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p235.tif; ; (7680.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p234.tif; ; (8160.0, 6240.0) +Ti-7Al_Region #2_150_Mosaic_36_p252.tif; ; (0.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p253.tif; ; (480.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p254.tif; ; (960.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p255.tif; ; (1440.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p256.tif; ; (1920.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p257.tif; ; (2400.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p258.tif; ; (2880.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p259.tif; ; (3360.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p260.tif; ; (3840.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p261.tif; ; (4320.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p262.tif; ; (4800.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p263.tif; ; (5280.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p264.tif; ; (5760.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p265.tif; ; (6240.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p266.tif; ; (6720.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p267.tif; ; (7200.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p268.tif; ; (7680.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p269.tif; ; (8160.0, 6720.0) +Ti-7Al_Region #2_150_Mosaic_36_p287.tif; ; (0.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p286.tif; ; (480.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p285.tif; ; (960.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p284.tif; ; (1440.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p283.tif; ; (1920.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p282.tif; ; (2400.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p281.tif; ; (2880.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p280.tif; ; (3360.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p279.tif; ; (3840.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p278.tif; ; (4320.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p277.tif; ; (4800.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p276.tif; ; (5280.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p275.tif; ; (5760.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p274.tif; ; (6240.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p273.tif; ; (6720.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p272.tif; ; (7200.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p271.tif; ; (7680.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p270.tif; ; (8160.0, 7200.0) +Ti-7Al_Region #2_150_Mosaic_36_p288.tif; ; (0.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p289.tif; ; (480.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p290.tif; ; (960.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p291.tif; ; (1440.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p292.tif; ; (1920.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p293.tif; ; (2400.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p294.tif; ; (2880.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p295.tif; ; (3360.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p296.tif; ; (3840.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p297.tif; ; (4320.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p298.tif; ; (4800.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p299.tif; ; (5280.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p300.tif; ; (5760.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p301.tif; ; (6240.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p302.tif; ; (6720.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p303.tif; ; (7200.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p304.tif; ; (7680.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p305.tif; ; (8160.0, 7680.0) +Ti-7Al_Region #2_150_Mosaic_36_p323.tif; ; (0.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p322.tif; ; (480.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p321.tif; ; (960.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p320.tif; ; (1440.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p319.tif; ; (1920.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p318.tif; ; (2400.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p317.tif; ; (2880.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p316.tif; ; (3360.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p315.tif; ; (3840.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p314.tif; ; (4320.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p313.tif; ; (4800.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p312.tif; ; (5280.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p311.tif; ; (5760.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p310.tif; ; (6240.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p309.tif; ; (6720.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p308.tif; ; (7200.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p307.tif; ; (7680.0, 8160.0) +Ti-7Al_Region #2_150_Mosaic_36_p306.tif; ; (8160.0, 8160.0) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.registered.txt new file mode 100644 index 000000000000..e1e1ca818f9c --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.registered.txt @@ -0,0 +1,328 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +1000.tif; ; (0.0, 0.0) +1001.tif; ; (478.941022238986, -1.6801423852366544) +1002.tif; ; (959.7814996006339, -3.371639313097841) +1003.tif; ; (1440.3455824046434, -4.940441491668548) +1004.tif; ; (1920.4714500307327, -6.184691836076395) +1005.tif; ; (2399.9527753009334, -7.669913726249405) +1006.tif; ; (2877.8996309309427, -9.058866488098055) +1007.tif; ; (3358.3513288499726, -10.653240086260288) +1008.tif; ; (3840.234172740696, -12.135583219614587) +1009.tif; ; (4320.656980004847, -13.629113483880033) +1010.tif; ; (4800.676838852707, -15.041380505383238) +1011.tif; ; (5281.529647008541, -16.54453687094737) +1012.tif; ; (5762.565796679466, -18.032277007961362) +1013.tif; ; (6243.548061281286, -19.448232993388686) +1014.tif; ; (6724.037834372854, -21.173941578842808) +1015.tif; ; (7204.8524945689605, -22.678978070206004) +1016.tif; ; (7685.250195491388, -24.229928930186905) +1017.tif; ; (8166.404915852445, -25.90193089063895) +1035.tif; ; (1.8512222444150837, 478.0672923435394) +1034.tif; ; (481.9778812841424, 476.21734766840075) +1033.tif; ; (963.0658219367749, 474.3954542706996) +1032.tif; ; (1444.1266993948186, 472.664194028192) +1031.tif; ; (1924.2151798474545, 471.33807430979704) +1030.tif; ; (2404.219022903671, 469.7229548476495) +1029.tif; ; (2884.2599924829865, 468.28497576573136) +1028.tif; ; (3364.799020352351, 466.7112704745839) +1027.tif; ; (3845.1810647598186, 465.2768036516427) +1026.tif; ; (4325.492782598626, 463.7880469279319) +1025.tif; ; (4805.737748236795, 462.28635492341346) +1024.tif; ; (5286.495034487019, 460.9055801528836) +1023.tif; ; (5766.68173481807, 459.45281463468166) +1022.tif; ; (6247.554657713486, 458.07846874639597) +1021.tif; ; (6727.618381403215, 456.6024719825648) +1020.tif; ; (7208.199729706393, 455.10702837310464) +1019.tif; ; (7688.105378843619, 453.61626846403334) +1018.tif; ; (8168.302894314452, 452.0629572108325) +1036.tif; ; (3.703900112689624, 956.2081383894808) +1037.tif; ; (482.6226253177946, 954.4976694359439) +1038.tif; ; (963.2542116490039, 952.7043326648605) +1039.tif; ; (1444.1717717729275, 951.4179492864018) +1040.tif; ; (1924.0832815944734, 949.8661170523299) +1041.tif; ; (2403.1739484779246, 948.3310023467498) +1042.tif; ; (2881.4182907762306, 946.8084212268457) +1043.tif; ; (3362.3393781110244, 945.2570508077833) +1044.tif; ; (3844.089354462122, 943.7931782949236) +1045.tif; ; (4324.521887441444, 942.3090208441588) +1046.tif; ; (4804.465727387838, 940.7923083248584) +1047.tif; ; (5285.405319583195, 939.3913540215776) +1048.tif; ; (5766.324972149515, 937.8130787750025) +1049.tif; ; (6247.278487723179, 936.2761967693939) +1050.tif; ; (6727.686012732564, 934.7756574951393) +1051.tif; ; (7208.643675759102, 933.2913316878225) +1052.tif; ; (7689.175641647034, 931.7577640066685) +1053.tif; ; (8170.340929380793, 930.3103400499043) +1071.tif; ; (5.588227602292164, 1434.929801705372) +1070.tif; ; (485.7384748777996, 1433.3008223149463) +1069.tif; ; (967.0741403465556, 1431.9546630342634) +1068.tif; ; (1447.8319446178718, 1430.3218219805544) +1067.tif; ; (1927.861999393645, 1428.8370403167767) +1066.tif; ; (2407.9190302815227, 1427.1864385941374) +1065.tif; ; (2888.050244928854, 1425.7417518078782) +1064.tif; ; (3368.388718445088, 1424.214576399629) +1063.tif; ; (3849.058026548986, 1422.7585101556774) +1062.tif; ; (4329.239578671031, 1421.196964980243) +1061.tif; ; (4809.524432564695, 1419.7448026837774) +1060.tif; ; (5290.157193840665, 1418.308743976661) +1059.tif; ; (5770.498040120001, 1416.736469835823) +1058.tif; ; (6251.194028572614, 1415.3263234637807) +1057.tif; ; (6731.560146707099, 1413.9473092903504) +1056.tif; ; (7212.0858112558, 1412.6104352046855) +1055.tif; ; (7691.943649495642, 1411.0345889236048) +1054.tif; ; (8172.209959828317, 1410.1841755061962) +1072.tif; ; (7.366239249579607, 1913.214772004178) +1073.tif; ; (486.26020664502823, 1911.4685401128586) +1074.tif; ; (967.01743766865, 1910.141470319313) +1075.tif; ; (1447.7639536853658, 1908.6891945816226) +1076.tif; ; (1927.8986453542802, 1907.2062949206872) +1077.tif; ; (2406.2380952012904, 1905.6637693626474) +1078.tif; ; (2885.1529585626063, 1904.1515256432835) +1079.tif; ; (3366.142822418165, 1902.5328668906116) +1080.tif; ; (3847.242719456611, 1901.0058780514921) +1081.tif; ; (4327.983583216722, 1899.574879860338) +1082.tif; ; (4808.18236296852, 1897.984176881716) +1083.tif; ; (5288.769431790575, 1896.4691742575037) +1084.tif; ; (5770.069906032024, 1894.9141610483814) +1085.tif; ; (6251.015808385542, 1893.6324196933792) +1086.tif; ; (6731.675220565819, 1892.2242647146836) +1087.tif; ; (7212.566810655212, 1890.8670696769834) +1088.tif; ; (7692.943827254991, 1889.406942679894) +1089.tif; ; (8174.0236376380435, 1888.2951790852449) +1107.tif; ; (9.632927690419876, 2391.737716781277) +1106.tif; ; (489.87318935997354, 2390.652264925343) +1105.tif; ; (970.968269680079, 2388.9234356513093) +1104.tif; ; (1451.792561531405, 2387.347218687499) +1103.tif; ; (1931.9909964782062, 2385.8961267557115) +1102.tif; ; (2411.8249518996154, 2384.3064325255637) +1101.tif; ; (2891.9928800009156, 2382.731345762913) +1100.tif; ; (3372.48610744976, 2381.2393139517535) +1099.tif; ; (3852.9973919432955, 2379.821697887464) +1098.tif; ; (4333.339039189773, 2378.320596936231) +1097.tif; ; (4813.588903586251, 2376.8898518275882) +1096.tif; ; (5294.217272865946, 2375.459118593869) +1095.tif; ; (5774.684993859939, 2374.1514953949936) +1094.tif; ; (6255.3112393343845, 2372.6793810008335) +1093.tif; ; (6735.745139870583, 2371.2671743417372) +1092.tif; ; (7216.087960462393, 2370.0136588388) +1091.tif; ; (7696.094723161003, 2368.7801095523228) +1090.tif; ; (8176.420739123041, 2367.6953270406248) +1108.tif; ; (11.786839382066901, 2870.114114250596) +1109.tif; ; (490.56237413639514, 2868.480971605205) +1110.tif; ; (971.2209546875607, 2867.069777970597) +1111.tif; ; (1452.0335386518914, 2865.51657127921) +1112.tif; ; (1932.05750110066, 2864.041084601629) +1113.tif; ; (2410.1469677444, 2862.454460159908) +1114.tif; ; (2889.6716434530244, 2860.90628044362) +1115.tif; ; (3370.517708869384, 2859.399440475653) +1116.tif; ; (3851.694772071077, 2857.8567179471243) +1117.tif; ; (4332.146047046932, 2856.3742565357174) +1118.tif; ; (4812.841199106838, 2854.872747527492) +1119.tif; ; (5293.779792485423, 2853.4639946297702) +1120.tif; ; (5774.856553663982, 2852.111471997355) +1121.tif; ; (6255.5870402889395, 2850.6035853678627) +1122.tif; ; (6736.114434642963, 2849.222603642177) +1123.tif; ; (7217.066160983169, 2847.9641216200275) +1124.tif; ; (7697.63893661837, 2846.529910996404) +1125.tif; ; (8178.731981064769, 2845.2892288242733) +1143.tif; ; (14.252914894061306, 3348.891413580871) +1142.tif; ; (494.30330368606184, 3347.4155787117925) +1141.tif; ; (975.2395588378532, 3345.895608859503) +1140.tif; ; (1456.107458690051, 3344.2461848755897) +1139.tif; ; (1936.2515763893152, 3342.722693944958) +1138.tif; ; (2416.0969243904883, 3341.2042248177745) +1137.tif; ; (2896.3973901706822, 3339.764268286978) +1136.tif; ; (3376.6733223093192, 3338.1798389068927) +1135.tif; ; (3857.3392629854293, 3336.7154372935784) +1134.tif; ; (4337.627667170708, 3335.2176257632095) +1133.tif; ; (4817.932176308446, 3333.7970917772673) +1132.tif; ; (5298.578697829879, 3332.488226492204) +1131.tif; ; (5779.196848774853, 3331.036029190754) +1130.tif; ; (6259.711205787779, 3329.79340146357) +1129.tif; ; (6740.215220596466, 3328.485660969824) +1128.tif; ; (7220.457664738364, 3327.122329011209) +1127.tif; ; (7700.44972418664, 3325.973186893206) +1126.tif; ; (8180.8347480717575, 3324.872016026976) +1144.tif; ; (16.34390704714302, 3828.510392434413) +1145.tif; ; (494.92522921456026, 3826.84561602185) +1146.tif; ; (975.7290324906664, 3825.309679731223) +1147.tif; ; (1456.2372129872074, 3823.731636111088) +1148.tif; ; (1936.380248544061, 3822.1850199603077) +1149.tif; ; (2414.96502351707, 3820.6836896980612) +1150.tif; ; (2894.134641788492, 3819.254925207966) +1151.tif; ; (3375.1209578032067, 3817.651004823786) +1152.tif; ; (3856.331905388987, 3816.1476910505608) +1153.tif; ; (4336.66796816061, 3814.7541444258563) +1154.tif; ; (4817.388880833286, 3813.238588497345) +1155.tif; ; (5298.2518259283715, 3811.7770696066327) +1156.tif; ; (5779.4174152830965, 3810.373085555297) +1157.tif; ; (6260.299848608431, 3808.987780601419) +1158.tif; ; (6740.857137068129, 3807.5018105174427) +1159.tif; ; (7221.744362831401, 3806.390369021203) +1160.tif; ; (7702.461026521053, 3805.034489244458) +1161.tif; ; (8183.480794249134, 3803.5869650927116) +1179.tif; ; (18.66491956289741, 4306.575311298261) +1178.tif; ; (498.73183450355185, 4304.857510634276) +1177.tif; ; (979.7149357568144, 4303.254010084232) +1176.tif; ; (1460.6258545985052, 4301.641243636108) +1175.tif; ; (1940.7631943314095, 4300.139422506796) +1174.tif; ; (2420.7437164903045, 4298.626686759851) +1173.tif; ; (2900.882913792882, 4297.16297774468) +1172.tif; ; (3381.139639495267, 4295.584383070411) +1171.tif; ; (3861.9658915440964, 4294.165594209679) +1170.tif; ; (4342.301664161354, 4292.794713924736) +1169.tif; ; (4822.374681823385, 4291.3636237872015) +1168.tif; ; (5303.225534430026, 4289.955242419666) +1167.tif; ; (5783.49672270799, 4288.48159826559) +1166.tif; ; (6264.402259071857, 4287.1544571101795) +1165.tif; ; (6744.779304298856, 4285.842250179715) +1164.tif; ; (7225.392466612836, 4284.827669905614) +1163.tif; ; (7705.590776274124, 4283.588223630547) +1162.tif; ; (8185.8176710323, 4282.1660255244515) +1180.tif; ; (20.388402272134, 4784.683497499286) +1181.tif; ; (499.1806645936554, 4783.018704752669) +1182.tif; ; (980.034221240437, 4781.454640129951) +1183.tif; ; (1460.658090057068, 4779.821770862202) +1184.tif; ; (1940.8550046769722, 4778.366741045509) +1185.tif; ; (2419.990776171052, 4776.80331464391) +1186.tif; ; (2899.052904118148, 4775.241499117376) +1187.tif; ; (3379.8887028128515, 4773.733839756715) +1188.tif; ; (3861.1994829326213, 4772.279635029069) +1189.tif; ; (4341.480352433877, 4770.720466680986) +1190.tif; ; (4822.4041182645315, 4769.348156005742) +1191.tif; ; (5303.320222350138, 4767.9332307901905) +1192.tif; ; (5784.366608821818, 4766.488259011789) +1193.tif; ; (6264.901395648734, 4765.070010835906) +1194.tif; ; (6745.729086614682, 4763.6691420404195) +1195.tif; ; (7226.37224016322, 4762.396220829029) +1196.tif; ; (7707.231805239909, 4760.967971510244) +1197.tif; ; (8188.0592847640355, 4759.595135873259) +1215.tif; ; (22.77001445140759, 5262.841062151088) +1214.tif; ; (503.1417864926609, 5261.410521790791) +1213.tif; ; (984.020754881761, 5259.939183135118) +1212.tif; ; (1465.0584911417382, 5258.291567899938) +1211.tif; ; (1945.2039476785965, 5256.818322719233) +1210.tif; ; (2424.996927803082, 5255.273515779542) +1209.tif; ; (2905.328148537549, 5253.832808417882) +1208.tif; ; (3385.79305376645, 5252.35274057111) +1207.tif; ; (3866.551290357396, 5250.930145475016) +1206.tif; ; (4346.888492678264, 5249.524527677481) +1205.tif; ; (4827.139179784087, 5248.329772346326) +1204.tif; ; (5307.485986516538, 5246.724836217809) +1203.tif; ; (5788.24850977849, 5245.3760410073955) +1202.tif; ; (6269.104956689756, 5244.042150347195) +1201.tif; ; (6749.539094650673, 5242.786815888126) +1200.tif; ; (7230.163535517439, 5241.6503555888285) +1199.tif; ; (7710.188814779744, 5240.373419334583) +1198.tif; ; (8190.252379293269, 5239.034286915906) +1216.tif; ; (24.787899935023646, 5742.263686795186) +1217.tif; ; (503.66098174489593, 5740.801681363379) +1218.tif; ; (984.2436954282532, 5739.1409188579255) +1219.tif; ; (1465.2584774583254, 5737.484804319505) +1220.tif; ; (1945.1973239348454, 5736.070619762209) +1221.tif; ; (2424.3997852361717, 5734.5129134684075) +1222.tif; ; (2903.6858325181097, 5733.141138969713) +1223.tif; ; (3384.618153618703, 5731.615371522488) +1224.tif; ; (3865.9241124066775, 5730.220138739541) +1225.tif; ; (4346.24649149125, 5728.766505605346) +1226.tif; ; (4826.975291788124, 5727.163967222844) +1227.tif; ; (5308.002797710733, 5725.875894692768) +1228.tif; ; (5788.964236356447, 5724.39181182546) +1229.tif; ; (6269.423707250978, 5723.024135350888) +1230.tif; ; (6750.192067367405, 5721.598440610282) +1231.tif; ; (7231.278358971241, 5720.184439976645) +1232.tif; ; (7711.79493116058, 5718.786668618148) +1233.tif; ; (8192.76611920025, 5717.177540190328) +1251.tif; ; (27.482332547151685, 6218.656657031366) +1250.tif; ; (507.8364253658232, 6217.137977448376) +1249.tif; ; (988.7381580739731, 6215.456435601772) +1248.tif; ; (1469.6230986482556, 6213.88877109317) +1247.tif; ; (1949.8103050847542, 6212.531866749592) +1246.tif; ; (2429.6686233654787, 6210.922423843431) +1245.tif; ; (2909.9930116197156, 6209.504929051106) +1244.tif; ; (3390.672599404865, 6207.930477823533) +1243.tif; ; (3871.2206157357764, 6206.71004029659) +1242.tif; ; (4351.7695617623185, 6205.2134206551855) +1241.tif; ; (4832.015693914739, 6203.728205721717) +1240.tif; ; (5312.562233282163, 6202.327167319097) +1239.tif; ; (5792.631566765329, 6200.867118066447) +1238.tif; ; (6273.621853011655, 6199.634006857612) +1237.tif; ; (6754.040148143318, 6198.137983744162) +1236.tif; ; (7234.64848703797, 6196.861670538366) +1235.tif; ; (7714.996951521638, 6195.379947822114) +1234.tif; ; (8195.150114841743, 6193.997761053551) +1252.tif; ; (29.376708180676587, 6696.906087783732) +1253.tif; ; (507.9672345524341, 6695.244700131151) +1254.tif; ; (989.1039717348751, 6693.715563622655) +1255.tif; ; (1470.0946288985874, 6692.059454992546) +1256.tif; ; (1949.9472088136786, 6690.544228871302) +1257.tif; ; (2428.464539651655, 6689.03758649751) +1258.tif; ; (2908.678447521267, 6687.4579251441155) +1259.tif; ; (3389.9203513375214, 6686.211622181724) +1260.tif; ; (3870.9371636735873, 6684.616238145061) +1261.tif; ; (4351.696719951649, 6683.1523544795955) +1262.tif; ; (4832.206981612392, 6681.625566511298) +1263.tif; ; (5313.2261977212565, 6679.988462245391) +1264.tif; ; (5793.872159078906, 6678.70715337606) +1265.tif; ; (6274.7734369313075, 6676.958619277133) +1266.tif; ; (6755.605475047003, 6675.377665078594) +1267.tif; ; (7236.343173940146, 6673.683075940617) +1268.tif; ; (7716.900529140991, 6672.113178951118) +1269.tif; ; (8197.894697535523, 6670.264057215935) +1287.tif; ; (31.79034649561335, 7176.430249987445) +1286.tif; ; (512.1765428393669, 7174.6685633566285) +1285.tif; ; (993.0687857306494, 7172.857598667151) +1284.tif; ; (1474.2679070828217, 7171.462519767443) +1283.tif; ; (1954.4844142710274, 7169.801674615452) +1282.tif; ; (2434.2555158050045, 7168.2403249024155) +1281.tif; ; (2914.775748695993, 7166.975048394851) +1280.tif; ; (3395.310421457156, 7165.575919213378) +1279.tif; ; (3875.934095438297, 7163.940775192593) +1278.tif; ; (4356.294464261537, 7162.479111930408) +1277.tif; ; (4836.413328300753, 7160.618343606866) +1276.tif; ; (5317.381090634201, 7159.798962889653) +1275.tif; ; (5797.405001104493, 7158.039789063083) +1274.tif; ; (6278.4225693023745, 7156.350982936161) +1273.tif; ; (6758.59358604783, 7154.682888094282) +1272.tif; ; (7239.242909357374, 7153.077801894729) +1271.tif; ; (7719.61979680224, 7151.605380681369) +1270.tif; ; (8199.91410380765, 7150.167184374136) +1288.tif; ; (33.729214078963466, 7656.664882523882) +1289.tif; ; (512.3612647506897, 7654.8069844049005) +1290.tif; ; (993.2791479654134, 7653.146946890708) +1291.tif; ; (1474.3387282484948, 7651.637241650233) +1292.tif; ; (1954.6472224653514, 7649.9597700814375) +1293.tif; ; (2434.1099658992016, 7648.892532663138) +1294.tif; ; (2913.6315695442613, 7647.331210047611) +1295.tif; ; (3394.1555800294886, 7645.572709968323) +1296.tif; ; (3875.6958165682377, 7644.135275509144) +1297.tif; ; (4356.0091138741755, 7642.547489081542) +1298.tif; ; (4836.680154884224, 7641.07197201625) +1299.tif; ; (5317.541150591542, 7639.93648056688) +1300.tif; ; (5798.424891273591, 7638.072085792112) +1301.tif; ; (6279.239632266459, 7636.3535436553175) +1302.tif; ; (6759.826825093774, 7634.660329531078) +1303.tif; ; (7240.642109966077, 7632.95743070004) +1304.tif; ; (7721.070736135312, 7631.088458586923) +1305.tif; ; (8201.869937178864, 7629.450479990619) +1323.tif; ; (35.78541890706276, 8134.670171814069) +1322.tif; ; (516.1046960382473, 8132.86327180336) +1321.tif; ; (997.258696964716, 8131.200355727378) +1320.tif; ; (1478.3814311328183, 8129.636029386258) +1319.tif; ; (1958.811615259157, 8128.121490725033) +1318.tif; ; (2438.6875680632334, 8126.807564137156) +1317.tif; ; (2919.1227542897723, 8125.280517757573) +1316.tif; ; (3399.669225394061, 8123.824235294408) +1315.tif; ; (3880.473758998455, 8122.2684881511495) +1314.tif; ; (4360.125060214415, 8120.476422510012) +1313.tif; ; (4840.343602549906, 8118.858591332563) +1312.tif; ; (5321.298923127339, 8117.568213674585) +1311.tif; ; (5801.751951685183, 8116.014910603519) +1310.tif; ; (6282.326515076225, 8114.311187134341) +1309.tif; ; (6762.7028879544005, 8112.593771790269) +1308.tif; ; (7243.30498606546, 8110.887460094567) +1307.tif; ; (7723.6078292558395, 8109.130457089615) +1306.tif; ; (8203.846105635686, 8107.363130204017) diff --git a/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.txt new file mode 100644 index 000000000000..80a373b8509f --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Ti7/Region2_150_Mosaic36Flat/36/TileConfiguration.txt @@ -0,0 +1,328 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +1000.tif; ; (0.0, 0.0) +1001.tif; ; (480.0, 0.0) +1002.tif; ; (960.0, 0.0) +1003.tif; ; (1440.0, 0.0) +1004.tif; ; (1920.0, 0.0) +1005.tif; ; (2400.0, 0.0) +1006.tif; ; (2880.0, 0.0) +1007.tif; ; (3360.0, 0.0) +1008.tif; ; (3840.0, 0.0) +1009.tif; ; (4320.0, 0.0) +1010.tif; ; (4800.0, 0.0) +1011.tif; ; (5280.0, 0.0) +1012.tif; ; (5760.0, 0.0) +1013.tif; ; (6240.0, 0.0) +1014.tif; ; (6720.0, 0.0) +1015.tif; ; (7200.0, 0.0) +1016.tif; ; (7680.0, 0.0) +1017.tif; ; (8160.0, 0.0) +1035.tif; ; (0.0, 480.0) +1034.tif; ; (480.0, 480.0) +1033.tif; ; (960.0, 480.0) +1032.tif; ; (1440.0, 480.0) +1031.tif; ; (1920.0, 480.0) +1030.tif; ; (2400.0, 480.0) +1029.tif; ; (2880.0, 480.0) +1028.tif; ; (3360.0, 480.0) +1027.tif; ; (3840.0, 480.0) +1026.tif; ; (4320.0, 480.0) +1025.tif; ; (4800.0, 480.0) +1024.tif; ; (5280.0, 480.0) +1023.tif; ; (5760.0, 480.0) +1022.tif; ; (6240.0, 480.0) +1021.tif; ; (6720.0, 480.0) +1020.tif; ; (7200.0, 480.0) +1019.tif; ; (7680.0, 480.0) +1018.tif; ; (8160.0, 480.0) +1036.tif; ; (0.0, 960.0) +1037.tif; ; (480.0, 960.0) +1038.tif; ; (960.0, 960.0) +1039.tif; ; (1440.0, 960.0) +1040.tif; ; (1920.0, 960.0) +1041.tif; ; (2400.0, 960.0) +1042.tif; ; (2880.0, 960.0) +1043.tif; ; (3360.0, 960.0) +1044.tif; ; (3840.0, 960.0) +1045.tif; ; (4320.0, 960.0) +1046.tif; ; (4800.0, 960.0) +1047.tif; ; (5280.0, 960.0) +1048.tif; ; (5760.0, 960.0) +1049.tif; ; (6240.0, 960.0) +1050.tif; ; (6720.0, 960.0) +1051.tif; ; (7200.0, 960.0) +1052.tif; ; (7680.0, 960.0) +1053.tif; ; (8160.0, 960.0) +1071.tif; ; (0.0, 1440.0) +1070.tif; ; (480.0, 1440.0) +1069.tif; ; (960.0, 1440.0) +1068.tif; ; (1440.0, 1440.0) +1067.tif; ; (1920.0, 1440.0) +1066.tif; ; (2400.0, 1440.0) +1065.tif; ; (2880.0, 1440.0) +1064.tif; ; (3360.0, 1440.0) +1063.tif; ; (3840.0, 1440.0) +1062.tif; ; (4320.0, 1440.0) +1061.tif; ; (4800.0, 1440.0) +1060.tif; ; (5280.0, 1440.0) +1059.tif; ; (5760.0, 1440.0) +1058.tif; ; (6240.0, 1440.0) +1057.tif; ; (6720.0, 1440.0) +1056.tif; ; (7200.0, 1440.0) +1055.tif; ; (7680.0, 1440.0) +1054.tif; ; (8160.0, 1440.0) +1072.tif; ; (0.0, 1920.0) +1073.tif; ; (480.0, 1920.0) +1074.tif; ; (960.0, 1920.0) +1075.tif; ; (1440.0, 1920.0) +1076.tif; ; (1920.0, 1920.0) +1077.tif; ; (2400.0, 1920.0) +1078.tif; ; (2880.0, 1920.0) +1079.tif; ; (3360.0, 1920.0) +1080.tif; ; (3840.0, 1920.0) +1081.tif; ; (4320.0, 1920.0) +1082.tif; ; (4800.0, 1920.0) +1083.tif; ; (5280.0, 1920.0) +1084.tif; ; (5760.0, 1920.0) +1085.tif; ; (6240.0, 1920.0) +1086.tif; ; (6720.0, 1920.0) +1087.tif; ; (7200.0, 1920.0) +1088.tif; ; (7680.0, 1920.0) +1089.tif; ; (8160.0, 1920.0) +1107.tif; ; (0.0, 2400.0) +1106.tif; ; (480.0, 2400.0) +1105.tif; ; (960.0, 2400.0) +1104.tif; ; (1440.0, 2400.0) +1103.tif; ; (1920.0, 2400.0) +1102.tif; ; (2400.0, 2400.0) +1101.tif; ; (2880.0, 2400.0) +1100.tif; ; (3360.0, 2400.0) +1099.tif; ; (3840.0, 2400.0) +1098.tif; ; (4320.0, 2400.0) +1097.tif; ; (4800.0, 2400.0) +1096.tif; ; (5280.0, 2400.0) +1095.tif; ; (5760.0, 2400.0) +1094.tif; ; (6240.0, 2400.0) +1093.tif; ; (6720.0, 2400.0) +1092.tif; ; (7200.0, 2400.0) +1091.tif; ; (7680.0, 2400.0) +1090.tif; ; (8160.0, 2400.0) +1108.tif; ; (0.0, 2880.0) +1109.tif; ; (480.0, 2880.0) +1110.tif; ; (960.0, 2880.0) +1111.tif; ; (1440.0, 2880.0) +1112.tif; ; (1920.0, 2880.0) +1113.tif; ; (2400.0, 2880.0) +1114.tif; ; (2880.0, 2880.0) +1115.tif; ; (3360.0, 2880.0) +1116.tif; ; (3840.0, 2880.0) +1117.tif; ; (4320.0, 2880.0) +1118.tif; ; (4800.0, 2880.0) +1119.tif; ; (5280.0, 2880.0) +1120.tif; ; (5760.0, 2880.0) +1121.tif; ; (6240.0, 2880.0) +1122.tif; ; (6720.0, 2880.0) +1123.tif; ; (7200.0, 2880.0) +1124.tif; ; (7680.0, 2880.0) +1125.tif; ; (8160.0, 2880.0) +1143.tif; ; (0.0, 3360.0) +1142.tif; ; (480.0, 3360.0) +1141.tif; ; (960.0, 3360.0) +1140.tif; ; (1440.0, 3360.0) +1139.tif; ; (1920.0, 3360.0) +1138.tif; ; (2400.0, 3360.0) +1137.tif; ; (2880.0, 3360.0) +1136.tif; ; (3360.0, 3360.0) +1135.tif; ; (3840.0, 3360.0) +1134.tif; ; (4320.0, 3360.0) +1133.tif; ; (4800.0, 3360.0) +1132.tif; ; (5280.0, 3360.0) +1131.tif; ; (5760.0, 3360.0) +1130.tif; ; (6240.0, 3360.0) +1129.tif; ; (6720.0, 3360.0) +1128.tif; ; (7200.0, 3360.0) +1127.tif; ; (7680.0, 3360.0) +1126.tif; ; (8160.0, 3360.0) +1144.tif; ; (0.0, 3840.0) +1145.tif; ; (480.0, 3840.0) +1146.tif; ; (960.0, 3840.0) +1147.tif; ; (1440.0, 3840.0) +1148.tif; ; (1920.0, 3840.0) +1149.tif; ; (2400.0, 3840.0) +1150.tif; ; (2880.0, 3840.0) +1151.tif; ; (3360.0, 3840.0) +1152.tif; ; (3840.0, 3840.0) +1153.tif; ; (4320.0, 3840.0) +1154.tif; ; (4800.0, 3840.0) +1155.tif; ; (5280.0, 3840.0) +1156.tif; ; (5760.0, 3840.0) +1157.tif; ; (6240.0, 3840.0) +1158.tif; ; (6720.0, 3840.0) +1159.tif; ; (7200.0, 3840.0) +1160.tif; ; (7680.0, 3840.0) +1161.tif; ; (8160.0, 3840.0) +1179.tif; ; (0.0, 4320.0) +1178.tif; ; (480.0, 4320.0) +1177.tif; ; (960.0, 4320.0) +1176.tif; ; (1440.0, 4320.0) +1175.tif; ; (1920.0, 4320.0) +1174.tif; ; (2400.0, 4320.0) +1173.tif; ; (2880.0, 4320.0) +1172.tif; ; (3360.0, 4320.0) +1171.tif; ; (3840.0, 4320.0) +1170.tif; ; (4320.0, 4320.0) +1169.tif; ; (4800.0, 4320.0) +1168.tif; ; (5280.0, 4320.0) +1167.tif; ; (5760.0, 4320.0) +1166.tif; ; (6240.0, 4320.0) +1165.tif; ; (6720.0, 4320.0) +1164.tif; ; (7200.0, 4320.0) +1163.tif; ; (7680.0, 4320.0) +1162.tif; ; (8160.0, 4320.0) +1180.tif; ; (0.0, 4800.0) +1181.tif; ; (480.0, 4800.0) +1182.tif; ; (960.0, 4800.0) +1183.tif; ; (1440.0, 4800.0) +1184.tif; ; (1920.0, 4800.0) +1185.tif; ; (2400.0, 4800.0) +1186.tif; ; (2880.0, 4800.0) +1187.tif; ; (3360.0, 4800.0) +1188.tif; ; (3840.0, 4800.0) +1189.tif; ; (4320.0, 4800.0) +1190.tif; ; (4800.0, 4800.0) +1191.tif; ; (5280.0, 4800.0) +1192.tif; ; (5760.0, 4800.0) +1193.tif; ; (6240.0, 4800.0) +1194.tif; ; (6720.0, 4800.0) +1195.tif; ; (7200.0, 4800.0) +1196.tif; ; (7680.0, 4800.0) +1197.tif; ; (8160.0, 4800.0) +1215.tif; ; (0.0, 5280.0) +1214.tif; ; (480.0, 5280.0) +1213.tif; ; (960.0, 5280.0) +1212.tif; ; (1440.0, 5280.0) +1211.tif; ; (1920.0, 5280.0) +1210.tif; ; (2400.0, 5280.0) +1209.tif; ; (2880.0, 5280.0) +1208.tif; ; (3360.0, 5280.0) +1207.tif; ; (3840.0, 5280.0) +1206.tif; ; (4320.0, 5280.0) +1205.tif; ; (4800.0, 5280.0) +1204.tif; ; (5280.0, 5280.0) +1203.tif; ; (5760.0, 5280.0) +1202.tif; ; (6240.0, 5280.0) +1201.tif; ; (6720.0, 5280.0) +1200.tif; ; (7200.0, 5280.0) +1199.tif; ; (7680.0, 5280.0) +1198.tif; ; (8160.0, 5280.0) +1216.tif; ; (0.0, 5760.0) +1217.tif; ; (480.0, 5760.0) +1218.tif; ; (960.0, 5760.0) +1219.tif; ; (1440.0, 5760.0) +1220.tif; ; (1920.0, 5760.0) +1221.tif; ; (2400.0, 5760.0) +1222.tif; ; (2880.0, 5760.0) +1223.tif; ; (3360.0, 5760.0) +1224.tif; ; (3840.0, 5760.0) +1225.tif; ; (4320.0, 5760.0) +1226.tif; ; (4800.0, 5760.0) +1227.tif; ; (5280.0, 5760.0) +1228.tif; ; (5760.0, 5760.0) +1229.tif; ; (6240.0, 5760.0) +1230.tif; ; (6720.0, 5760.0) +1231.tif; ; (7200.0, 5760.0) +1232.tif; ; (7680.0, 5760.0) +1233.tif; ; (8160.0, 5760.0) +1251.tif; ; (0.0, 6240.0) +1250.tif; ; (480.0, 6240.0) +1249.tif; ; (960.0, 6240.0) +1248.tif; ; (1440.0, 6240.0) +1247.tif; ; (1920.0, 6240.0) +1246.tif; ; (2400.0, 6240.0) +1245.tif; ; (2880.0, 6240.0) +1244.tif; ; (3360.0, 6240.0) +1243.tif; ; (3840.0, 6240.0) +1242.tif; ; (4320.0, 6240.0) +1241.tif; ; (4800.0, 6240.0) +1240.tif; ; (5280.0, 6240.0) +1239.tif; ; (5760.0, 6240.0) +1238.tif; ; (6240.0, 6240.0) +1237.tif; ; (6720.0, 6240.0) +1236.tif; ; (7200.0, 6240.0) +1235.tif; ; (7680.0, 6240.0) +1234.tif; ; (8160.0, 6240.0) +1252.tif; ; (0.0, 6720.0) +1253.tif; ; (480.0, 6720.0) +1254.tif; ; (960.0, 6720.0) +1255.tif; ; (1440.0, 6720.0) +1256.tif; ; (1920.0, 6720.0) +1257.tif; ; (2400.0, 6720.0) +1258.tif; ; (2880.0, 6720.0) +1259.tif; ; (3360.0, 6720.0) +1260.tif; ; (3840.0, 6720.0) +1261.tif; ; (4320.0, 6720.0) +1262.tif; ; (4800.0, 6720.0) +1263.tif; ; (5280.0, 6720.0) +1264.tif; ; (5760.0, 6720.0) +1265.tif; ; (6240.0, 6720.0) +1266.tif; ; (6720.0, 6720.0) +1267.tif; ; (7200.0, 6720.0) +1268.tif; ; (7680.0, 6720.0) +1269.tif; ; (8160.0, 6720.0) +1287.tif; ; (0.0, 7200.0) +1286.tif; ; (480.0, 7200.0) +1285.tif; ; (960.0, 7200.0) +1284.tif; ; (1440.0, 7200.0) +1283.tif; ; (1920.0, 7200.0) +1282.tif; ; (2400.0, 7200.0) +1281.tif; ; (2880.0, 7200.0) +1280.tif; ; (3360.0, 7200.0) +1279.tif; ; (3840.0, 7200.0) +1278.tif; ; (4320.0, 7200.0) +1277.tif; ; (4800.0, 7200.0) +1276.tif; ; (5280.0, 7200.0) +1275.tif; ; (5760.0, 7200.0) +1274.tif; ; (6240.0, 7200.0) +1273.tif; ; (6720.0, 7200.0) +1272.tif; ; (7200.0, 7200.0) +1271.tif; ; (7680.0, 7200.0) +1270.tif; ; (8160.0, 7200.0) +1288.tif; ; (0.0, 7680.0) +1289.tif; ; (480.0, 7680.0) +1290.tif; ; (960.0, 7680.0) +1291.tif; ; (1440.0, 7680.0) +1292.tif; ; (1920.0, 7680.0) +1293.tif; ; (2400.0, 7680.0) +1294.tif; ; (2880.0, 7680.0) +1295.tif; ; (3360.0, 7680.0) +1296.tif; ; (3840.0, 7680.0) +1297.tif; ; (4320.0, 7680.0) +1298.tif; ; (4800.0, 7680.0) +1299.tif; ; (5280.0, 7680.0) +1300.tif; ; (5760.0, 7680.0) +1301.tif; ; (6240.0, 7680.0) +1302.tif; ; (6720.0, 7680.0) +1303.tif; ; (7200.0, 7680.0) +1304.tif; ; (7680.0, 7680.0) +1305.tif; ; (8160.0, 7680.0) +1323.tif; ; (0.0, 8160.0) +1322.tif; ; (480.0, 8160.0) +1321.tif; ; (960.0, 8160.0) +1320.tif; ; (1440.0, 8160.0) +1319.tif; ; (1920.0, 8160.0) +1318.tif; ; (2400.0, 8160.0) +1317.tif; ; (2880.0, 8160.0) +1316.tif; ; (3360.0, 8160.0) +1315.tif; ; (3840.0, 8160.0) +1314.tif; ; (4320.0, 8160.0) +1313.tif; ; (4800.0, 8160.0) +1312.tif; ; (5280.0, 8160.0) +1311.tif; ; (5760.0, 8160.0) +1310.tif; ; (6240.0, 8160.0) +1309.tif; ; (6720.0, 8160.0) +1308.tif; ; (7200.0, 8160.0) +1307.tif; ; (7680.0, 8160.0) +1306.tif; ; (8160.0, 8160.0) diff --git a/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.registered.txt b/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.registered.txt new file mode 100644 index 000000000000..1f07ef993496 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.registered.txt @@ -0,0 +1,104 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +Image_1_1.tif;;(-8, -2) +Image_2_1.tif;;(533, 11) +Image_3_1.tif;;(1017, 6) +Image_4_1.tif;;(1560, -11) +Image_5_1.tif;;(2035, -13) +Image_6_1.tif;;(2572, -20) +Image_7_1.tif;;(3077, 0) +Image_8_1.tif;;(3591, -18) +Image_9_1.tif;;(4090, 24) +Image_10_1.tif;;(4588, 3) +Image_1_2.tif;;(-12, 488) +Image_2_2.tif;;(487, 487) +Image_3_2.tif;;(1016, 518) +Image_4_2.tif;;(1539, 498) +Image_5_2.tif;;(2034, 501) +Image_6_2.tif;;(2582, 497) +Image_7_2.tif;;(3089, 527) +Image_8_2.tif;;(3595, 535) +Image_9_2.tif;;(4073, 505) +Image_10_2.tif;;(4598, 529) +Image_1_3.tif;;(5, 1028) +Image_2_3.tif;;(499, 1043) +Image_3_3.tif;;(1045, 1022) +Image_4_3.tif;;(1535, 1009) +Image_5_3.tif;;(2043, 1019) +Image_6_3.tif;;(2539, 1043) +Image_7_3.tif;;(3056, 1047) +Image_8_3.tif;;(3559, 1048) +Image_9_3.tif;;(4087, 1026) +Image_10_3.tif;;(4583, 1002) +Image_1_4.tif;;(-21, 1536) +Image_2_4.tif;;(488, 1559) +Image_3_4.tif;;(1045, 1512) +Image_4_4.tif;;(1552, 1535) +Image_5_4.tif;;(2057, 1518) +Image_6_4.tif;;(2568, 1538) +Image_7_4.tif;;(3060, 1530) +Image_8_4.tif;;(3575, 1516) +Image_9_4.tif;;(4111, 1522) +Image_10_4.tif;;(4620, 1556) +Image_1_5.tif;;(-2, 2071) +Image_2_5.tif;;(533, 2033) +Image_3_5.tif;;(1047, 2066) +Image_4_5.tif;;(1537, 2027) +Image_5_5.tif;;(2034, 2063) +Image_6_5.tif;;(2550, 2038) +Image_7_5.tif;;(3079, 2030) +Image_8_5.tif;;(3606, 2060) +Image_9_5.tif;;(4081, 2049) +Image_10_5.tif;;(4613, 2047) +Image_1_6.tif;;(10, 2561) +Image_2_6.tif;;(502, 2543) +Image_3_6.tif;;(1038, 2576) +Image_4_6.tif;;(1555, 2582) +Image_5_6.tif;;(2058, 2557) +Image_6_6.tif;;(2579, 2538) +Image_7_6.tif;;(3055, 2572) +Image_8_6.tif;;(3564, 2537) +Image_9_6.tif;;(4106, 2545) +Image_10_6.tif;;(4595, 2535) +Image_1_7.tif;;(7, 3081) +Image_2_7.tif;;(487, 3075) +Image_3_7.tif;;(1046, 3068) +Image_4_7.tif;;(1558, 3089) +Image_5_7.tif;;(2039, 3080) +Image_6_7.tif;;(2583, 3062) +Image_7_7.tif;;(3052, 3090) +Image_8_7.tif;;(3604, 3052) +Image_9_7.tif;;(4120, 3092) +Image_10_7.tif;;(4622, 3090) +Image_1_8.tif;;(10, 3590) +Image_2_8.tif;;(518, 3589) +Image_3_8.tif;;(1030, 3602) +Image_4_8.tif;;(1534, 3577) +Image_5_8.tif;;(2055, 3568) +Image_6_8.tif;;(2554, 3579) +Image_7_8.tif;;(3058, 3585) +Image_8_8.tif;;(3563, 3600) +Image_9_8.tif;;(4111, 3595) +Image_10_8.tif;;(4588, 3587) +Image_1_9.tif;;(-13, 4077) +Image_2_9.tif;;(525, 4085) +Image_3_9.tif;;(1022, 4101) +Image_4_9.tif;;(1529, 4096) +Image_5_9.tif;;(2049, 4088) +Image_6_9.tif;;(2582, 4104) +Image_7_9.tif;;(3071, 4092) +Image_8_9.tif;;(3565, 4113) +Image_9_9.tif;;(4101, 4088) +Image_10_9.tif;;(4587, 4116) +Image_1_10.tif;;(1, 4627) +Image_2_10.tif;;(517, 4591) +Image_3_10.tif;;(1027, 4590) +Image_4_10.tif;;(1557, 4596) +Image_5_10.tif;;(2025, 4614) +Image_6_10.tif;;(2539, 4626) +Image_7_10.tif;;(3061, 4603) +Image_8_10.tif;;(3603, 4603) +Image_9_10.tif;;(4102, 4627) +Image_10_10.tif;;(4628, 4607) diff --git a/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.txt b/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.txt new file mode 100644 index 000000000000..ab72824029a2 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Tiles/TileConfiguration.txt @@ -0,0 +1,104 @@ +# Define the number of dimensions we are working on +dim = 2 + +# Define the image coordinates +Image_1_1.tif;;(0, 0) +Image_2_1.tif;;(512, 0) +Image_3_1.tif;;(1024, 0) +Image_4_1.tif;;(1536, 0) +Image_5_1.tif;;(2048, 0) +Image_6_1.tif;;(2560, 0) +Image_7_1.tif;;(3072, 0) +Image_8_1.tif;;(3584, 0) +Image_9_1.tif;;(4096, 0) +Image_10_1.tif;;(4608, 0) +Image_1_2.tif;;(0, 512) +Image_2_2.tif;;(512, 512) +Image_3_2.tif;;(1024, 512) +Image_4_2.tif;;(1536, 512) +Image_5_2.tif;;(2048, 512) +Image_6_2.tif;;(2560, 512) +Image_7_2.tif;;(3072, 512) +Image_8_2.tif;;(3584, 512) +Image_9_2.tif;;(4096, 512) +Image_10_2.tif;;(4608, 512) +Image_1_3.tif;;(0, 1024) +Image_2_3.tif;;(512, 1024) +Image_3_3.tif;;(1024, 1024) +Image_4_3.tif;;(1536, 1024) +Image_5_3.tif;;(2048, 1024) +Image_6_3.tif;;(2560, 1024) +Image_7_3.tif;;(3072, 1024) +Image_8_3.tif;;(3584, 1024) +Image_9_3.tif;;(4096, 1024) +Image_10_3.tif;;(4608, 1024) +Image_1_4.tif;;(0, 1536) +Image_2_4.tif;;(512, 1536) +Image_3_4.tif;;(1024, 1536) +Image_4_4.tif;;(1536, 1536) +Image_5_4.tif;;(2048, 1536) +Image_6_4.tif;;(2560, 1536) +Image_7_4.tif;;(3072, 1536) +Image_8_4.tif;;(3584, 1536) +Image_9_4.tif;;(4096, 1536) +Image_10_4.tif;;(4608, 1536) +Image_1_5.tif;;(0, 2048) +Image_2_5.tif;;(512, 2048) +Image_3_5.tif;;(1024, 2048) +Image_4_5.tif;;(1536, 2048) +Image_5_5.tif;;(2048, 2048) +Image_6_5.tif;;(2560, 2048) +Image_7_5.tif;;(3072, 2048) +Image_8_5.tif;;(3584, 2048) +Image_9_5.tif;;(4096, 2048) +Image_10_5.tif;;(4608, 2048) +Image_1_6.tif;;(0, 2560) +Image_2_6.tif;;(512, 2560) +Image_3_6.tif;;(1024, 2560) +Image_4_6.tif;;(1536, 2560) +Image_5_6.tif;;(2048, 2560) +Image_6_6.tif;;(2560, 2560) +Image_7_6.tif;;(3072, 2560) +Image_8_6.tif;;(3584, 2560) +Image_9_6.tif;;(4096, 2560) +Image_10_6.tif;;(4608, 2560) +Image_1_7.tif;;(0, 3072) +Image_2_7.tif;;(512, 3072) +Image_3_7.tif;;(1024, 3072) +Image_4_7.tif;;(1536, 3072) +Image_5_7.tif;;(2048, 3072) +Image_6_7.tif;;(2560, 3072) +Image_7_7.tif;;(3072, 3072) +Image_8_7.tif;;(3584, 3072) +Image_9_7.tif;;(4096, 3072) +Image_10_7.tif;;(4608, 3072) +Image_1_8.tif;;(0, 3584) +Image_2_8.tif;;(512, 3584) +Image_3_8.tif;;(1024, 3584) +Image_4_8.tif;;(1536, 3584) +Image_5_8.tif;;(2048, 3584) +Image_6_8.tif;;(2560, 3584) +Image_7_8.tif;;(3072, 3584) +Image_8_8.tif;;(3584, 3584) +Image_9_8.tif;;(4096, 3584) +Image_10_8.tif;;(4608, 3584) +Image_1_9.tif;;(0, 4096) +Image_2_9.tif;;(512, 4096) +Image_3_9.tif;;(1024, 4096) +Image_4_9.tif;;(1536, 4096) +Image_5_9.tif;;(2048, 4096) +Image_6_9.tif;;(2560, 4096) +Image_7_9.tif;;(3072, 4096) +Image_8_9.tif;;(3584, 4096) +Image_9_9.tif;;(4096, 4096) +Image_10_9.tif;;(4608, 4096) +Image_1_10.tif;;(0, 4608) +Image_2_10.tif;;(512, 4608) +Image_3_10.tif;;(1024, 4608) +Image_4_10.tif;;(1536, 4608) +Image_5_10.tif;;(2048, 4608) +Image_6_10.tif;;(2560, 4608) +Image_7_10.tif;;(3072, 4608) +Image_8_10.tif;;(3584, 4608) +Image_9_10.tif;;(4096, 4608) +Image_10_10.tif;;(4608, 4608) diff --git a/Modules/Registration/Montage/test/Input/Tiles/_readme.txt b/Modules/Registration/Montage/test/Input/Tiles/_readme.txt new file mode 100644 index 000000000000..a37450bfb04a --- /dev/null +++ b/Modules/Registration/Montage/test/Input/Tiles/_readme.txt @@ -0,0 +1 @@ +It is a 100 (10x10) tile montage cut from a larger monolithic image. Each tile is 1024 x 1024. The tiles have 50% overlap (ie the cutting template was shifted 512 pixels between tiles). Additionally, I added some 'slop' to the shifts to simulate montage artifacts. I have two files that can accompany the tiles. The first is the intended locations of the 100 tiles (ie perfect stage movement) and the second is the actual location. diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.registered.txt.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.registered.txt.cid new file mode 100644 index 000000000000..ecc0ec7ca28e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.registered.txt.cid @@ -0,0 +1 @@ +bafkreig5bchpphdtty3g2mmvmte7y6p2toygbwnk2e3b7pk4dd34awgj5a diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.txt.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.txt.cid new file mode 100644 index 000000000000..ecc0ec7ca28e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/TileConfiguration.txt.cid @@ -0,0 +1 @@ +bafkreig5bchpphdtty3g2mmvmte7y6p2toygbwnk2e3b7pk4dd34awgj5a diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608.png.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608.png.cid new file mode 100644 index 000000000000..7a2caa51cb72 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608.png.cid @@ -0,0 +1 @@ +bafkreifhjekcn6ihtbzq5xtpfzxv77dkxx2qyik2cb3aotmfvmfrjdpobm diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_1.png.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_1.png.cid new file mode 100644 index 000000000000..3e03f93caaa1 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_1.png.cid @@ -0,0 +1 @@ +bafkreigrlltpbli4lzoheiahwy3f646lv7yi4a44iatl2ysvdvmwb5mv64 diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_2.png.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_2.png.cid new file mode 100644 index 000000000000..ac2652418672 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_1_2.png.cid @@ -0,0 +1 @@ +bafkreiew6tkudo6cqpgpsh7lvoz62zn23hmeqykmoyii6wyttqj34qj3pu diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_1.png.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_1.png.cid new file mode 100644 index 000000000000..6cd131183d6e --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_1.png.cid @@ -0,0 +1 @@ +bafkreibo65xlebewqwacvxcedttuyzicgf47yzx5ha2potunchvnibac5i diff --git a/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_2.png.cid b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_2.png.cid new file mode 100644 index 000000000000..f0463562a201 --- /dev/null +++ b/Modules/Registration/Montage/test/Input/VisibleHumanRGB/VisibleHumanMale1608_2_2.png.cid @@ -0,0 +1 @@ +bafkreihy27u7wf3awwsw5jnwgvtyqvkdfhvamnhbugfj3oy5atpkwzwsqe diff --git a/Modules/Registration/Montage/test/itkInMemoryMontageTest2D.cxx b/Modules/Registration/Montage/test/itkInMemoryMontageTest2D.cxx new file mode 100644 index 000000000000..36b118231a6e --- /dev/null +++ b/Modules/Registration/Montage/test/itkInMemoryMontageTest2D.cxx @@ -0,0 +1,82 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkInMemoryMontageTestHelper.hxx" +#include "itkTileConfiguration.h" +#include "itkRGBPixel.h" + +int +itkInMemoryMontageTest2D(int argc, char * argv[]) +{ + if (argc < 3) + { + std::cerr << "Usage: " << argv[0] << " "; + std::cerr << " [ variation streamSubdivisions ]" << std::endl; + return EXIT_FAILURE; + } + + unsigned streamSubdivisions = 1; + if (argc > 4) + { + streamSubdivisions = std::stoul(argv[4]); + } + + std::string inputPath = argv[1]; + if (inputPath.back() != '/' && inputPath.back() != '\\') + { + inputPath += '/'; + } + + itk::TileConfiguration<2> stageTiles; + stageTiles.Parse(inputPath + "TileConfiguration.registered.txt"); + + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO( + (inputPath + stageTiles.Tiles[0].FileName).c_str(), itk::IOFileModeEnum::ReadMode); + imageIO->SetFileName(inputPath + stageTiles.Tiles[0].FileName); + imageIO->ReadImageInformation(); + const itk::IOPixelEnum pixelType = imageIO->GetPixelType(); + + std::string outFileName = std::string(argv[2]); + + if (pixelType == itk::IOPixelEnum::RGB) + { + using TestTransformType = InMemoryMontageTest, itk::RGBPixel>; + + TestTransformType::TestVariation variation = TestTransformType::TestVariation::UOrigin_USpacing_UTransform; + if (argc > 3) + { + variation = static_cast(std::stoul(argv[3])); + } + + TestTransformType::Pointer testObject = TestTransformType::New(); + return testObject->execute(stageTiles, inputPath, outFileName, variation, streamSubdivisions); + } + else + { + using TestTransformType = InMemoryMontageTest; + + TestTransformType::TestVariation variation = TestTransformType::TestVariation::UOrigin_USpacing_UTransform; + if (argc > 3) + { + variation = static_cast(std::stoul(argv[3])); + } + + TestTransformType::Pointer testObject = TestTransformType::New(); + return testObject->execute(stageTiles, inputPath, outFileName, variation, streamSubdivisions); + } +} diff --git a/Modules/Registration/Montage/test/itkInMemoryMontageTestHelper.hxx b/Modules/Registration/Montage/test/itkInMemoryMontageTestHelper.hxx new file mode 100644 index 000000000000..4e1a3acf77ee --- /dev/null +++ b/Modules/Registration/Montage/test/itkInMemoryMontageTestHelper.hxx @@ -0,0 +1,593 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkInMemoryMontageTestHelper_hxx +#define itkInMemoryMontageTestHelper_hxx + +#include "itkAffineTransform.h" +#include "itkImageFileWriter.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkObject.h" +#include "itkTileConfiguration.h" +#include "itkSimpleFilterWatcher.h" +#include "itkTileMergeImageFilter.h" +#include "itkTileMontage.h" +#include "itkTransformFileWriter.h" +#include "itkTxtTransformIOFactory.h" + +#include +#include +#include + +template +class ITK_TEMPLATE_EXPORT InMemoryMontageTest : public itk::Object +{ +public: + InMemoryMontageTest() = default; + ~InMemoryMontageTest() override = default; + + ITK_DISALLOW_COPY_AND_MOVE(InMemoryMontageTest); + + /** Standard class type aliases. */ + using Self = InMemoryMontageTest; + using Pointer = itk::SmartPointer; + using ConstPointer = itk::SmartPointer; + + /** New macro for creation of through a Smart Pointer. */ + itkNewMacro(Self); + + enum class TestVariation : unsigned int + { + UOrigin_USpacing_UTransform = 0, + UOrigin_DSpacing_UTransform, + UOrigin_USpacing_DTransform, + UOrigin_DSpacing_DTransform, + DOrigin_USpacing_UTransform, + DOrigin_DSpacing_UTransform, + DOrigin_USpacing_DTransform, + DOrigin_DSpacing_DTransform, + }; + + /* ----------------------------------------------------------------------------------------------- + * This method tests stitching images with different combinations of origins, spacings, and + * transforms. + * + * Legend: + * UO - Unit Origin. An origin of (0, 0, 0). + * US - Unit Spacing. A spacing of (1, 1, 1). + * (1, 0, 0) + * UT - Unit Transform. An identity transform of (0, 1, 0) + * (0, 0, 1) + * + * DO - Dynamic Origin. An origin that does not equal the unit origin, such as (12, 0, 51) + * DS - Dynamic Spacing. Spacing that is not identical to unit spacing, such as (0.5, 0.25, 0.5) + * DT - Dynamic Transform. A transform that is not identical to a unit transform. + * + * ~~~~~~~~~~~ + * + * Each run of the test uses either a unit or dynamic origin, spacing, and transform. In total, + * there are 8 combinations... + * + * Combinations: + * UO | US | UT - Fail + * UO | DS | UT - Fail + * UO | US | DT + * UO | DS | DT + * + * DO | US | UT + * DO | DS | UT + * DO | US | DT + * DO | DS | DT + * ----------------------------------------------------------------------------------------------- */ + int + execute(const itk::TileConfiguration<2> & stageTiles, + const std::string & inputPath, + std::string & outFilename, + TestVariation variation, + unsigned streamSubdivisions) + { + // MetaImage format supports streaming + outFilename = outFilename + std::to_string(static_cast(variation)) + ".mha"; + + switch (variation) + { + case TestVariation::UOrigin_USpacing_UTransform: + return inMemoryMontageTest0(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::UOrigin_DSpacing_UTransform: + return inMemoryMontageTest1(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::UOrigin_USpacing_DTransform: + return inMemoryMontageTest2(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::UOrigin_DSpacing_DTransform: + return inMemoryMontageTest3(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::DOrigin_USpacing_UTransform: + return inMemoryMontageTest4(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::DOrigin_DSpacing_UTransform: + return inMemoryMontageTest5(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::DOrigin_USpacing_DTransform: + return inMemoryMontageTest6(stageTiles, inputPath, outFilename, streamSubdivisions); + case TestVariation::DOrigin_DSpacing_DTransform: + return inMemoryMontageTest7(stageTiles, inputPath, outFilename, streamSubdivisions); + default: + return EXIT_FAILURE; + } + } + +private: + static constexpr unsigned Dimension = 2; + using ScalarPixelType = typename itk::NumericTraits::ValueType; + using PointType = itk::Point; + using VectorType = itk::Vector; + using ScalarImageType = itk::Image; + using SpacingType = typename ScalarImageType::SpacingType; + using SpacingRow = std::vector; + using Spacing2D = std::vector; + using MontageType = itk::TileMontage; + using TransformPtr = typename MontageType::TransformPointer; + using TransformPtrRow = std::vector; + using Transform2D = std::vector; + using OriginPoint = typename ScalarImageType::PointType; + using OriginRow = std::vector; + using Origin2D = std::vector; + using OriginalImageType = itk::Image; // possibly RGB instead of scalar + using PCMType = itk::PhaseCorrelationImageRegistrationMethod; + using TransformType = itk::TranslationTransform; + using TileConfig = itk::TileConfiguration; + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a unit origin, unit spacing, and unit transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest0(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D UO = createUnitOrigin2D(yMontageSize, xMontageSize); + Spacing2D US = createSpacing2D(yMontageSize, xMontageSize, 1); + Transform2D UT = createUnitTransform2D(yMontageSize, xMontageSize); + + return stitchMontage(stageTiles, inputPath, outFilename, UO, US, UT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a unit origin, dynamic spacing, and unit transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest1(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D UO = createUnitOrigin2D(yMontageSize, xMontageSize); + Spacing2D DS = createSpacing2D(yMontageSize, xMontageSize, 0.5); + Transform2D UT = createUnitTransform2D(yMontageSize, xMontageSize); + + return stitchMontage(stageTiles, inputPath, outFilename, UO, DS, UT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a unit origin, unit spacing, and dynamic transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest2(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D UO = createUnitOrigin2D(yMontageSize, xMontageSize); + Spacing2D US = createSpacing2D(yMontageSize, xMontageSize, 1); + Transform2D DT = createTransform2DFromStageTiles(stageTiles); + + return stitchMontage(stageTiles, inputPath, outFilename, UO, US, DT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a unit origin, dynamic spacing, and dynamic transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest3(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D UO = createUnitOrigin2D(yMontageSize, xMontageSize); + Spacing2D DS = createSpacing2D(yMontageSize, xMontageSize, 0.5); + Transform2D DT = createTransform2DFromStageTiles(stageTiles); + + // Halve all the DT values to account for the spacing of 0.5 + for (TransformPtrRow & transform_row : DT) + { + for (typename MontageType::TransformPointer & transform : transform_row) + { + auto offset = transform->GetOffset(); + for (unsigned i = 0; i < Dimension; i++) + { + offset[i] = offset[i] / 2; + } + transform->SetOffset(offset); + } + } + + return stitchMontage(stageTiles, inputPath, outFilename, UO, DS, DT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a dynamic origin, unit spacing, and unit transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest4(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D DO = createOrigin2DFromStageTiles(stageTiles); + Spacing2D US = createSpacing2D(yMontageSize, xMontageSize, 1); + Transform2D UT = createUnitTransform2D(yMontageSize, xMontageSize); + + return stitchMontage(stageTiles, inputPath, outFilename, DO, US, UT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a dynamic origin, dynamic spacing, and unit transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest5(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + Origin2D DO = createOrigin2DFromStageTiles(stageTiles); + + // Halve all the DO values to account for the spacing of 0.5 + for (OriginRow & origin_row : DO) + { + for (OriginPoint & origin : origin_row) + { + for (unsigned i = 0; i < Dimension; i++) + { + origin[i] = origin[i] / 2; + } + } + } + + Spacing2D DS = createSpacing2D(yMontageSize, xMontageSize, 0.5); + Transform2D UT = createUnitTransform2D(yMontageSize, xMontageSize); + + return stitchMontage(stageTiles, inputPath, outFilename, DO, DS, UT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a dynamic origin, unit spacing, and dynamic transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest6(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + // Create DO values so that the tiles start out [col * 100] pixels away from the correct position + Origin2D DO(stageTiles.AxisSizes[1]); + size_t t = 0; + for (unsigned col = 0; col < yMontageSize; col++) + { + DO[col].resize(stageTiles.AxisSizes[0]); + for (unsigned row = 0; row < xMontageSize; row++) + { + PointType pos = stageTiles.Tiles[t].Position; + for (unsigned i = 0; i < Dimension; i++) + { + // Get correct origin value, then add [col * 100] to it + pos[i] = pos[i] + (col * 100); + } + DO[col][row] = pos; + + t++; + } + } + + Spacing2D US = createSpacing2D(yMontageSize, xMontageSize, 1); + + // Create DT values so that the tiles are translated back to their correct positions + Transform2D DT(yMontageSize); + t = 0; + for (unsigned col = 0; col < yMontageSize; col++) + { + DT[col].resize(xMontageSize); + for (unsigned row = 0; row < xMontageSize; row++) + { + typename MontageType::TransformPointer transform = MontageType::TransformType::New(); + + auto offset = transform->GetOffset(); + for (unsigned i = 0; i < Dimension; i++) + { + offset[i] = (col * 100); + } + transform->SetOffset(offset); + DT[col][row] = transform; + + t++; + } + } + + return stitchMontage(stageTiles, inputPath, outFilename, DO, US, DT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that creates a dynamic origin, dynamic spacing, and dynamic transform and calls the test + * ----------------------------------------------------------------------------------------------- */ + int + inMemoryMontageTest7(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + unsigned streamSubdivisions) + { + unsigned yMontageSize = stageTiles.AxisSizes[1]; + unsigned xMontageSize = stageTiles.AxisSizes[0]; + + // Create DO values so that the tiles start out [col * 100] pixels away from the correct position + Origin2D DO(stageTiles.AxisSizes[1]); + size_t t = 0; + for (unsigned col = 0; col < yMontageSize; col++) + { + DO[col].resize(stageTiles.AxisSizes[0]); + for (unsigned row = 0; row < xMontageSize; row++) + { + PointType pos = stageTiles.Tiles[t].Position; + for (unsigned i = 0; i < Dimension; i++) + { + // Get correct origin value, divide by 2 to account for the 0.5 spacing, then add [col * 100] + pos[i] = (pos[i] / 2) + (col * 100); + } + DO[col][row] = pos; + + t++; + } + } + + Spacing2D DS = createSpacing2D(yMontageSize, xMontageSize, 0.5); + + // Create DT values so that the tiles are translated back to their correct positions + Transform2D DT(yMontageSize); + t = 0; + for (unsigned col = 0; col < yMontageSize; col++) + { + DT[col].resize(xMontageSize); + for (unsigned row = 0; row < xMontageSize; row++) + { + typename MontageType::TransformPointer transform = MontageType::TransformType::New(); + + auto offset = transform->GetOffset(); + for (unsigned i = 0; i < Dimension; i++) + { + offset[i] = (col * 100); + } + transform->SetOffset(offset); + DT[col][row] = transform; + + t++; + } + } + + return stitchMontage(stageTiles, inputPath, outFilename, DO, DS, DT, streamSubdivisions); + } + + /* ----------------------------------------------------------------------------------------------- + * Helper Method that executes a given montage test with a given origin2D, spacing2D, and transform2D + * ----------------------------------------------------------------------------------------------- */ + int + stitchMontage(const TileConfig & stageTiles, + const std::string & inputPath, + const std::string & outFilename, + Origin2D origin2D, + Spacing2D spacing2D, + Transform2D transform2D, + unsigned streamSubdivisions) + { + itk::ObjectFactoryBase::RegisterFactory(itk::TxtTransformIOFactory::New()); + unsigned yMontageSize = origin2D.size(); + unsigned xMontageSize = origin2D[0].size(); + + // write generated mosaic + typename MontageType::TileIndexType ind; + using Resampler = itk::TileMergeImageFilter; + typename Resampler::Pointer resampleF = Resampler::New(); + itk::SimpleFilterWatcher fw2(resampleF, "resampler"); + resampleF->SetMontageSize({ xMontageSize, yMontageSize }); + unsigned t = 0; + for (unsigned y = 0; y < yMontageSize; y++) + { + ind[1] = y; + for (unsigned x = 0; x < xMontageSize; x++) + { + ind[0] = x; + std::string filename = inputPath + stageTiles.Tiles[t].FileName; + + typename OriginalImageType::Pointer image = ReadImage(filename.c_str()); + typename OriginalImageType::PointType origin = origin2D[y][x]; + typename OriginalImageType::SpacingType spacing = spacing2D[y][x]; + image->SetOrigin(origin); + image->SetSpacing(spacing); + resampleF->SetInputTile(ind, image); + + typename MontageType::TransformConstPointer transform = transform2D[y][x]; + resampleF->SetTileTransform(ind, transform); + t++; + } + } + + resampleF->Update(); + + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer w = WriterType::New(); + w->SetInput(resampleF->GetOutput()); + // resampleF->DebugOn(); //generate an image of contributing regions + w->SetFileName(outFilename); + // w->UseCompressionOn(); + w->SetNumberOfStreamDivisions(streamSubdivisions); + w->Update(); + + return EXIT_SUCCESS; + } + + template + typename TImage::Pointer + ReadImage(const char * filename) + { + using ReaderType = itk::ImageFileReader; + typename ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(filename); + reader->Update(); + return reader->GetOutput(); + } + + Origin2D + createUnitOrigin2D(unsigned numOfRows, unsigned numOfCols) + { + Origin2D UO; + + OriginPoint UO_point; + for (unsigned i = 0; i < Dimension; i++) + { + UO_point[i] = 0; + } + + for (unsigned i = 0; i < numOfRows; i++) + { + OriginRow row; + for (unsigned j = 0; j < numOfCols; j++) + { + row.push_back(UO_point); + } + UO.push_back(row); + } + + return UO; + } + + Origin2D + createOrigin2DFromStageTiles(TileConfig stageTiles) + { + Origin2D UO(stageTiles.AxisSizes[1]); + + for (size_t y = 0; y < stageTiles.AxisSizes[1]; y++) + { + UO[y].resize(stageTiles.AxisSizes[0]); + for (size_t x = 0; x < stageTiles.AxisSizes[0]; x++) + { + UO[y][x] = stageTiles.Tiles[stageTiles.nDIndexToLinearIndex({ x, y })].Position; + } + } + + return UO; + } + + Spacing2D + createSpacing2D(unsigned numOfRows, unsigned numOfCols, double value) + { + Spacing2D US; + + SpacingType spacing; + for (unsigned i = 0; i < Dimension; i++) + { + spacing[i] = value; + } + + for (unsigned i = 0; i < numOfRows; i++) + { + SpacingRow row; + for (unsigned j = 0; j < numOfCols; j++) + { + row.push_back(spacing); + } + US.push_back(row); + } + + return US; + } + + Transform2D + createUnitTransform2D(unsigned numOfRows, unsigned numOfCols) + { + Transform2D UT; + + for (unsigned i = 0; i < numOfRows; i++) + { + TransformPtrRow transform_row; + for (unsigned j = 0; j < numOfCols; j++) + { + typename MontageType::TransformPointer transform = MontageType::TransformType::New(); + transform_row.push_back(transform); + } + UT.push_back(transform_row); + } + + return UT; + } + + Transform2D + createTransform2DFromStageTiles(TileConfig stageTiles) + { + Transform2D UT(stageTiles.AxisSizes[1]); + + // initialize + for (size_t y = 0; y < stageTiles.AxisSizes[1]; y++) + { + UT[y].resize(stageTiles.AxisSizes[0]); + } + + // fill with translations + typename TileConfig::TileIndexType ind; + for (size_t t = 0; t < stageTiles.LinearSize(); t++) + { + typename MontageType::TransformPointer transform = MontageType::TransformType::New(); + ind = stageTiles.LinearIndexToNDIndex(t); + auto offset = transform->GetOffset(); + for (unsigned d = 0; d < MontageType::TransformType::SpaceDimension; d++) + { + offset[d] = -stageTiles.Tiles[t].Position[d]; + } + transform->SetOffset(offset); + UT[ind[1]][ind[0]] = transform; + } + + return UT; + } +}; + +#endif // itkInMemoryMontageTestHelper_hxx diff --git a/Modules/Registration/Montage/test/itkMontageGenericTests.cxx b/Modules/Registration/Montage/test/itkMontageGenericTests.cxx new file mode 100644 index 000000000000..fef5b5d3c1a4 --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontageGenericTests.cxx @@ -0,0 +1,78 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkPhaseCorrelationOptimizer.h" +#include "itkPhaseCorrelationImageRegistrationMethod.h" +#include "itkPhaseCorrelationOperator.h" +#include "itkTestingMacros.h" +#include "itkTileMergeImageFilter.h" +#include "itkTileMontage.h" +#include + +int +itkMontageGenericTests(int, char ** const) +{ + constexpr unsigned Dimension = 4; + using ImageType = itk::Image; + using PCMType = itk::PhaseCorrelationImageRegistrationMethod; + using OperatorType = itk::PhaseCorrelationOperator; + using OptimizerType = itk::PhaseCorrelationOptimizer; + using MontageTypeD = itk::TileMontage; + using MontageTypeF = itk::TileMontage; + using MergingTypeD = + itk::TileMergeImageFilter>; + using MergingTypeF = + itk::TileMergeImageFilter>; + using TileIndexType = typename MergingTypeF::TileIndexType; + using SizeType = typename MergingTypeF::SizeType; + + OperatorType::Pointer pcmOperator = OperatorType::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(pcmOperator, PhaseCorrelationOperator, ImageToImageFilter); + ITK_TRY_EXPECT_EXCEPTION(pcmOperator->Update()); // inputs not set! + OptimizerType::Pointer pcmOptimizer = OptimizerType::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(pcmOptimizer, PhaseCorrelationOptimizer, ProcessObject); + ITK_TRY_EXPECT_EXCEPTION(pcmOptimizer->Update()); // inputs not set! + PCMType::Pointer pcm = PCMType::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(pcm, PhaseCorrelationImageRegistrationMethod, ProcessObject); + ITK_TRY_EXPECT_EXCEPTION(pcm->Update()); // inputs not set! + MontageTypeD::Pointer tmD = MontageTypeD::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(tmD, TileMontage, ProcessObject); + ITK_TRY_EXPECT_EXCEPTION(tmD->Update()); // inputs not set! + MontageTypeF::Pointer tmF = MontageTypeF::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(tmF, TileMontage, ProcessObject); + ITK_TRY_EXPECT_EXCEPTION(tmF->Update()); // inputs not set! + MergingTypeD::Pointer mtD = MergingTypeD::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(mtD, TileMergeImageFilter, TileMontage); + ITK_TRY_EXPECT_EXCEPTION(mtD->Update()); // inputs not set! + MergingTypeF::Pointer mtF = MergingTypeF::New(); + ITK_EXERCISE_BASIC_OBJECT_METHODS(mtF, TileMergeImageFilter, TileMontage); + ITK_TRY_EXPECT_EXCEPTION(mtF->Update()); // inputs not set! + + // exercise nD index conversions + SizeType size = { 2, 3, 4, 5 }; + TileIndexType ind0 = { 0, 0, 0, 2 }; + TileIndexType ind1 = { 1, 2, 3, 2 }; + TileIndexType ind2 = { 0, 0, 0, 4 }; + mtF->SetMontageSize(size); + mtF->SetTileTransform(ind0, nullptr); + mtF->SetTileTransform(ind1, nullptr); + mtF->SetTileTransform(ind2, nullptr); + ITK_TEST_SET_GET_BOOLEAN(mtF, CropToFill, true); + + return EXIT_SUCCESS; +} diff --git a/Modules/Registration/Montage/test/itkMontagePCMTestFiles.cxx b/Modules/Registration/Montage/test/itkMontagePCMTestFiles.cxx new file mode 100644 index 000000000000..1f35c6332799 --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontagePCMTestFiles.cxx @@ -0,0 +1,185 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#include "itkArray.h" +#include "itkCastImageFilter.h" +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkLinearInterpolateImageFunction.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkPhaseCorrelationImageRegistrationMethod.h" +#include "itkResampleImageFilter.h" + +namespace itk +{ + +template +int +PhaseCorrelationRegistrationFiles(int argc, char * argv[]) +{ + bool pass = true; + + constexpr unsigned int Dimension = VDimension; + using FixedPixelType = TFixedImagePixel; + using MovingPixelType = TMovingImagePixel; + using FixedImageType = itk::Image; + using MovingImageType = itk::Image; + + itkAssertOrThrowMacro(argc == 4 + 2 * Dimension, "Wrong number of parameters"); + + using FixedReaderType = itk::ImageFileReader; + typename FixedReaderType::Pointer fixedReader = FixedReaderType::New(); + fixedReader->SetFileName(argv[1]); + const FixedImageType * fixedImage = fixedReader->GetOutput(); + + using MovingReaderType = itk::ImageFileReader; + typename MovingReaderType::Pointer movingReader = MovingReaderType::New(); + movingReader->SetFileName(argv[2]); + typename MovingImageType::Pointer movingImage = movingReader->GetOutput(); + movingImage->Update(); + movingImage->DisconnectPipeline(); + + typename MovingImageType::SpacingType spacing = movingImage->GetSpacing(); + typename MovingImageType::PointType origin = movingImage->GetOrigin(); + for (unsigned d = 0; d < VDimension; d++) + { + origin[d] = std::stod(argv[4 + d]); + } + movingImage->SetOrigin(origin); + + // Registration method + using PhaseCorrelationMethodType = itk::PhaseCorrelationImageRegistrationMethod; + typename PhaseCorrelationMethodType::Pointer phaseCorrelationMethod = PhaseCorrelationMethodType::New(); + phaseCorrelationMethod->SetFixedImage(fixedImage); + phaseCorrelationMethod->SetMovingImage(movingImage); + typename PhaseCorrelationMethodType::SizeType pad; + pad.Fill(8 * sizeof(TFixedImagePixel)); + phaseCorrelationMethod->SetObligatoryPadding(pad); + phaseCorrelationMethod->DebugOn(); + + // Operator type + using OperatorType = + itk::PhaseCorrelationOperator; + typename OperatorType::Pointer pcmOperator = OperatorType::New(); + phaseCorrelationMethod->SetOperator(pcmOperator); + + // Optimizer type + using OptimizerType = + itk::PhaseCorrelationOptimizer; + typename OptimizerType::Pointer pcmOptimizer = OptimizerType::New(); + phaseCorrelationMethod->SetOptimizer(pcmOptimizer); + + // Transform type + using TransformType = typename PhaseCorrelationMethodType::TransformType; + using ParametersType = typename TransformType::ParametersType; + + using PadMethod = typename PhaseCorrelationMethodType::PaddingMethodEnum; + for (auto padMethod : { PadMethod::Zero, PadMethod::Mirror, PadMethod::MirrorWithExponentialDecay }) + { + phaseCorrelationMethod->SetPaddingMethod(padMethod); + std::cout << "Padding method " << static_cast(padMethod) << std::endl; + phaseCorrelationMethod->Update(); + + // Get registration result and validate it. + ParametersType finalParameters = phaseCorrelationMethod->GetTransformParameters(); + ParametersType transformParameters = phaseCorrelationMethod->GetOutput()->Get()->GetParameters(); + + const unsigned int numberOfParameters = finalParameters.Size(); + ParametersType actualParameters(numberOfParameters); + for (unsigned int ii = 4 + VDimension; ii < 4 + VDimension + numberOfParameters; ++ii) + { + actualParameters[ii - 4 - VDimension] = std::stod(argv[ii]); + } + + + const double tolerance = 1.0; // equivalent to 1 pixel. + + // Validate first two parameters (introduced by image source) + for (unsigned int ii = 0; ii < numberOfParameters; ++ii) + { + // the parameters are negated in order to get the inverse transformation. + // this only works for comparing translation parameters.... + std::cout << finalParameters[ii] << " == " << actualParameters[ii] << " == " << transformParameters[ii] + << std::endl; + + if ((itk::Math::abs(finalParameters[ii] - actualParameters[ii]) > tolerance * spacing[ii]) || + (itk::Math::abs(transformParameters[ii] - actualParameters[ii]) > tolerance * spacing[ii])) + { + std::cerr << "Tolerance exceeded at component " << ii << std::endl; + pass = false; + } + } + + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetFileName(argv[3]); + writer->SetInput(phaseCorrelationMethod->GetPhaseCorrelationImage()); + writer->Update(); + } + + std::cout << std::endl; + if (!pass) + { + std::cout << "Test FAILED." << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Test PASSED." << std::endl; + return EXIT_SUCCESS; +} + +} // namespace itk + + +int +itkMontagePCMTestFiles(int argc, char * argv[]) +{ + if (argc < 7) + { + std::cerr << "Usage: " << argv[0]; + std::cerr << " "; + std::cerr << " initialX initialY [initialZ] trueX trueY [trueZ]" << std::endl; + return EXIT_FAILURE; + } + + try + { + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(argv[1], itk::IOFileModeEnum::ReadMode); + imageIO->SetFileName(argv[1]); + imageIO->ReadImageInformation(); + // const itk::ImageIOBase::IOComponentType pixelType = imageIO->GetComponentType(); + const size_t numDimensions = imageIO->GetNumberOfDimensions(); + if (numDimensions <= 2) + { + return itk::PhaseCorrelationRegistrationFiles<2, unsigned short, unsigned short>(argc, argv); + } + else if (numDimensions == 3) + { + return itk::PhaseCorrelationRegistrationFiles<3, unsigned short, unsigned short>(argc, argv); + } + else + { + std::cerr << "Only 2D and 3D scalar images are supported!" << std::endl; + return EXIT_FAILURE; + } + } + catch (itk::ExceptionObject & error) + { + std::cerr << error << std::endl; + return EXIT_FAILURE; + } +} diff --git a/Modules/Registration/Montage/test/itkMontagePCMTestSynthetic.cxx b/Modules/Registration/Montage/test/itkMontagePCMTestSynthetic.cxx new file mode 100644 index 000000000000..88775b9a638a --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontagePCMTestSynthetic.cxx @@ -0,0 +1,376 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ +#include "itkArray.h" +#include "itkImageFileWriter.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkMontageTestHelper.hxx" //for WriteTransform +#include "itkNumericTraits.h" +#include "itkPhaseCorrelationImageRegistrationMethod.h" +#include + +namespace itk +{ +template +class HyperSphereImageSource : public itk::Object +{ +public: + using Self = HyperSphereImageSource; + using Superclass = Object; + using Pointer = SmartPointer; + using ConstPointer = SmartPointer; + using ParametersType = Array; + + /** Method for creation through the object factory. */ + itkNewMacro(Self); + + /** Run-time type information (and related methods). */ + itkOverrideGetNameOfClassMacro(HyperSphereImageSource); + + using ImageType = itk::Image; + + ImageType * + GenerateImage() + { + m_Image = ImageType::New(); + + typename ImageType::IndexType index; + index.Fill(0); + typename ImageType::RegionType region; + region.SetSize(m_ImageSize); + region.SetIndex(index); + + m_Image->SetLargestPossibleRegion(region); + m_Image->SetBufferedRegion(region); + m_Image->SetRequestedRegion(region); + m_Image->Allocate(); + + m_Image->SetSpacing(m_ImageSpacing); + m_Image->SetOrigin(m_ImageOrigin); + m_Image->SetDirection(m_ImageDirection); + + multiThreader->ParallelizeImageRegion( + region, + [&](const typename ImageType::RegionType & fragment) { + itk::Point p; + TPixel value; + itk::ImageRegionIteratorWithIndex it(m_Image, fragment); + while (!it.IsAtEnd()) + { + m_Image->TransformIndexToPhysicalPoint(it.GetIndex(), p); + if (m_SphereCenter.EuclideanDistanceTo(p) > m_SphereRadius) + { + value = itk::NumericTraits::ZeroValue(); + } + else + { + value = itk::NumericTraits::OneValue(); + } + it.Set(value); + ++it; + } + }, + nullptr); + + return m_Image.GetPointer(); + } + +protected: + HyperSphereImageSource() + { + m_SphereRadius = 50.0; + m_SphereCenter.Fill(50.0); + m_ImageOrigin.Fill(0.0); + m_ImageSize.Fill(100); + m_ImageSpacing.Fill(1.0); + m_ImageDirection.SetIdentity(); + } + +private: + typename ImageType::Pointer m_Image; + + typename MultiThreaderBase::Pointer multiThreader = MultiThreaderBase::New(); + +public: + double m_SphereRadius; + typename ImageType::PointType m_SphereCenter; + typename ImageType::PointType m_ImageOrigin; + typename ImageType::SizeType m_ImageSize; + typename ImageType::SpacingType m_ImageSpacing; + typename ImageType::DirectionType m_ImageDirection; +}; +} // namespace itk + + +template +int +PhaseCorrelationRegistration(int argc, char * argv[]) +{ + if (argc < 6) + { + std::cerr << "Usage: " << argv[0] << " <>"; + std::cerr << " [movingImageSpacings]" << std::endl; + std::cerr << "e.g.\n\t" << argv[0] << " 2cf phase.nrrd transform.tfm 17 31 1.0 1.0" << std::endl; + return EXIT_FAILURE; + } + const char * phaseCorrelationFile = argv[2]; + unsigned startSize = std::stoul(argv[4]); + unsigned endSize = std::stoul(argv[5]); + + using FixedImageType = itk::Image; + using MovingImageType = itk::Image; + using SizeType = typename MovingImageType::SizeType; + using FixedImageSourceType = itk::HyperSphereImageSource; + using MovingImageSourceType = itk::HyperSphereImageSource; + using PCMType = itk::PhaseCorrelationImageRegistrationMethod; + using OperatorType = itk::PhaseCorrelationOperator; + using OptimizerType = itk::PhaseCorrelationOptimizer; + using TransformType = typename PCMType::TransformType; + using ParametersType = typename TransformType::ParametersType; + + typename OperatorType::Pointer pcmOperator = OperatorType::New(); + typename OptimizerType::Pointer pcmOptimizer = OptimizerType::New(); + typename PCMType::Pointer pcm = PCMType::New(); + pcm->SetOperator(pcmOperator); + pcm->SetOptimizer(pcmOptimizer); + pcm->DebugOn(); + + typename FixedImageSourceType::Pointer fixedImageSource = FixedImageSourceType::New(); + typename MovingImageSourceType::Pointer movingImageSource = MovingImageSourceType::New(); + + bool pass = true; + itk::ObjectFactoryBase::RegisterFactory(itk::TxtTransformIOFactory::New()); + + using TestCoefficientsType = std::array; + std::vector testCoefficients = { { 2.0, -0.1, 0.05, 0.1, -2.1 }, + { 2.5, -0.3, 0.05, 0.15, 2.15 } }; + + for (unsigned size1 = startSize; size1 <= endSize; size1++) + { + std::cout << "\nSize " << size1 << std::endl; + for (const auto & coef : testCoefficients) + { + std::cout << "Coefficient set " << (&coef - &testCoefficients[0]) << std::endl; + fixedImageSource->m_SphereRadius = size1 / coef[0]; + fixedImageSource->m_SphereCenter.Fill(size1 / 2.0); + movingImageSource->m_SphereRadius = size1 / coef[0]; + movingImageSource->m_SphereCenter.Fill(size1 / 2.0); + + SizeType size; + size.Fill(size1); + fixedImageSource->m_ImageSize = size; + typename FixedImageType::ConstPointer fixedImage = fixedImageSource->GenerateImage(); + + ParametersType actualParameters(VDimension); + typename MovingImageType::SizeType movingSize; + typename MovingImageType::PointType movingOrigin; + typename MovingImageType::SpacingType movingSpacing; + movingSpacing.Fill(1.0); + + for (unsigned int i = 0; i < VDimension; i++) + { + actualParameters[i] = coef[1] + i * (1 + size1 * coef[2]); + movingImageSource->m_SphereCenter[i] += actualParameters[i]; + movingOrigin[i] = size1 * coef[3] + i * coef[4]; + // movingSpacing[i] = 1.0 / (0.8 + i); //test different spacing (unsupported) + if (argc > 6 + int(i)) + { + movingSpacing[i] = std::stod(argv[6 + i]); + } + movingSize[i] = (unsigned long)(size[i] / movingSpacing[i] + 3 * std::pow(-1, i)); + movingSize[i] = std::max(movingSize[i], 7u); + } + + // modify the size of the moving image + // this tests the ability of PCM to padd the images to the same real size + movingImageSource->m_ImageSize = movingSize; + movingImageSource->m_ImageSpacing = movingSpacing; + + // shift the origin of the moving image + // this tests the ability of PCM to introduce between-image origin offset + // into the transformation (so the final parameters can be directly used to + // resample the two images into the same coordinate system) + movingImageSource->m_ImageOrigin = movingOrigin; + typename MovingImageType::ConstPointer movingImage = movingImageSource->GenerateImage(); + + pcm->SetFixedImage(fixedImage); + pcm->SetMovingImage(movingImage); + + using PadMethod = typename PCMType::PaddingMethodEnum; + for (auto padMethod : { PadMethod::Zero, PadMethod::Mirror, PadMethod::MirrorWithExponentialDecay }) + { + pcm->SetPaddingMethod(padMethod); + std::cout << "Padding method " << static_cast(padMethod) << std::endl; + + using PeakMethod = typename OptimizerType::PeakInterpolationMethodEnum; + for (auto peakMethod : { PeakMethod::None, PeakMethod::Parabolic, PeakMethod::Cosine }) + { + pcmOptimizer->SetPeakInterpolationMethod(peakMethod); + pcm->Modified(); // optimizer is not an "input" to PCM + // so its modification does not cause a pipeline update automatically + std::cout << "Peak interpolation method " << static_cast(peakMethod) << std::endl; + + try + { + pcm->Update(); + if (pcm->GetFixedImageFFT()->GetLargestPossibleRegion().GetSize(0) == 0) + { + std::cout << "Fixed FFT cache's size[0] must be positive!" << std::endl; + pass = false; + } + if (pcm->GetMovingImageFFT()->GetLargestPossibleRegion().GetSize(0) == 0) + { + std::cout << "Moving FFT cache's size[0] must be positive!" << std::endl; + pass = false; + } + } + catch (itk::ExceptionObject & e) + { + std::cerr << e << std::endl; + pass = false; + } + + // Get registration result and validate it. + ParametersType finalParameters = pcm->GetTransformParameters(); + ParametersType transformParameters = pcm->GetOutput()->Get()->GetParameters(); + + const unsigned int numberOfParameters = actualParameters.Size(); + const double tolerance = 1.0 + 1e-6; + + // Validate the translation parameters + for (unsigned int i = 0; i < numberOfParameters; i++) + { + std::cout << finalParameters[i] << " == " << actualParameters[i] << " == " << transformParameters[i]; + + if ((itk::Math::abs(finalParameters[i] - actualParameters[i]) > tolerance) || + (itk::Math::abs(transformParameters[i] - actualParameters[i]) > tolerance)) + { + std::cout << " Tolerance exceeded at component " << i << std::endl; + pass = false; + } + else + { + std::cout << std::endl; + } + } + + // All other parameters must be 0 + for (unsigned int i = numberOfParameters; i < VDimension; i++) + { + if ((itk::Math::abs(finalParameters[i]) > tolerance) || + (itk::Math::abs(transformParameters[i]) > tolerance)) + { + std::cout << "Tolerance exceeded at component " << i << std::endl; + pass = false; + } + } + + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetFileName(phaseCorrelationFile); + writer->SetInput(pcm->GetPhaseCorrelationImage()); + try + { + writer->Update(); + } + catch (itk::ExceptionObject & e) + { + std::cerr << e << std::endl; + pass = false; + } + + try + { + WriteTransform(pcm->GetOutput()->Get(), argv[3]); + } + catch (itk::ExceptionObject & e) + { + std::cerr << e << std::endl; + pass = false; + } + } // for peakMethod + } // for padMethod + } // for testCoefficients + } // for size1 + + std::cout << *pcm; + + if (!pass) + { + std::cout << "Test FAILED." << std::endl; + return EXIT_FAILURE; + } + + std::cout << "Test PASSED." << std::endl; + return EXIT_SUCCESS; +} + + +int +itkMontagePCMTestSynthetic(int argc, char * argv[]) +{ + if (argc < 2) + { + std::cerr << "Usage: " << argv[0] << " <>" + << std::endl; + return EXIT_FAILURE; + } + + if (!strcmp(argv[1], "2cc")) + { + return PhaseCorrelationRegistration<2, signed char, signed char>(argc, argv); + } + else if (!strcmp(argv[1], "2ff")) + { + return PhaseCorrelationRegistration<2, float, float>(argc, argv); + } + else if (!strcmp(argv[1], "2dd")) + { + return PhaseCorrelationRegistration<2, double, double>(argc, argv); + } + else if (!strcmp(argv[1], "2cf")) + { + return PhaseCorrelationRegistration<2, signed char, float>(argc, argv); + } + else if (!strcmp(argv[1], "2fd")) + { + return PhaseCorrelationRegistration<2, float, double>(argc, argv); + } + else if (!strcmp(argv[1], "3cc")) + { + return PhaseCorrelationRegistration<3, signed char, signed char>(argc, argv); + } + else if (!strcmp(argv[1], "3ff")) + { + return PhaseCorrelationRegistration<3, float, float>(argc, argv); + } + else if (!strcmp(argv[1], "3dd")) + { + return PhaseCorrelationRegistration<3, double, double>(argc, argv); + } + else if (!strcmp(argv[1], "3cf")) + { + return PhaseCorrelationRegistration<3, signed char, float>(argc, argv); + } + else if (!strcmp(argv[1], "3fd")) + { + return PhaseCorrelationRegistration<3, float, double>(argc, argv); + } + + std::cerr << "Unexpected Dimension/FixedPixelType/MovingPixelType!" << std::endl; + return EXIT_FAILURE; +} diff --git a/Modules/Registration/Montage/test/itkMontageTest.cxx b/Modules/Registration/Montage/test/itkMontageTest.cxx new file mode 100644 index 000000000000..994ca22c8ec2 --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontageTest.cxx @@ -0,0 +1,188 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkMontageTestHelper.hxx" +#include "itkPairwiseTestHelper.hxx" +#include "itkTileConfiguration.h" +#include "itkRGBPixel.h" +#include "itkNumericTraits.h" + +template +int +itkMontageTestHelper2(int argc, + char * argv[], + const std::string & inputPath, + itk::TileConfiguration stageTiles, + itk::TileConfiguration actualTiles) +{ + bool varyPaddingMethods = true; + if (argc > 4) + { + varyPaddingMethods = std::stoi(argv[4]); + } + int peakMethod = -1; + if (argc > 5) + { + peakMethod = std::stoi(argv[5]); + } + bool loadIntoMemory = false; + if (argc > 6) + { + loadIntoMemory = std::stoi(argv[6]); + } + unsigned streamSubdivisions = 1; + if (argc > 7) + { + streamSubdivisions = std::stoul(argv[7]); + } + bool doPairs = true; + if (argc > 8) + { + doPairs = std::stoi(argv[8]); + } + bool writeTransforms = false; + if (argc > 9) + { + writeTransforms = std::stoi(argv[9]); + } + bool allowDrift = false; + if (argc > 10) + { + allowDrift = std::stoi(argv[10]); + } + unsigned positionTolerance = 0; + if (argc > 11) + { + positionTolerance = std::stoul(argv[11]); + } + bool writeImage = true; + if (argc > 12) + { + writeImage = std::stoi(argv[12]); + } + + int r1, r2 = EXIT_SUCCESS; + r1 = montageTest(stageTiles, + actualTiles, + inputPath, + argv[2], + varyPaddingMethods, + peakMethod, + loadIntoMemory, + streamSubdivisions, + writeTransforms, + allowDrift, + positionTolerance, + writeImage); + if (doPairs) + { + r2 = pairwiseTests::ValueType>( + stageTiles, actualTiles, inputPath, argv[3], varyPaddingMethods, positionTolerance); + } + + if (r1 == EXIT_FAILURE || r2 == EXIT_FAILURE) + { + return EXIT_FAILURE; + } + return EXIT_SUCCESS; +} + +template +int +itkMontageTestHelper(int argc, char * argv[], const std::string & inputPath) +{ + itk::TileConfiguration stageTiles, actualTiles; + stageTiles.Parse(inputPath + "TileConfiguration.txt"); + try + { + actualTiles.Parse(inputPath + "TileConfiguration.GroundTruth.txt"); + } + catch (...) + { + actualTiles.Parse(inputPath + "TileConfiguration.registered.txt"); + } + + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO( + (inputPath + stageTiles.Tiles[0].FileName).c_str(), itk::IOFileModeEnum::ReadMode); + imageIO->SetFileName(inputPath + stageTiles.Tiles[0].FileName); + imageIO->ReadImageInformation(); + const itk::IOPixelEnum pixelType = imageIO->GetPixelType(); + const itk::IOComponentEnum cType = imageIO->GetComponentType(); + + if (pixelType == itk::IOPixelEnum::RGB) + { + return itkMontageTestHelper2, itk::RGBPixel>( + argc, argv, inputPath, stageTiles, actualTiles); + } + else if (cType == itk::IOComponentEnum::SHORT) + { + return itkMontageTestHelper2(argc, argv, inputPath, stageTiles, actualTiles); + } + else // cast everything else to USHORT + { + return itkMontageTestHelper2(argc, argv, inputPath, stageTiles, actualTiles); + } +} + +int +itkMontageTest(int argc, char * argv[]) +{ + if (argc < 4) + { + std::cerr << "Usage: " << argv[0] << " "; + std::cerr << " [ varyPaddingMethods peakMethod loadIntoMemory streamSubdivisions doPairs"; + std::cerr << " writeTransforms allowDrift positionTolerance writeImage ]" << std::endl; + return EXIT_FAILURE; + } + + std::string inputPath = argv[1]; + if (inputPath.back() != '/' && inputPath.back() != '\\') + { + inputPath += '/'; + } + + try + { + unsigned dim; + itk::TileConfiguration<2>::TryParse(inputPath + "TileConfiguration.txt", dim); + + switch (dim) + { + case 2: + return itkMontageTestHelper<2>(argc, argv, inputPath); + case 3: + return itkMontageTestHelper<3>(argc, argv, inputPath); + default: + std::cerr << "Only dimensions 2 and 3 are supported. You are attempting to montage dimension " << dim; + return EXIT_FAILURE; + } + } + catch (itk::ExceptionObject & exc) + { + std::cerr << exc; + } + catch (std::runtime_error & exc) + { + std::cerr << exc.what(); + } + catch (...) + { + std::cerr << "Unknown error has occurred" << std::endl; + } + return EXIT_FAILURE; +} diff --git a/Modules/Registration/Montage/test/itkMontageTestHelper.hxx b/Modules/Registration/Montage/test/itkMontageTestHelper.hxx new file mode 100644 index 000000000000..2d4be03f3acb --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontageTestHelper.hxx @@ -0,0 +1,430 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkMontageTestHelper_hxx +#define itkMontageTestHelper_hxx + +#include "itkAffineTransform.h" +#include "itkImageFileWriter.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkTileConfiguration.h" +#include "itkRGBToLuminanceImageFilter.h" +#include "itkSimpleFilterWatcher.h" +#include "itkTileMergeImageFilter.h" +#include "itkTileMontage.h" +#include "itkTransformFileWriter.h" +#include "itkTxtTransformIOFactory.h" + +#include +#include +#include + +template +void +WriteTransform(const TransformType * transform, std::string filename) +{ + using AffineType = itk::AffineTransform; + using TransformWriterType = itk::TransformFileWriterTemplate; + TransformWriterType::Pointer tWriter = TransformWriterType::New(); + tWriter->SetFileName(filename); + + if (TransformType::SpaceDimension >= 2 || TransformType::SpaceDimension <= 3) + { // convert into affine which Slicer can read + AffineType::Pointer aTr = AffineType::New(); + AffineType::TranslationType t; + t.Fill(0); + for (unsigned i = 0; i < TransformType::SpaceDimension; i++) + { + t[i] = transform->GetOffset()[i]; + } + aTr->SetTranslation(t); + tWriter->SetInput(aTr); + } + else + { + tWriter->SetInput(transform); + } + tWriter->Update(); +} + +template +typename TImage::Pointer +ReadImage(const char * filename) +{ + using ReaderType = itk::ImageFileReader; + typename ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(filename); + reader->Update(); + return reader->GetOutput(); +} + +// use SFINAE to select whether to do simple assignment or RGB to Luminance conversion +template +typename std::enable_if::value, void>::type +assignRGBtoScalar(typename RGBImage::Pointer rgbImage, typename ScalarImage::Pointer & scalarImage) +{ + scalarImage = rgbImage; +} +template +typename std::enable_if::value, void>::type +assignRGBtoScalar(typename RGBImage::Pointer rgbImage, typename ScalarImage::Pointer & scalarImage) +{ + using CastType = itk::RGBToLuminanceImageFilter; + typename CastType::Pointer caster = CastType::New(); + caster->SetInput(rgbImage); + caster->Update(); + scalarImage = caster->GetOutput(); + scalarImage->DisconnectPipeline(); +} + + +// do the registrations and calculate registration errors +// negative peakMethodToUse means to try them all +// streamSubdivisions of 1 disables streaming (higher memory useage, less cluttered debug output) +template +int +montageTest(const itk::TileConfiguration & stageTiles, + const itk::TileConfiguration & actualTiles, + const std::string & inputPath, + const std::string & outFilename, + bool varyPaddingMethods, + int peakMethodToUse, + bool loadIntoMemory, + unsigned streamSubdivisions, + bool writeTransformFiles, + bool allowDrift, + unsigned positionTolerance, + bool writeImage) +{ + int result = EXIT_SUCCESS; + using ScalarPixelType = typename itk::NumericTraits::ValueType; + using TileConfig = itk::TileConfiguration; + using PointType = itk::Point; + using VectorType = itk::Vector; + using TransformType = itk::TranslationTransform; + using ScalarImageType = itk::Image; + using OriginalImageType = itk::Image; // possibly RGB instead of scalar + using PCMType = itk::PhaseCorrelationImageRegistrationMethod; + using PadMethodUnderlying = typename std::underlying_type::type; + typename ScalarImageType::SpacingType sp; + itk::ObjectFactoryBase::RegisterFactory(itk::TxtTransformIOFactory::New()); + const size_t linearSize = stageTiles.LinearSize(); + typename TileConfig::TileIndexType origin1; + for (unsigned d = 0; d < Dimension; d++) + { + origin1[d] = stageTiles.AxisSizes[d] > 1 ? 1 : 0; // support montages of size 1 along a dimension + } + size_t origin1linear = stageTiles.nDIndexToLinearIndex(origin1); + PointType originAdjustment = PointType(stageTiles.Tiles[origin1linear].Position - stageTiles.Tiles[0].Position); + + using PeakInterpolationType = itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod; + using PeakMethodUnderlying = typename std::underlying_type::type; + using MontageType = itk::TileMontage; + using ResamplerType = itk::TileMergeImageFilter; + + std::vector oImages(linearSize); + std::vector sImages(linearSize); + typename TileConfig::TileIndexType ind; + if (loadIntoMemory) + { + for (size_t t = 0; t < linearSize; t++) + { + std::string filename = inputPath + stageTiles.Tiles[t].FileName; + typename OriginalImageType::Pointer image = ReadImage(filename.c_str()); + PointType origin = stageTiles.Tiles[t].Position; + sp = image->GetSpacing(); + for (unsigned d = 0; d < Dimension; d++) + { + origin[d] *= sp[d]; + } + image->SetOrigin(origin); + oImages[t] = image; + assignRGBtoScalar(image, sImages[t]); + + // show image loading progress + ind = stageTiles.LinearIndexToNDIndex(t); + char digit = '0'; + for (unsigned d = 0; d < Dimension; d++) + { + if (ind[d] < stageTiles.AxisSizes[d] - 1) + { + break; + } + ++digit; + } + std::cout << digit << std::flush; + } + } + else + { + // load the first tile and take spacing from it + std::string filename = inputPath + stageTiles.Tiles[0].FileName; + using ReaderType = itk::ImageFileReader; + typename ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(filename); + reader->UpdateOutputInformation(); + sp = reader->GetOutput()->GetSpacing(); + for (unsigned d = 0; d < Dimension; d++) + { + originAdjustment[d] *= sp[d]; + } + } + std::cout << std::endl; + + for (auto padMethod = static_cast(PCMType::PaddingMethodEnum::Zero); + padMethod <= static_cast(PCMType::PaddingMethodEnum::Last); + padMethod++) + { + if (!varyPaddingMethods) // go straight to the last, best method + { + padMethod = static_cast(PCMType::PaddingMethodEnum::Last); + } + auto paddingMethod = static_cast(padMethod); + std::ofstream registrationErrors(outFilename + std::to_string(padMethod) + ".tsv"); + std::cout << paddingMethod << std::endl; + registrationErrors << "PeakInterpolationMethod"; + for (unsigned d = 0; d < Dimension; d++) + { + registrationErrors << '\t' << char('x' + d) << "Tile"; + } + for (unsigned d = 0; d < Dimension; d++) + { + registrationErrors << '\t' << char('x' + d) << "Error"; + } + registrationErrors << std::endl; + + + typename MontageType::Pointer montage = MontageType::New(); + montage->SetPaddingMethod(paddingMethod); + montage->SetPositionTolerance(positionTolerance); + montage->SetMontageSize(stageTiles.AxisSizes); + if (!loadIntoMemory) + { + montage->SetOriginAdjustment(originAdjustment); + montage->SetForcedSpacing(sp); + // Force full coarse-grained parallelism. It helps with decoding JPEG images, but leads to high memory use. + // montage->SetNumberOfWorkUnits(itk::MultiThreaderBase::GetGlobalDefaultNumberOfThreads()); + } + + for (size_t t = 0; t < linearSize; t++) + { + std::string filename = inputPath + stageTiles.Tiles[t].FileName; + if (loadIntoMemory) + { + montage->SetInputTile(t, sImages[t]); + } + else + { + montage->SetInputTile(t, filename); + } + } + + // std::initializer_list interpolationMethods = + // itk::PhaseCorrelationOptimizerEnums::AllPeakInterpolationMethods; + std::initializer_list interpolationMethods = { + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::None, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Parabolic, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Cosine, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::WeightedMeanPhase, + }; + if (peakMethodToUse >= 0) + { + auto peakMethodNumber = static_cast(peakMethodToUse); + std::initializer_list interpMethods = { + static_cast(peakMethodNumber) + }; + interpolationMethods = interpMethods; + } + for (auto peakMethod : interpolationMethods) + { + auto peakMethodNumber = static_cast(peakMethod); + montage->SetPeakInterpolationMethod(peakMethod); + std::cout << peakMethod << std::endl; + itk::SimpleFilterWatcher fw(montage, "montage"); + // montage->SetDebug( true ); // enable more debugging output from global tile optimization + montage->Update(); + + std::cout << std::fixed; + + std::vector regPos(linearSize); // translations measured by registration + // translations using average translation to neighbors and neighbors' ground truth + std::vector avgPos(linearSize); + for (size_t t = 0; t < linearSize; t++) + { + ind = stageTiles.LinearIndexToNDIndex(t); + const TransformType * regTr = montage->GetOutputTransform(ind); + if (writeTransformFiles) + { + std::ostringstream ostrm; + ostrm << outFilename << static_cast(padMethod) << "_" << static_cast(peakMethodNumber) << "_Tr_" + << t << ".tfm"; + WriteTransform(regTr, ostrm.str()); + } + regPos[t] = regTr->GetOffset(); + for (unsigned d = 0; d < Dimension; d++) + { + regPos[t][d] /= sp[d]; // convert into index units + } + avgPos[t].Fill(0.0); // initialize to zeroes + } + + // make averages + for (size_t t = 0; t < linearSize; t++) + { + ind = stageTiles.LinearIndexToNDIndex(t); + VectorType avg; + avg.Fill(0); + unsigned count = 0; + for (unsigned d = 0; d < Dimension; d++) + { + if (ind[d] > 0) + { + ++count; + typename TileConfig::TileIndexType neighborInd = ind; + --neighborInd[d]; + size_t nInd = stageTiles.nDIndexToLinearIndex(neighborInd); + avg += regPos[t] - regPos[nInd] - (actualTiles.Tiles[nInd].Position - stageTiles.Tiles[nInd].Position); + } + + if (ind[d] < stageTiles.AxisSizes[d] - 1) + { + ++count; + typename TileConfig::TileIndexType neighborInd = ind; + ++neighborInd[d]; + size_t nInd = stageTiles.nDIndexToLinearIndex(neighborInd); + avg += regPos[t] - regPos[nInd] - (actualTiles.Tiles[nInd].Position - stageTiles.Tiles[nInd].Position); + } + } + + for (unsigned d = 0; d < Dimension; d++) // iterate over dimension because Vector and Point don't mix well + { + avgPos[t][d] = avg[d] / count; + } + } + + double totalError = 0.0; + for (size_t t = 0; t < linearSize; t++) + { + ind = stageTiles.LinearIndexToNDIndex(t); + std::cout << ind << ": " << regPos[t]; + registrationErrors << peakMethod; + for (unsigned d = 0; d < Dimension; d++) + { + registrationErrors << '\t' << ind[d]; + } + + // calculate error + const VectorType & tr = regPos[t]; // translation measured by registration + VectorType ta = stageTiles.Tiles[t].Position - actualTiles.Tiles[t].Position; // translation (actual) + // account for tile zero maybe not being at coordinates 0 + ta += actualTiles.Tiles[0].Position - stageTiles.Tiles[0].Position; + double singleError = 0.0; + double alternativeError = 0.0; // to account for accumulation of individual errors + for (unsigned d = 0; d < Dimension; d++) + { + registrationErrors << '\t' << (tr[d] - ta[d]); + std::cout << " " << std::setw(8) << std::setprecision(3) << (tr[d] - ta[d]); + singleError += itk::Math::abs(tr[d] - ta[d]); + alternativeError += itk::Math::abs(avgPos[t][d] - ta[d]); + } + + if (alternativeError >= 5.0 && alternativeError < singleError) + { + result = EXIT_FAILURE; + registrationErrors << "\tseverly wrong\t" << alternativeError; + std::cout << " severly wrong: " << alternativeError; + } + if (allowDrift) + { + totalError += std::min(singleError, alternativeError); + } + else + { + totalError += singleError; + } + registrationErrors << std::endl; + std::cout << std::endl; + } + // allow error of whole pixel for each tile, ignoring tile 0 + // also allow accumulation of one pixel for each registration - this effectively double the tolerance + double avgError = 0.5 * totalError / (linearSize - 1); + avgError /= Dimension; // report per-dimension error + registrationErrors << "Average translation error for " << paddingMethod << " and " << peakMethod << ": " + << avgError << std::endl; + std::cout << "\nAverage translation error for " << std::endl; + std::cout << "\t" << paddingMethod << std::endl; + std::cout << "\t\t and" << std::endl; + std::cout << "\t" << peakMethod << std::endl; + std::cout << "\t\t " << avgError << "\n" << std::endl; + if (avgError >= 1.2) + { + result = EXIT_FAILURE; + } + + if (writeImage) // write generated mosaic + { + typename ResamplerType::Pointer resampleF = ResamplerType::New(); + itk::SimpleFilterWatcher fw2(resampleF, "resampler"); + resampleF->SetMontageSize(stageTiles.AxisSizes); + if (!loadIntoMemory) + { + resampleF->SetOriginAdjustment(originAdjustment); + resampleF->SetForcedSpacing(sp); + } + + for (size_t t = 0; t < linearSize; t++) + { + std::string filename = inputPath + stageTiles.Tiles[t].FileName; + if (loadIntoMemory) + { + resampleF->SetInputTile(t, oImages[t]); + } + else + { + resampleF->SetInputTile(t, filename); + } + ind = stageTiles.LinearIndexToNDIndex(t); + + resampleF->SetTileTransform(ind, montage->GetOutputTransform(ind)); + } + + // resampleF->Update(); // updating here prevents streaming + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer w = WriterType::New(); + w->SetInput(resampleF->GetOutput()); + // resampleF->DebugOn(); //generate an image of contributing regions + // MetaImage format supports streaming + std::ostringstream ostrm; + ostrm << outFilename << static_cast(padMethod) << "_" << static_cast(peakMethodNumber) << ".mha"; + w->SetFileName(ostrm.str()); + // w->UseCompressionOn(); + w->SetNumberOfStreamDivisions(streamSubdivisions); + w->Update(); + } + if (peakMethodToUse >= 0) // peak method was specified + { + break; // do not try them all + } + } + + std::cout << std::endl; + } + return result; +} + +#endif // itkMontageTestHelper_hxx diff --git a/Modules/Registration/Montage/test/itkMontageTruthCreator.cxx b/Modules/Registration/Montage/test/itkMontageTruthCreator.cxx new file mode 100644 index 000000000000..c22a25dde5c1 --- /dev/null +++ b/Modules/Registration/Montage/test/itkMontageTruthCreator.cxx @@ -0,0 +1,237 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#include "itkWindowedSincInterpolateImageFunction.h" +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkMersenneTwisterRandomVariateGenerator.h" +#include "itkResampleImageFilter.h" +#include "itkRGBPixel.h" +#include "itkTileConfiguration.h" + + +template +int +CreateGroundTruth(char * inFilename, + const std::vector & montageSize, + const std::vector & overlap, + const std::string & outDir) +{ + using ImageType = itk::Image; + using ReaderType = itk::ImageFileReader; + typename ReaderType::Pointer reader = ReaderType::New(); + reader->SetFileName(inFilename); + reader->Update(); + typename ImageType::Pointer inImage = reader->GetOutput(); + typename ImageType::SizeType size = inImage->GetLargestPossibleRegion().GetSize(); + typename ImageType::SizeType tileSize; + + // calculate tile sizes in index space + std::vector tileSizes(Dimension); + constexpr double slopeFactor = 0.40; // varMax as fraction of overlap (MUST be < 0.50) + std::vector varMax(Dimension); + itk::SizeValueType totalTiles = 1; + for (unsigned d = 0; d < Dimension; d++) + { + tileSizes[d] = size[d] / (montageSize[d] + overlap[d] - montageSize[d] * overlap[d]); + tileSize[d] = std::round(tileSizes[d]); + varMax[d] = slopeFactor * tileSizes[d] * overlap[d]; + totalTiles *= montageSize[d]; + } + + using TileConfig = itk::TileConfiguration; + TileConfig regular, randomized; + for (unsigned d = 0; d < Dimension; d++) + { + regular.AxisSizes[d] = montageSize[d]; + randomized.AxisSizes[d] = montageSize[d]; + } + regular.Tiles.resize(regular.LinearSize()); + randomized.Tiles.resize(randomized.LinearSize()); + + + using MersenneTwister = itk::Statistics::MersenneTwisterRandomVariateGenerator; + typename MersenneTwister::Pointer randomizer = MersenneTwister::New(); + randomizer->SetSeed(1983); // make the pseudorandom seqence fully reproducible + + // calculate tile positions + for (itk::SizeValueType linearIndex = 0; linearIndex < totalTiles; linearIndex++) + { + typename TileConfig::TileIndexType ind = regular.LinearIndexToNDIndex(linearIndex); + regular.Tiles[linearIndex].FileName = "tile_" + std::to_string(linearIndex) + ".nrrd"; + randomized.Tiles[linearIndex].FileName = regular.Tiles[linearIndex].FileName; + + for (unsigned d = 0; d < Dimension; d++) + { + double regularPosition = ind[d] * (1 - overlap[d]) * tileSizes[d]; + regular.Tiles[linearIndex].Position[d] = regularPosition; + randomized.Tiles[linearIndex].Position[d] = regularPosition; + if (ind[d] > 0 && ind[d] < montageSize[d] - 1) // not at the outer perimeter of the montage + { + randomized.Tiles[linearIndex].Position[d] += randomizer->GetUniformVariate(-varMax[d], varMax[d]); + } + } + } + + regular.Write(outDir + "TileConfiguration.txt"); + randomized.Write(outDir + "TileConfiguration.GroundTruth.txt"); + + // now resample the tiles + using ResampleFilterType = itk::ResampleImageFilter; + typename ResampleFilterType::Pointer resampleFilter = ResampleFilterType::New(); + resampleFilter->SetOutputDirection(inImage->GetDirection()); + resampleFilter->SetOutputSpacing(inImage->GetSpacing()); + resampleFilter->SetInput(inImage); + resampleFilter->SetSize(tileSize); + + using SincType = itk::WindowedSincInterpolateImageFunction; + typename SincType::Pointer sinc = SincType::New(); + resampleFilter->SetInterpolator(sinc); // replace default linear interpolator + using WriterType = itk::ImageFileWriter; + typename WriterType::Pointer writer = WriterType::New(); + writer->SetInput(resampleFilter->GetOutput()); + + for (itk::SizeValueType linearIndex = 0; linearIndex < totalTiles; linearIndex++) + { + itk::ContinuousIndex cInd; + for (unsigned d = 0; d < Dimension; d++) + { + cInd[d] = randomized.Tiles[linearIndex].Position[d]; + } + typename ImageType::PointType p; + inImage->TransformContinuousIndexToPhysicalPoint(cInd, p); + resampleFilter->SetOutputOrigin(p); + std::cout << "Resampling " << randomized.Tiles[linearIndex].FileName << std::flush; + resampleFilter->Update(); + + std::cout << " Writing " << std::flush; + writer->SetFileName(outDir + randomized.Tiles[linearIndex].FileName); + writer->Update(); + std::cout << " Done" << std::endl; + } + + return EXIT_SUCCESS; +} + +template +int +CreateGroundTruth(int argc, char * argv[], unsigned dimension) +{ + std::string outputPath = argv[2]; + if (outputPath.back() != '/' && outputPath.back() != '\\') + { + outputPath += '/'; + } + + std::vector montageSize(dimension, 10); + if (argc >= 3 + int(dimension)) + { + for (unsigned i = 0; i < dimension; i++) + { + montageSize[i] = std::stoul(argv[3 + i]); + } + } + + std::vector overlap(dimension, 0.1); + if (argc >= 3 + 2 * int(dimension)) + { + for (unsigned i = 0; i < dimension; i++) + { + overlap[i] = std::stod(argv[3 + dimension + i]) / 100.0; + } + } + + if (dimension == 2) + { + return CreateGroundTruth(argv[1], montageSize, overlap, outputPath); + } + else if (dimension == 3) + { + return CreateGroundTruth(argv[1], montageSize, overlap, outputPath); + } + else + { + std::cerr << "Only dimensions 2 and 3 are supported!" << std::endl; + return EXIT_FAILURE; + } +} + +template +int +CreateGroundTruth(int argc, char * argv[], unsigned dimension, itk::IOPixelEnum pixelType) +{ + if (pixelType == itk::IOPixelEnum::RGB) // possibly add RGBA + { + return CreateGroundTruth>(argc, argv, dimension); + } + else + { + return CreateGroundTruth(argc, argv, dimension); + } +} + +int +itkMontageTruthCreator(int argc, char * argv[]) +{ + if (argc < 3) + { + std::cerr << "Usage: " << argv[0] << " [montageSize] [overlap%]" << std::endl; + std::cerr << "Example:" << argv[0] << " slice2D.png ./outGT/ 8 6 15.0 10.0" << std::endl; + std::cerr << "Example:" << argv[0] << " volume3D.nrrd ./outGT/ 8 6 4 15.0 10.0 5.0" << std::endl; + return EXIT_FAILURE; + } + + try + { + itk::ImageIOBase::Pointer imageIO = itk::ImageIOFactory::CreateImageIO(argv[1], itk::IOFileModeEnum::ReadMode); + imageIO->SetFileName(argv[1]); + imageIO->ReadImageInformation(); + unsigned dim = imageIO->GetNumberOfDimensions(); + const itk::IOComponentEnum cType = imageIO->GetComponentType(); + + if (cType == itk::IOComponentEnum::UCHAR) + { + return CreateGroundTruth(argc, argv, dim, imageIO->GetPixelType()); + } + else if (cType == itk::IOComponentEnum::USHORT) + { + return CreateGroundTruth(argc, argv, dim, imageIO->GetPixelType()); + } + else if (cType == itk::IOComponentEnum::SHORT) + { + return CreateGroundTruth(argc, argv, dim, imageIO->GetPixelType()); + } + else + { + std::cerr << "Unsupported component type: " << itk::ImageIOBase::GetComponentTypeAsString(cType) << std::endl; + } + } + catch (itk::ExceptionObject & exc) + { + std::cerr << exc; + } + catch (std::runtime_error & exc) + { + std::cerr << exc.what(); + } + catch (...) + { + std::cerr << "Unknown error has occurred" << std::endl; + } + return EXIT_FAILURE; +} diff --git a/Modules/Registration/Montage/test/itkPairwiseTestHelper.hxx b/Modules/Registration/Montage/test/itkPairwiseTestHelper.hxx new file mode 100644 index 000000000000..ae291139e79c --- /dev/null +++ b/Modules/Registration/Montage/test/itkPairwiseTestHelper.hxx @@ -0,0 +1,265 @@ +/*========================================================================= + * + * Copyright NumFOCUS + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0.txt + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + *=========================================================================*/ + +#ifndef itkMockMontageHelper_hxx +#define itkMockMontageHelper_hxx + +#include "itkImageFileReader.h" +#include "itkImageFileWriter.h" +#include "itkPhaseCorrelationOptimizer.h" +#include "itkTileConfiguration.h" +#include "itkPhaseCorrelationImageRegistrationMethod.h" + +#include +#include +#include +#include + +// do the registration and calculate error for two images +template +double +calculateError(const itk::TileConfiguration & stageTiles, + const itk::TileConfiguration & actualTiles, + const std::string & inputPath, + uint8_t paddingMethod, + unsigned positionTolerance, + std::map> & regBias, + std::ostream & out, + size_t fInd, + size_t mInd) +{ + double translationError = 0.0; + std::cout << stageTiles.Tiles[fInd].FileName << " <- " << stageTiles.Tiles[mInd].FileName << std::endl; + + using ImageType = itk::Image; + using ReaderType = itk::ImageFileReader; + typename ReaderType::Pointer reader = ReaderType::New(); + + reader->SetFileName(inputPath + stageTiles.Tiles[fInd].FileName); + reader->Update(); + typename ImageType::Pointer fixedImage = reader->GetOutput(); + fixedImage->DisconnectPipeline(); + + reader->SetFileName(inputPath + stageTiles.Tiles[mInd].FileName); + reader->Update(); + typename ImageType::Pointer movingImage = reader->GetOutput(); + movingImage->DisconnectPipeline(); + + // adjust origins (assume 0 origins in files) + typename ImageType::SpacingType sp = fixedImage->GetSpacing(); + typename ImageType::PointType origin = stageTiles.Tiles[fInd].Position; + for (unsigned d = 0; d < Dimension; d++) + { + origin[d] *= sp[d]; + } + fixedImage->SetOrigin(origin); + sp = movingImage->GetSpacing(); + origin = stageTiles.Tiles[mInd].Position; + for (unsigned d = 0; d < Dimension; d++) + { + origin[d] *= sp[d]; + } + movingImage->SetOrigin(origin); + + // execute registration + using PhaseCorrelationMethodType = itk::PhaseCorrelationImageRegistrationMethod; + typename PhaseCorrelationMethodType::Pointer phaseCorrelationMethod = PhaseCorrelationMethodType::New(); + phaseCorrelationMethod->SetFixedImage(fixedImage); + phaseCorrelationMethod->SetMovingImage(movingImage); + typename PhaseCorrelationMethodType::SizeType pad; + pad.Fill(8 * sizeof(PixelType)); + phaseCorrelationMethod->SetObligatoryPadding(pad); + // phaseCorrelationMethod->DebugOn(); + + using PMType = typename PhaseCorrelationMethodType::PaddingMethodEnum; + using PadMethodUnderlying = typename std::underlying_type::type; + static_assert(std::is_same::value, + "We expect type of paddingMethod to be equal to PadMethodUnderlying type"); + // cause compile error if this ever changes + // to correct it, change type of paddingMethod parameter + auto padMethod = static_cast(paddingMethod); + phaseCorrelationMethod->SetPaddingMethod(padMethod); + + using OperatorType = itk::PhaseCorrelationOperator; + typename OperatorType::Pointer pcmOperator = OperatorType::New(); + phaseCorrelationMethod->SetOperator(pcmOperator); + + using OptimizerType = + itk::PhaseCorrelationOptimizer; + typename OptimizerType::Pointer pcmOptimizer = OptimizerType::New(); + pcmOptimizer->SetPixelDistanceTolerance(positionTolerance); + + // std::initializer_list interpolationMethods = + // itk::PhaseCorrelationOptimizerEnums::AllPeakInterpolationMethods; + std::initializer_list interpolationMethods = { + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::None, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Parabolic, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Cosine, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::WeightedMeanPhase, + }; + + for (auto peakMethod : interpolationMethods) + { + itk::Point point; + point.Fill(0.0); + regBias[peakMethod] = point; + } + + unsigned count = 0; + for (auto peakMethod : interpolationMethods) + { + pcmOptimizer->SetPeakInterpolationMethod(peakMethod); + phaseCorrelationMethod->SetOptimizer(pcmOptimizer); + + phaseCorrelationMethod->Modified(); // optimizer is not an "input" to PCM + // so its modification does not cause a pipeline update automatically + + out << stageTiles.LinearIndexToNDIndex(fInd) << " <- " << stageTiles.LinearIndexToNDIndex(mInd); + out << '\t' << peakMethod; + std::cout << " PeakMethod " << peakMethod << ":"; + + phaseCorrelationMethod->Update(); + + using TransformType = itk::TranslationTransform; + static_assert(std::is_same::value, + "PhaseCorrelationMethod's TransformType is expected to be a TranslationTransform"); + const TransformType * regTr = phaseCorrelationMethod->GetOutput()->Get(); + + // calculate error + using VectorType = itk::Vector; + VectorType tr = regTr->GetOffset(); // translation measured by registration + for (unsigned d = 0; d < Dimension; d++) + { + tr[d] /= sp[d]; + } + VectorType ta = (actualTiles.Tiles[fInd].Position - stageTiles.Tiles[fInd].Position) - + (actualTiles.Tiles[mInd].Position - stageTiles.Tiles[mInd].Position); // translation (actual) + regBias[peakMethod] += tr - ta; + for (unsigned d = 0; d < Dimension; d++) + { + out << '\t' << (tr[d] - ta[d]); + std::cout << " " << std::setw(8) << std::setprecision(8) << (tr[d] - ta[d]); + translationError += itk::Math::abs(tr[d] - ta[d]); + } + std::cout << std::endl; + out << std::endl; + count++; + } + std::cout << std::endl; + + return translationError / count; +} // calculateError + +// do the registrations and calculate registration errors +template +int +pairwiseTests(const itk::TileConfiguration & stageTiles, + const itk::TileConfiguration & actualTiles, + const std::string & inputPath, + const std::string & outFilename, + bool varyPaddingMethods, + unsigned positionTolerance) +{ + int result = EXIT_SUCCESS; + using ImageType = itk::Image; + using PCMType = itk::PhaseCorrelationImageRegistrationMethod; + using PadMethodUnderlying = typename std::underlying_type::type; + using TileConfig = itk::TileConfiguration; + + for (auto padMethod = static_cast(PCMType::PaddingMethodEnum::Zero); + padMethod <= static_cast(PCMType::PaddingMethodEnum::Last); + padMethod++) + { + if (!varyPaddingMethods) // go straight to the last, best method + { + padMethod = static_cast(PCMType::PaddingMethodEnum::Last); + } + std::ofstream registrationErrors(outFilename + std::to_string(padMethod) + ".tsv"); + auto paddingMethod = static_cast(padMethod); + std::cout << paddingMethod << std::endl; + registrationErrors << "Fixed <- Moving\tPeakInterpolationMethod"; + for (unsigned d = 0; d < Dimension; d++) + { + registrationErrors << '\t' << char('x' + d) << "Error"; + } + registrationErrors << std::endl; + + using PhaseCorrelationOptimizerType = typename PCMType::OptimizerType; + using PeakInterpolationMethodEnum = typename PhaseCorrelationOptimizerType::PeakInterpolationMethodEnum; + + const size_t linearSize = stageTiles.LinearSize(); + typename TileConfig::TileIndexType ind; + std::map> + accumulatedBias; // one per PeakInterpolationType + size_t count = 0; + double totalError = 0.0; + for (size_t t = 0; t < linearSize; t++) + { + ind = stageTiles.LinearIndexToNDIndex(t); + for (unsigned d = 0; d < Dimension; d++) + { + if (ind[d] > 0) + { + ++count; + typename TileConfig::TileIndexType neighborInd = ind; + --neighborInd[d]; + size_t fixedLinearIndex = stageTiles.nDIndexToLinearIndex(neighborInd); + totalError += calculateError(stageTiles, + actualTiles, + inputPath, + padMethod, + positionTolerance, + accumulatedBias, + registrationErrors, + fixedLinearIndex, + t); + } + } + } + + std::cout << "\n" << std::endl; + // std::initializer_list interpolationMethods = + // itk::PhaseCorrelationOptimizerEnums::AllPeakInterpolationMethods; + std::initializer_list interpolationMethods = { + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::None, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Parabolic, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::Cosine, + itk::PhaseCorrelationOptimizerEnums::PeakInterpolationMethod::WeightedMeanPhase, + }; + for (auto m : interpolationMethods) + { + std::cout << "PeakInterpolation " << m << " has average translation bias: "; + for (unsigned d = 0; d < Dimension; d++) + { + std::cout << " " << accumulatedBias[m][d] / count; + } + std::cout << std::endl; + } + // double avgError = totalError / (xMontageSize * (yMontageSize - 1) + (xMontageSize - 1) * yMontageSize); + double avgError = totalError / count; + avgError /= Dimension; // report per-dimension error + std::cout << "Average translation error for " << paddingMethod << ": " << avgError << std::endl << std::endl; + if (avgError >= 1.0) + { + result = EXIT_FAILURE; + } + } + return result; +} + +#endif // itkMockMontageHelper_hxx diff --git a/Modules/Registration/Montage/wrapping/CMakeLists.txt b/Modules/Registration/Montage/wrapping/CMakeLists.txt new file mode 100644 index 000000000000..d183b99cb91a --- /dev/null +++ b/Modules/Registration/Montage/wrapping/CMakeLists.txt @@ -0,0 +1,11 @@ +itk_wrap_module(Montage) +set( + WRAPPER_SUBMODULE_ORDER + itkPhaseCorrelationOperator + itkPhaseCorrelationOptimizer + itkPhaseCorrelationImageRegistrationMethod + itkTileConfiguration + itkTileMontage +) +itk_auto_load_submodules() +itk_end_wrap_module() diff --git a/Modules/Registration/Montage/wrapping/itkNMinimaMaximaImageCalculator.wrap b/Modules/Registration/Montage/wrapping/itkNMinimaMaximaImageCalculator.wrap new file mode 100644 index 000000000000..a5800c5e2616 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkNMinimaMaximaImageCalculator.wrap @@ -0,0 +1,7 @@ +itk_wrap_class("itk::NMinimaMaximaImageCalculator" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${WRAP_ITK_SCALAR}) + itk_wrap_template("${ITKM_I${t}${d}}" "${ITKT_I${t}${d}}") + endforeach() + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkPhaseCorrelationImageRegistrationMethod.wrap b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationImageRegistrationMethod.wrap new file mode 100644 index 000000000000..002b742189de --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationImageRegistrationMethod.wrap @@ -0,0 +1,24 @@ +set(WRAPPER_AUTO_INCLUDE_HEADERS OFF) +itk_wrap_include("itkPhaseCorrelationImageRegistrationMethod.h") + +itk_wrap_simple_class("itk::PhaseCorrelationImageRegistrationMethodEnums") + +itk_wrap_class("itk::PhaseCorrelationImageRegistrationMethod" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${WRAP_ITK_SCALAR}) + itk_wrap_template("${ITKM_I${t}${d}}${ITKM_I${t}${d}}" "${ITKT_I${t}${d}}, ${ITKT_I${t}${d}}") + endforeach() + endforeach() +itk_end_wrap_class() + +itk_wrap_class("itk::DataObjectDecorator" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("TTD${d}" "itk::TranslationTransform< double , ${d} >") + endforeach() +itk_end_wrap_class() + +itk_wrap_class("itk::SimpleDataObjectDecorator" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("PD${d}" "itk::Point< double , ${d} >") + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOperator.wrap b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOperator.wrap new file mode 100644 index 000000000000..b4ad450bf3e8 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOperator.wrap @@ -0,0 +1,31 @@ +if(NOT ITK_WRAP_complex_double) + itk_wrap_class("itk::Image" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("CD${d}" "std::complex< double >, ${d}") + endforeach() + itk_end_wrap_class() + + itk_wrap_include("itkImageSource.h") + itk_wrap_class("itk::ImageSource" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + set(ITKN_ICD${d} itkImageCD${d}) + itk_wrap_template("ICD${d}" "itk::Image< std::complex< double >, ${d} >") + endforeach() + itk_end_wrap_class() + + itk_wrap_include("itkImageToImageFilter.h") + itk_wrap_class("itk::ImageToImageFilter" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("ICD${d}ICD${d}" "itk::Image< std::complex< double >, ${d} >, itk::Image< std::complex< double >, ${d} >") + endforeach() + itk_end_wrap_class() +endif() + +itk_wrap_class("itk::PhaseCorrelationOperator" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + UNIQUE(types "${WRAP_ITK_REAL};D") + foreach(t ${types}) + itk_wrap_template("${ITKM_${t}}${d}" "${ITKT_${t}}, ${d}") + endforeach() + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOptimizer.wrap b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOptimizer.wrap new file mode 100644 index 000000000000..aad5149903b4 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkPhaseCorrelationOptimizer.wrap @@ -0,0 +1,13 @@ +set(WRAPPER_AUTO_INCLUDE_HEADERS OFF) +itk_wrap_include("itkPhaseCorrelationOptimizer.h") + +itk_wrap_simple_class("itk::PhaseCorrelationOptimizerEnums") + +itk_wrap_class("itk::PhaseCorrelationOptimizer" POINTER) + UNIQUE(types "${WRAP_ITK_REAL};D") + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${types}) + itk_wrap_template("${ITKM_${t}}${d}" "${ITKT_${t}}, ${d}") + endforeach() + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkTileConfiguration.wrap b/Modules/Registration/Montage/wrapping/itkTileConfiguration.wrap new file mode 100644 index 000000000000..41cf0bcbb2d5 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkTileConfiguration.wrap @@ -0,0 +1,14 @@ +set(WRAPPER_AUTO_INCLUDE_HEADERS OFF) +itk_wrap_include("itkTileConfiguration.h") + +itk_wrap_class("itk::Tile") + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("${d}" "${d}") + endforeach() +itk_end_wrap_class() + +itk_wrap_class("itk::TileConfiguration") + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + itk_wrap_template("${d}" "${d}") + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkTileMergeImageFilter.wrap b/Modules/Registration/Montage/wrapping/itkTileMergeImageFilter.wrap new file mode 100644 index 000000000000..bdf65c08ebc6 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkTileMergeImageFilter.wrap @@ -0,0 +1,22 @@ +itk_wrap_include("itkLinearInterpolateImageFunction.h") +itk_wrap_include("itkNearestNeighborInterpolateImageFunction.h") +itk_wrap_class("itk::TileMergeImageFilter" POINTER) + foreach(iif LinearInterpolateImageFunction NearestNeighborInterpolateImageFunction) + if (${iif} STREQUAL "LinearInterpolateImageFunction") + set(abbr "L") # abbreviation to use in Python wrapping type name + else() + set(abbr "NN") + endif() + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${WRAP_ITK_SCALAR}) + itk_wrap_template("${ITKM_I${t}${d}}${abbr}" "${ITKT_I${t}${d}}, double, itk::${iif}<${ITKT_I${t}${d}}, double>") + endforeach() + foreach(t ${WRAP_ITK_RGB}) + itk_wrap_template("${ITKM_I${t}${d}}${abbr}" "${ITKT_I${t}${d}}, itk::RGBPixel, itk::${iif}<${ITKT_I${t}${d}}, double>") + endforeach() + foreach(t ${WRAP_ITK_RGBA}) + itk_wrap_template("${ITKM_I${t}${d}}${abbr}" "${ITKT_I${t}${d}}, itk::RGBAPixel, itk::${iif}<${ITKT_I${t}${d}}, double>") + endforeach() + endforeach() + endforeach() +itk_end_wrap_class() diff --git a/Modules/Registration/Montage/wrapping/itkTileMontage.wrap b/Modules/Registration/Montage/wrapping/itkTileMontage.wrap new file mode 100644 index 000000000000..e0c8f32a7db0 --- /dev/null +++ b/Modules/Registration/Montage/wrapping/itkTileMontage.wrap @@ -0,0 +1,8 @@ +itk_wrap_class("itk::TileMontage" POINTER) + foreach(d ${ITK_WRAP_IMAGE_DIMS}) + foreach(t ${WRAP_ITK_SCALAR}) + itk_wrap_template("${ITKM_I${t}${d}}${ITKM_F}" "${ITKT_I${t}${d}},${ITKT_F}") + itk_wrap_template("${ITKM_I${t}${d}}${ITKM_D}" "${ITKT_I${t}${d}},${ITKT_D}") + endforeach() + endforeach() +itk_end_wrap_class() diff --git a/Modules/Remote/Montage.remote.cmake b/Modules/Remote/Montage.remote.cmake deleted file mode 100644 index a78ea35c860a..000000000000 --- a/Modules/Remote/Montage.remote.cmake +++ /dev/null @@ -1,51 +0,0 @@ -#-- # Grading Level Criteria Report -#-- EVALUATION DATE: 2020-03-24 -#-- EVALUATORS: [Dženan Zukić] -#-- -#-- ## Compliance level 5 star (AKA ITK main modules, or remote modules that could become core modules) -#-- - [ ] Widespread community dependance -#-- - [ ] Above 90% code coverage -#-- - [X] CI dashboards and testing monitored rigorously -#-- - [X] Key API features are exposed in wrapping interface -#-- - [ ] All requirements of Levels 4,3,2,1 -#-- -#-- ## Compliance Level 4 star (Very high-quality code, perhaps small community dependance) -#-- - [X] Meets all ITK code style standards -#-- - [X] No external requirements beyond those needed by ITK proper -#-- - [X] Builds and passes tests on all supported platforms within 1 month of each core tagged release -#-- - [X] Windows Shared Library Build with Visual Studio -#-- - [X] Mac with clang compiller -#-- - [X] Linux with gcc compiler -#-- - [ ] Active developer community dedicated to maintaining code-base -#-- - [ ] 75% code coverage demonstrated for testing suite -#-- - [X] Continuous integration testing performed -#-- - [X] All requirements of Levels 3,2,1 -#-- -#-- ## Compliance Level 3 star (Quality beta code) -#-- - [X] API | executable interface is considered mostly stable and feature complete -#-- - [X] 10% C0-code coverage demonstrated for testing suite -#-- - [X] Some tests exist and pass on at least some platform -#-- - [X] All requirements of Levels 2,1 -#-- -#-- ## Compliance Level 2 star (Alpha code feature API development or niche community/execution environment dependance ) -#-- - [X] Compiles for at least 1 niche set of execution envirionments, and perhaps others -#-- (may depend on specific external tools like a java environment, or specific external libraries to work ) -#-- - [X] All requirements of Levels 1 -#-- -#-- ## Compliance Level 1 star (Pre-alpha features under development and code of unknown quality) -#-- - [X] Code complies on at least 1 platform -#-- -#-- ## Compliance Level 0 star ( Code/Feature of known poor-quality or deprecated status ) -#-- - [ ] Code reviewed and explicitly identified as not recommended for use -#-- -#-- ### Please document here any justification for the criteria above -# Code style enforced by clang-format on 2020-02-19, and clang-tidy modernizations completed - -# Contact: Dženan Zukić -itk_fetch_module( - Montage - "Reconstruction of 3D volumetric dataset from a collection of 2D slices" - MODULE_COMPLIANCE_LEVEL 3 - GIT_REPOSITORY https://github.com/InsightSoftwareConsortium/ITKMontage.git - GIT_TAG b4ade049ef1784f96f8b3c67d85504522a6d73d3 - ) diff --git a/pyproject.toml b/pyproject.toml index 26dc23435199..1ab39fd4202e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ cmd = '''cmake -DCMAKE_C_COMPILER_LAUNCHER:STRING=ccache -DCMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache -DModule_AnisotropicDiffusionLBR:BOOL=ON + -DModule_Montage:BOOL=ON -DITK_COMPUTER_MEMORY_SIZE:STRING=11 -DModule_StructuralSimilarity:BOOL=ON''' description = "Configure ITK for CI (with ccache compiler launcher)"