public void TestFusionDifferentPETOrientation()
        {
            string testName = MethodBase.GetCurrentMethod().Name;

            using (var data = new FusionTestDataContainer(TestDataFunction.Threed,
                                                          new Vector3D(1.0f, 1.0f, 1.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit,
                                                          new Vector3D(1.0f, 1.0f, 1.0f), -Vector3D.yUnit, -Vector3D.zUnit, Vector3D.xUnit))
            {
                var results = DiffFusionImages(data, testName);

                for (int n = 0; n < results.Count; n++)
                {
                    Assert.Less(results[n], 0.025, "{0}:: slice {1} exceeds difference limit.", testName, n);
                }
            }
        }
        public void ValidateImageDifferenceEngine()
        {
            string testName = MethodBase.GetCurrentMethod().Name;

            using (var data = new FusionTestDataContainer(TestDataFunction.Threed,
                                                          new Vector3D(1.0f, 1.0f, 1.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit,
                                                          new Vector3D(1.0f, 1.0f, 1.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit))
            {
                var results = DiffFusionImages(data, testName);

                for (int n = 0; n < results.Count; n++)
                {
                    Assert.AreEqual(0, results[n], 100 * double.Epsilon, "{0}:: slice {1} exceeds difference limit.", testName, n);
                }
            }
        }
        public void TestFusionAnisotropicSpecialCase4Test()
        {
            Assert.Ignore(_anisotropicPixelAspectRatioMPRSupport);

            string testName = MethodBase.GetCurrentMethod().Name;

            using (var data = new FusionTestDataContainer(TestDataFunction.Threed,
                                                          new Vector3D(0.8f, 0.9f, 1.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit,
                                                          new Vector3D(0.9f, 1.0f, 0.8f), Vector3D.yUnit, Vector3D.zUnit, Vector3D.xUnit))
            {
                var results = DiffFusionImages(data, testName);

                for (int n = 0; n < results.Count; n++)
                {
                    Assert.Less(results[n], 0.025, "{0}:: slice {1} exceeds difference limit.", testName, n);
                }
            }
        }
        private static IList <double> DiffFusionImages(FusionTestDataContainer data, string testName)
        {
            var outputPath = new DirectoryInfo(Path.Combine(typeof(FusionLayerCoregistrationTests).FullName, testName));

            if (outputPath.Exists)
            {
                outputPath.Delete(true);
            }
            outputPath.Create();

            using (var log = File.CreateText(Path.Combine(outputPath.FullName, "data.csv")))
            {
                // if the overlay image is not rendered at all, this coregistration test would pass, but then the color compositing test would fail
                using (var referenceDisplaySet = data.CreateBaseDisplaySet())
                {
                    using (var testDisplaySet = data.CreateFusionDisplaySet())
                    {
                        var list  = new List <double>();
                        int index = 0;
                        foreach (var testImage in testDisplaySet.PresentationImages)
                        {
                            var referenceImage = referenceDisplaySet.PresentationImages[index];
                            NormalizePresentationImageDisplay(testImage);
                            NormalizePresentationImageDisplay(referenceImage);

                            Bitmap diff;
                            double result = ImageDiff.Compare(ImageDiffAlgorithm.Euclidian, referenceImage, testImage, out diff);
                            diff.Save(Path.Combine(outputPath.FullName, string.Format("diff{0:000}.png", index)));
                            diff.Dispose();
                            log.WriteLine("{0}, {1:f6}", index, result);
                            list.Add(result);

                            ++index;
                        }

                        return(list);
                    }
                }
            }
        }
        private static IList <double> DiffFusionOperatorResults(IColorMap colorMap, bool thresholding, string testName)
        {
            var outputPath = new DirectoryInfo(Path.Combine(typeof(FusionColorCompositingTest).FullName, testName));

            if (outputPath.Exists)
            {
                outputPath.Delete(true);
            }
            outputPath.Create();

            // this kind of test requires that the base and overlay slices be unsigned and precisely coincident
            using (var data = new FusionTestDataContainer(
                       () => TestDataFunction.GradientX.CreateSops(false, Modality.CT, new Vector3D(1.0f, 1.0f, 15.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit),
                       () => TestDataFunction.GradientY.CreateSops(false, Modality.PT, new Vector3D(1.0f, 1.0f, 15.0f), Vector3D.xUnit, Vector3D.yUnit, Vector3D.zUnit)))
            {
                using (var log = File.CreateText(Path.Combine(outputPath.FullName, "data.csv")))
                {
                    log.WriteLine("{0}, {1}, {2}, {3}", "n", "opacity", "alpha", "diff");
                    using (var baseDisplaySet = data.CreateBaseDisplaySet())
                    {
                        using (var overlayDisplaySet = data.CreateOverlayDisplaySet())
                        {
                            using (var fusionDisplaySet = data.CreateFusionDisplaySet())
                            {
                                var list = new List <double>();

                                var imageIndex  = fusionDisplaySet.PresentationImages.Count / 2;
                                var fusionImage = fusionDisplaySet.PresentationImages[imageIndex];

                                for (int n = 0; n <= 10; n++)
                                {
                                    var opacity = n / 10f;

                                    SetFusionDisplayParameters(fusionImage, colorMap, opacity, thresholding);
                                    using (IPresentationImage referenceImage =
                                               Fuse(baseDisplaySet.PresentationImages[imageIndex], overlayDisplaySet.PresentationImages[imageIndex], colorMap, opacity, thresholding))
                                    {
                                        using (var referenceBmp = DrawToBitmap(referenceImage))
                                        {
                                            referenceBmp.Save(Path.Combine(outputPath.FullName, string.Format("reference{0}.png", n)));
                                        }

                                        using (var fusionBmp = DrawToBitmap(fusionImage))
                                        {
                                            fusionBmp.Save(Path.Combine(outputPath.FullName, string.Format("test{0}.png", n)));
                                        }

                                        // because the fusion display set is generated from real base images and *reformatted* overlay images,
                                        // there will necessarily be higher differences at the edges of the useful image area

                                        Bitmap diff;
                                        double result = ImageDiff.Compare(ImageDiffAlgorithm.Euclidian, referenceImage, fusionImage, new Rectangle(18, 18, 98, 98), out diff);
                                        diff.Save(Path.Combine(outputPath.FullName, string.Format("diff{0}.png", n)));
                                        diff.Dispose();
                                        log.WriteLine("{0}, {1:f2}, {2}, {3:f6}", n, opacity, (int)(255 * opacity), result);
                                        list.Add(result);
                                    }
                                }

                                return(list);
                            }
                        }
                    }
                }
            }
        }