/// <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> /// Get filename of the inner structures mask of an image. /// </summary> /// <param name="filename">filename of the image</param> /// <returns>filename of the masked image</returns> private string GetInnerStructureSegmentationFilename(string filename) { string outputFilename = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + "\\mask_" + Path.GetFileName(filename); InnerTissueSegmentation seg = GetInnerStructureSegmentation(filename); seg.GetOutput()[1].Save(filename); seg.Dispose(); return(filename); }
/// <summary> /// Get image of the inner structures mask of an image. /// </summary> /// <param name="filename">filename of the image</param> /// <returns>masked image</returns> private sitk.Image GetInnerStructureMask(string filename) { string outputFilename = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + "\\mask_" + Path.GetFileName(filename); InnerTissueSegmentation seg = GetInnerStructureSegmentation(filename); seg.GetOutput()[1].Save(outputFilename); seg.Dispose(); sitk.Image mask = ReadWriteUtils.ReadITKImageFromFile(outputFilename); return(mask); }
private string GetWholeParticleMaskFilename(string filename) { string outputFilename = ReadWriteUtils.GetOutputDirectory(_parameters, _parameters.Iteration) + "\\mask_" + Path.GetFileName(filename); Image <Bgr, byte> image = ReadWriteUtils.ReadOpenCVImageFromFile <Bgr, byte>(filename); WholeTissueSegmentation segImage = new WholeTissueSegmentation(image, _parameters.WholeTissueSegParams); segImage.Execute(); segImage.GetOutput().Save(outputFilename); segImage.Dispose(); return(outputFilename); }
/// <summary> /// Execute transformation of rgb image. /// </summary> public void Execute() { string outputDir = ReadWriteUtils.GetOutputDirectory(registrationParameters, registrationParameters.Iteration); if (Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } // split rgb channels sitk.VectorIndexSelectionCastImageFilter rgbVector = new sitk.VectorIndexSelectionCastImageFilter(); sitk.Image redChannel = rgbVector.Execute(movingImage, 0, sitk.PixelIDValueEnum.sitkFloat32); sitk.Image greenChannel = rgbVector.Execute(movingImage, 1, sitk.PixelIDValueEnum.sitkFloat32); sitk.Image blueChannel = rgbVector.Execute(movingImage, 2, sitk.PixelIDValueEnum.sitkFloat32); foreach (var parameter in parameterMaps[0]) { parameter["DefaultPixelValue"][0] = "255.0"; parameter["ResultImagePixelType"][0] = "short"; if (parameter.ContainsKey("UseBinaryFormatForTransformationParameters")) { parameter.Remove("UseBinaryFormatForTransformationParameters"); } if (interpolationOrder != -1) { parameter["FinalBSplineInterpolationOrder"][0] = interpolationOrder.ToString(); } else { parameter["FinalBSplineInterpolationOrder"][0] = "3"; } if (parameter["Transform"][0] == "SimilarityTransform" || registrationParameters.RegistrationDefaultParams == RegistrationDefaultParameters.similarity) { sitk.VectorString vec = new sitk.VectorString(); vec.Add((registrationParameters.LargestImageWidth / 2).ToString()); // fixed image width / 2 vec.Add((registrationParameters.LargestImageHeight / 2).ToString()); // fixed image height / 2 parameter.Add("CenterOfRotationPoint", vec); } } // initialize transformix transformix.SetOutputDirectory(outputDir); transformix.SetTransformParameterMap(parameterMaps.First()[0]); // add further transform parameters if (parameterMaps[0].Count > 1) { for (int i = 1; i < parameterMaps[0].Count; i++) { var vectorParameterMap = parameterMaps[0][i]; transformix.AddTransformParameterMap(vectorParameterMap); } } transformix.ComputeDeformationFieldOn(); transformix.LogToFileOn(); if (registrationParameters.ComputeJaccobian) { transformix.ComputeSpatialJacobianOn(); transformix.ComputeDeterminantOfSpatialJacobianOn(); } transformix.PrintParameterMap(); // red transformix.SetMovingImage(redChannel); sitk.Image resultRedChannel = transformix.Execute(); resultRedChannel = TransformationUtils.InterpolateImage(resultRedChannel, sitk.InterpolatorEnum.sitkBSplineResamplerOrder3, sitk.PixelIDValueEnum.sitkUInt8); //ReadWriteUtils.WriteSitkImageWithPreCast(resultRedChannel, registrationParameters.OutputDirectory + "\\red_channel.png"); // green transformix.SetMovingImage(greenChannel); sitk.Image resultGreenChannel = transformix.Execute(); resultGreenChannel = TransformationUtils.InterpolateImage(resultGreenChannel, sitk.InterpolatorEnum.sitkBSplineResamplerOrder3, sitk.PixelIDValueEnum.sitkUInt8); //ReadWriteUtils.WriteSitkImageWithPreCast(resultGreenChannel, registrationParameters.OutputDirectory + "\\green_channel.png"); // blue transformix.SetMovingImage(blueChannel); sitk.Image resultBlueChannel = transformix.Execute(); resultBlueChannel = TransformationUtils.InterpolateImage(resultBlueChannel, sitk.InterpolatorEnum.sitkBSplineResamplerOrder3, sitk.PixelIDValueEnum.sitkUInt8); //ReadWriteUtils.WriteSitkImageWithPreCast(resultBlueChannel, registrationParameters.OutputDirectory + "\\blue_channel.png"); // compose image channels sitk.VectorOfImage vectorImages = new sitk.VectorOfImage(); vectorImages.Add(resultRedChannel); vectorImages.Add(resultGreenChannel); vectorImages.Add(resultBlueChannel); sitk.ComposeImageFilter composeImageFilter = new sitk.ComposeImageFilter(); sitk.Image composedImage = composeImageFilter.Execute(vectorImages); if (registrationParameters.Type == RegistrationType.NonRigid) { transformedImage = TransformationUtils.InterpolateImage(composedImage, sitk.InterpolatorEnum.sitkBSplineResamplerOrder5, composedImage.GetPixelID()); } else { transformedImage = composedImage; } transformedImage = composedImage; // interpolation of output image (needs to be improved -> currently theres a little loss in quality) // possible solution: interpolate grayscale images and compose afterwards /*sitk.ExpandImageFilter expandImageFilter = new sitk.ExpandImageFilter(); * expandImageFilter.SetInterpolator(sitk.InterpolatorEnum.sitkLinear); * transformedImage = expandImageFilter.Execute(composedImage);*/ //transformedImage = composedImage; }