/// <summary>
        /// Write transformed image and deformation field to disk
        /// </summary>
        /// <param name="filename"></param>
        /// <param name="transformparams"></param>
        private void WriteTransform(string filename, List <sitk.VectorOfParameterMap> transformparams)
        {
            string resultFilename = ReadWriteUtils.GetOutputDirectory(_parameters) + "\\" + Path.GetFileNameWithoutExtension(filename) + ".png";

            // add transform parameter map to registration parameters
            if (_parameters.TransformationParameterMap.ContainsKey(resultFilename))
            {
                _parameters.TransformationParameterMap.Remove(resultFilename);
            }
            _parameters.TransformationParameterMap.Add(resultFilename, transformparams);

            // read moving image from file
            sitk.Image movingImageToTransform = ReadWriteUtils.ReadITKImageFromFile(filename, sitk.PixelIDValueEnum.sitkVectorUInt8);
            // initialize transform instance
            TransformRGB trans = new TransformRGB(movingImageToTransform, transformparams, _parameters);

            if (_parameters.IsBinaryTransform)
            {
                // for binary reg set interpolation order to zero
                trans.SetInterpolationOrder(0);
            }

            trans.Execute();
            trans.WriteTransformedImage(resultFilename);

            // write deformation field
            sitk.Image deformationField         = trans.GetDeformationField();
            string     filenameDeformationField = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + "\\deformationField.mhd";

            ReadWriteUtils.WriteSitkImage(deformationField, filenameDeformationField);
            trans.Dispose();
            movingImageToTransform.Dispose();
        }
        /// <summary>
        /// Get the coefficient map of inner structures of tissue for the transform rigidity penalty term.
        /// </summary>
        /// <param name="filename">image filename</param>
        /// <returns>return coefficient map filename</returns>
        private string GetInnerStructureSegmentationsAsCoefficientMap(string filename)
        {
            InnerTissueSegmentation innerSegImage = GetInnerStructureSegmentation(filename);

            string filenameCoefficientMap = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + Constants.cCoefficientFilename;

            ReadWriteUtils.WriteUMatToFile(filenameCoefficientMap, innerSegImage.GetOutput().FirstOrDefault());
            innerSegImage.Dispose();

            // rescale image
            sitk.Image           img        = ReadWriteUtils.ReadITKImageFromFile(filenameCoefficientMap);
            sitk.CastImageFilter castFilter = new sitk.CastImageFilter();
            castFilter.SetOutputPixelType(sitk.PixelIDValueEnum.sitkFloat32);
            img = castFilter.Execute(img);
            sitk.RescaleIntensityImageFilter filter = new sitk.RescaleIntensityImageFilter();
            filter.SetOutputMinimum(0.0);
            filter.SetOutputMaximum(1.0);
            sitk.Image coefficientMap = filter.Execute(img);

            // save as mhd
            filenameCoefficientMap = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + Constants.cCoefficientFilename;
            ReadWriteUtils.WriteSitkImage(coefficientMap, filenameCoefficientMap);
            coefficientMap.Dispose();
            return(filenameCoefficientMap);
        }
        /// <summary>
        /// Add moving / template mask if necessary and start registration.
        /// </summary>
        /// <param name="refImage">reference image</param>
        /// <param name="movImage">template image</param>
        /// <param name="fixedMask">fixd mask (can be null)</param>
        /// <param name="movingImageFilename">filename of the template image</param>
        /// <returns></returns>
        private List <sitk.VectorOfParameterMap> PerformRegistration(sitk.Image refImage, sitk.Image movImage, sitk.Image fixedMask, string movingImageFilename)
        {
            sitk.Image movingMask = null;
            if (_parameters.UseMovingMask ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.BinaryRegistrationInnerStructures ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.BinaryRegistrationWholeTissue ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.ComponentwiseRegistration)
            {
                movingMask = GetMask(movingImageFilename, false);
                ReadWriteUtils.WriteSitkImage(movingMask, _parameters.OutputDirectory + "\\moving_mask.png");
            }

            if (_parameters.Type == RegistrationType.Multiple)
            {
                return(PerformMultipleParamFilesRegistration(refImage, movImage, fixedMask, movingMask, movingImageFilename));
            }
            else if (_parameters.Type == RegistrationType.Rigid)
            {
                // do rigid registration
                return(PerformRigidRegistration(refImage, movImage, fixedMask, movingMask, movingImageFilename));
            }
            else
            {
                // do non rigid registration
                return(PerformNonRigidRegistration(refImage, movImage, fixedMask, movingMask, movingImageFilename));
            }
        }
        /// <summary>
        /// Run registration with the predecessor of the current image as fixed image.
        /// </summary>
        /// <param name="imageStack">image stack as list of filenames</param>
        private void RunRegistrationPreviousOrder(List <string> imageStack)
        {
            // TO CHECK
            for (int i = 1; i < imageStack.Count; i++)
            {
                Stopwatch stopWatch = new Stopwatch();
                string    elapsed;

                _parameters.Iteration          = i - 1;
                _parameters.FixedImageFilename = imageStack[_parameters.Iteration];
                _worker.ReportProgress(0, "Load reference image...");
                // load and resize fixed / reference image
                sitk.Image referenceImage = LoadAndResizeImage(_parameters.FixedImageFilename, _parameters.FixedImageFilename);

                // set mask if defined in parameters
                sitk.Image fixedMask = null;
                if (_parameters.UseFixedMask)
                {
                    stopWatch.Start();
                    fixedMask = GetMask(_parameters.FixedImageFilename, true);
                    ReadWriteUtils.WriteSitkImage(fixedMask, _parameters.OutputDirectory + "\\fixed_mask.png");
                    stopWatch.Stop();
                    elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                    _worker.ReportProgress(0, string.Format("Created fixed mask (Elapsed time: {0}) ..."));
                }

                _worker.ReportProgress(0, "Load template image...");
                // load and resize moving / template image
                sitk.Image templateImage = LoadAndResizeImage(imageStack[i], imageStack[i]);

                _worker.ReportProgress(0, "Start registration.");
                stopWatch.Reset();
                stopWatch.Start();

                // start actual registration
                List <sitk.VectorOfParameterMap> transformparams = PerformRegistration(referenceImage, templateImage, fixedMask, imageStack[i]);

                stopWatch.Stop();
                elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                _worker.ReportProgress((99 / imageStack.Count) / 2, string.Format("Registration done (Elapsed time: {0}). Writing transform file...", elapsed));

                stopWatch.Reset();
                stopWatch.Start();
                // transform moving image according to the transformation parameters
                WriteTransform(imageStack[i], transformparams);
                stopWatch.Stop();
                elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                _worker.ReportProgress((99 / imageStack.Count) / 2, string.Format("Transformed image was written to output directory. (Elaspsed time: {0})", elapsed));
            }
            _worker.ReportProgress(100, "Registration done.");
        }
        private void buttonDiffImage_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;

            string fixedImageFilename  = registrationParameters.FixedImageFilename;
            string movingImageFilename = comboBoxMovingImage.SelectedValue.ToString();

            // read images
            var img01      = ReadWriteUtils.ReadITKImageFromFile(fixedImageFilename);
            var img02      = ReadWriteUtils.ReadITKImageFromFile(movingImageFilename);
            var difference = VisualizationEvaluationUtils.GetTotalDifferenceImage(img01, img02);

            ReadWriteUtils.WriteSitkImage(difference, registrationParameters.OutputDirectory + "\\difference.png");
            img01.Dispose();
            img02.Dispose();
            difference.Dispose();

            Cursor.Current = Cursors.Default;
        }
        private void buttonCheckerBoard_Click(object sender, EventArgs e)
        {
            Cursor.Current = Cursors.WaitCursor;

            string fixedImageFilename  = registrationParameters.FixedImageFilename;
            string movingImageFilename = comboBoxMovingImage.SelectedValue.ToString();
            uint   size = (uint)numericUpDownCheckerSize.Value;

            // read images
            //var img01 = ReadWriteUtils.ReadITKImageFromFile(fixedImageFilename);
            //var img02 = ReadWriteUtils.ReadITKImageFromFile(movingImageFilename);
            var checkerboard = VisualizationEvaluationUtils.GetCheckerBoardV2(fixedImageFilename, movingImageFilename, size);

            ReadWriteUtils.WriteSitkImage(checkerboard, registrationParameters.OutputDirectory + "\\checkerboard.png");
            //img01.Dispose();
            //img02.Dispose();
            checkerboard.Dispose();

            Cursor.Current = Cursors.Default;
        }
        /// <summary>
        /// Load and resize image depending on the width and height of the largest image in stack.
        /// </summary>
        /// <param name="filename">filename of the image to load</param>
        /// <param name="writeFilename">output filename if image should be written back to disk</param>
        /// <returns>simpleitk image</returns>
        private sitk.Image LoadAndResizeImage(string filename, string writeFilename = null)
        {
            sitk.Image refImage = ReadWriteUtils.ReadITKImageFromFile(filename, sitk.PixelIDValueEnum.sitkVectorUInt8);

            if (refImage.GetWidth() == _parameters.LargestImageWidth && refImage.GetHeight() == _parameters.LargestImageHeight)
            {
                return(refImage);
            }
            else
            {
                sitk.Image refResized = ImageUtils.ResizeImage(refImage, _parameters.LargestImageWidth, _parameters.LargestImageHeight);

                // write image if output filename is defined
                if (writeFilename != null)
                {
                    ReadWriteUtils.WriteSitkImage(refResized, Path.Combine(_parameters.OutputDirectory, Path.GetFileName(writeFilename)));
                }

                return(refResized);
            }
        }
        /// <summary>
        /// Run registration with fixed image as first or last image in stack.
        /// </summary>
        /// <param name="imageStack">image stack as list of filenames</param>
        /// <param name="firstAsReference">flag to specify if first or last image is taken as reference image</param>
        private void RunRegistrationFirstOrLastInStackOrder(List <string> imageStack, bool firstAsReference)
        {
            Stopwatch stopWatch = new Stopwatch();
            string    elapsed;

            // set fixed image filename
            if (firstAsReference)
            {
                _parameters.FixedImageFilename = imageStack.First();
            }
            else
            {
                _parameters.FixedImageFilename = imageStack.Last();
            }

            _worker.ReportProgress(0, "Load reference image...");
            // load fixed / reference image once and resize
            sitk.Image referenceImage = LoadAndResizeImage(_parameters.FixedImageFilename);

            // set fixed mask if defined in parameters
            sitk.Image fixedMask = null;
            if (_parameters.UseFixedMask ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.BinaryRegistrationInnerStructures ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.BinaryRegistrationWholeTissue ||
                _parameters.RigidOptions == MaskedRigidRegistrationOptions.ComponentwiseRegistration)
            {
                stopWatch.Start();
                fixedMask = GetMask(_parameters.FixedImageFilename, true);
                ReadWriteUtils.WriteSitkImage(fixedMask, _parameters.OutputDirectory + "\\fixed_mask.png");
                elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                _worker.ReportProgress(0, string.Format("Created fixed mask (Elapsed time: {0}) ...", elapsed));
            }

            int i = 0;

            foreach (string filename in imageStack)
            {
                _parameters.Iteration = i++;
                if (filename == _parameters.FixedImageFilename)
                {
                    continue;
                }

                _worker.ReportProgress(0, "Load template image...");
                // load and resize moving / template image
                sitk.Image templateImage = LoadAndResizeImage(filename, filename);

                _worker.ReportProgress(0, "Start registration.");
                stopWatch.Reset();
                stopWatch.Start();

                // start actual registration
                List <sitk.VectorOfParameterMap> transformparams = PerformRegistration(referenceImage, templateImage, fixedMask, filename);

                stopWatch.Stop();
                elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                _worker.ReportProgress((99 / imageStack.Count) / 2, string.Format("Registration done (Elapsed time: {0}). Writing transform file...", elapsed));

                // transform moving image according to the transformation parameters
                stopWatch.Reset();
                stopWatch.Start();
                WriteTransform(filename, transformparams);
                stopWatch.Stop();
                elapsed = string.Format("[{0}m {1}s]", stopWatch.Elapsed.Minutes, stopWatch.Elapsed.Seconds);
                _worker.ReportProgress((99 / imageStack.Count) / 2, string.Format("Transformed image was written to output directory. (Elaspsed time: {0})", elapsed));
            }
            _worker.ReportProgress(100, "Registration done.");
        }