private static IVoiLut GetInitialVoiLut(IGraphic graphic) { GrayscaleImageGraphic grayImageGraphic = (GrayscaleImageGraphic)graphic; IVoiLut lut = InitialVoiLutProvider.Instance.GetLut(graphic.ParentPresentationImage); if (lut == null) { lut = new MinMaxPixelCalculatedLinearLut(grayImageGraphic.PixelData, grayImageGraphic.ModalityLut); } return(lut); }
public void TestSimple() { byte[] data = new byte[25]; for (byte x = 0; x < 25; ++x) { data[x] = x; } GrayscalePixelData pixelData = new GrayscalePixelData(5, 5, 8, 8, 7, false, data); MinMaxPixelCalculatedLinearLut lut = new MinMaxPixelCalculatedLinearLut(pixelData); lut.MinInputValue = 0; lut.MaxInputValue = 255; Assert.AreEqual(lut.WindowWidth, 24); Assert.AreEqual(lut.WindowCenter, 12); }
/// <summary> /// Attempts to install an appropriate equivalent of the specified <paramref name="sourceVoiLut"/> to a fusion image. If the LUT is not linear, computes a dummy LUT. /// </summary> private static void InstallVoiLut(FusionPresentationImage fusionImage, IVoiLut sourceVoiLut, Frame sourceFrame, bool applyToOverlay) { IVoiLut newVoiLut; if (sourceVoiLut is MinMaxPixelCalculatedLinearLut) { if (applyToOverlay) { // if the overlay source image is using a min/max calculated LUT, install a custom calculated LUT that delay-computes min/max from the fusion data // we need to delay-compute this because the fusion image graphic is delay-generated, and thus not necessarily available until just before rendering! var skipModalityLut = sourceFrame.ParentImageSop.Modality == @"PT" && sourceFrame.IsSubnormalRescale; newVoiLut = new FusionOverlayMinMaxVoiLutLinear(fusionImage, !skipModalityLut); } else { // if the base source image is using a min/max calculated LUT, install a similarly min/max calculated LUT for the base of the fusion image newVoiLut = new MinMaxPixelCalculatedLinearLut(fusionImage.ImageGraphic.PixelData); } } else if (sourceVoiLut is IVoiLutLinear) { var voiLutLinear = (IVoiLutLinear)sourceVoiLut; var normalizedVoiSlope = 1.0; var normalizedVoiIntercept = 0.0; if (applyToOverlay && sourceFrame.ParentImageSop.Modality == @"PT" && sourceFrame.IsSubnormalRescale) { // for subnormal PET rescale slope cases, the original VOI windows must be transformed through the same process as what MPR did to the pixel data normalizedVoiSlope = sourceFrame.RescaleSlope / fusionImage.OverlayFrameData.OverlayRescaleSlope; normalizedVoiIntercept = (sourceFrame.RescaleIntercept - fusionImage.OverlayFrameData.OverlayRescaleIntercept) / fusionImage.OverlayFrameData.OverlayRescaleSlope; } newVoiLut = new BasicVoiLutLinear(voiLutLinear.WindowWidth * normalizedVoiSlope, voiLutLinear.WindowCenter * normalizedVoiSlope + normalizedVoiIntercept); } else { // if the source image is using some non-linear LUT, just install a default pass-through LUT newVoiLut = new IdentityVoiLinearLut(); } if (applyToOverlay) { fusionImage.OverlayVoiLutManager.InstallVoiLut(newVoiLut); } else { fusionImage.BaseVoiLutManager.InstallVoiLut(newVoiLut); } }
public void TestWithModalityLut() { byte[] data = new byte[25]; for (byte x = 0; x < 25; ++x) { data[x] = x; } ModalityLutLinear modalityLut = new ModalityLutLinear(8, true, 1.0, -10); GrayscalePixelData pixelData = new GrayscalePixelData(5, 5, 8, 8, 7, false, data); MinMaxPixelCalculatedLinearLut lut = new MinMaxPixelCalculatedLinearLut(pixelData, modalityLut); lut.MinInputValue = 0; lut.MaxInputValue = 255; Assert.AreEqual(lut.WindowWidth, 24); Assert.AreEqual(lut.WindowCenter, 2); }
/// <summary> /// Gets the initial VOI LUT for the source frames (base or overlay). This is NOT the LUT used on the fusion image! See <see cref="InstallVoiLut"/>. /// </summary> private static IVoiLut GetInitialVoiLut(Frame frame) { if (frame != null) { using (var image = PresentationImageFactory.Create(frame)) { var voiLut = InitialVoiLutProvider.Instance.GetLut(image); if (voiLut == null && image is IImageGraphicProvider) { var pixelData = ((IImageGraphicProvider)image).ImageGraphic.PixelData; if (pixelData is GrayscalePixelData) { voiLut = new MinMaxPixelCalculatedLinearLut((GrayscalePixelData)pixelData); } } return(voiLut); } } return(null); }