/// <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); }
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); }