예제 #1
0
        /// <summary>
        /// Compares the increase in values from the reference Nifti (prior) to the input Nifti (current).
        /// The inputs should be pre-registered and normalised.
        /// </summary>
        /// <param name="input">Current example</param>
        /// <param name="reference">Prior example</param>
        /// <returns>Nifti who's values are the meaningful increase between prior and current.</returns>
        public static INifti <float> CompareMSLesionIncrease(INifti <float> input, INifti <float> reference)
        {
            INifti <float> output = Compare.GatedSubract(input, reference, backgroundThreshold: 10, minRelevantStd: -1, maxRelevantStd: 5, minChange: 0.8f, maxChange: 5);

            for (int i = 0; i < output.Voxels.Length; ++i)
            {
                if (output.Voxels[i] < 0)
                {
                    output.Voxels[i] = 0;
                }
            }
            output.RecalcHeaderMinMax(); // This will update the header range.
            output.ColorMap = ColorMaps.RedScale();

            return(output);
        }
예제 #2
0
        private Histogram DoCompare(INifti <float> currentnii, INifti <float> priornii)
        {
            _log.Info("Starting normalization...");
            currentnii = Normalization.ZNormalize(currentnii, priornii);
            _log.Info($@"..done.");

            currentnii.RecalcHeaderMinMax();
            priornii.RecalcHeaderMinMax();

            var tasks     = new List <Task>();
            var histogram = new Histogram
            {
                Prior   = priornii,
                Current = currentnii
            };

            var cs = _recipe.CompareSettings;

            if (cs.CompareIncrease)
            {
                var t = Task.Run(() =>
                {
                    _log.Info("Comparing increased signal...");
                    var increase = Compare.GatedSubract(currentnii, priornii, cs.BackgroundThreshold, cs.MinRelevantStd, cs.MaxRelevantStd, cs.MinChange, cs.MaxChange);
                    for (int i = 0; i < increase.Voxels.Length; ++i)
                    {
                        increase.Voxels[i] = increase.Voxels[i] > 0 ? increase.Voxels[i] : 0;
                    }
                    increase.RecalcHeaderMinMax();
                    increase.ColorMap  = ColorMaps.RedScale();
                    histogram.Increase = increase;
                    var increaseOut    = currentnii.AddOverlay(increase);
                    var outpath        = _currentPath + ".increase.nii";
                    increaseOut.WriteNifti(outpath);
                    Metrics.ResultFiles.Add(new ResultFile()
                    {
                        FilePath = outpath, Description = "Increased Signal", Type = ResultType.CURRENT_PROCESSED
                    });
                });
                tasks.Add(t);
            }
            if (cs.CompareDecrease)
            {
                _log.Info("Comparing decreased signal...");
                // I know the code in these two branches looks similar but there's too many inputs to make a function that much simpler...
                var t = Task.Run(() =>
                {
                    var decrease = Compare.GatedSubract(currentnii, priornii, cs.BackgroundThreshold, cs.MinRelevantStd, cs.MaxRelevantStd, cs.MinChange, cs.MaxChange);
                    for (int i = 0; i < decrease.Voxels.Length; ++i)
                    {
                        decrease.Voxels[i] = decrease.Voxels[i] < 0 ? decrease.Voxels[i] : 0;
                    }
                    decrease.RecalcHeaderMinMax();
                    decrease.ColorMap = ColorMaps.ReverseGreenScale();

                    histogram.Decrease = decrease;
                    var decreaseOut    = currentnii.AddOverlay(decrease);
                    var outpath        = _currentPath + ".decrease.nii";
                    decreaseOut.WriteNifti(outpath);
                    Metrics.ResultFiles.Add(new ResultFile()
                    {
                        FilePath = outpath, Description = "Decreased Signal", Type = ResultType.CURRENT_PROCESSED
                    });
                });
                tasks.Add(t);
            }
            Task.WaitAll(tasks.ToArray());
            _log.Info("...done.");

            return(histogram);
        }