예제 #1
0
        public static double MeanSquaredError(Image left, Image right)
        {
            GuardImages(left, right);

            ImagePipeline
            .FromImage(left)
            .Raw()
            .ToBuffer(out var leftBuffer);

            ImagePipeline
            .FromImage(right)
            .Raw()
            .ToBuffer(out var rightBuffer);

            if (leftBuffer == null || rightBuffer == null)
            {
                throw new SharpSharpException("Failed to load buffers.");
            }

            var sumSquared = 0;

            for (var y = 0; y < left.Height; y++)
            {
                for (var x = 0; x < left.Width; x++)
                {
                    var p1    = leftBuffer[y * left.Height + x];
                    var p2    = rightBuffer[y * left.Height + x];
                    var error = p2 - p1;
                    sumSquared += error * error;
                }
            }

            return(sumSquared / (double)(left.Height * left.Width));
        }
예제 #2
0
        public static string Fingerprint(Image image)
        {
            Guard.NotNull(image, nameof(image));

            ImagePipeline
            .FromImage(image)
            .ToBuffer(out var buffer);

            return(Convert.ToString((long)DifferenceHash.HashLong(buffer), 2));
        }
예제 #3
0
        public static double PeakSignalToNoiseRatio(Image left, Image right)
        {
            GuardImages(left, right);
            ImagePipeline
            .FromImage(left)
            .Raw()
            .ToBuffer(out var leftBuffer);

            ImagePipeline
            .FromImage(right)
            .Raw()
            .ToBuffer(out var rightBuffer);

            if (leftBuffer == null || rightBuffer == null)
            {
                throw new SharpSharpException("Failed to load buffers.");
            }

            double se = 0;

            for (var y = 0; y < left.Height; y++)
            {
                for (var x = 0; x < left.Width; x++)
                {
                    for (var channel = 0; channel < left.Bands; channel++)
                    {
                        double e = leftBuffer[y * left.Height + x + channel] - rightBuffer[y * left.Height + x + channel];
                        se += e * e;
                    }
                }
            }

            var mse = se / (left.Width * left.Height * left.Bands);

            return(10 * Math.Log10(255 * 255 / mse));
        }
 public static void returns_pipeline() => ImagePipeline.FromImage(Image).ShouldNotBeNull();
예제 #5
0
        public static double StructuralSimilarity(Image left, Image right)
        {
            GuardImages(left, right);
            ImagePipeline
            .FromImage(left)
            .Raw()
            .ToBuffer(out var leftBuffer);

            ImagePipeline
            .FromImage(right)
            .Raw()
            .ToBuffer(out var rightBuffer);

            if (leftBuffer == null || rightBuffer == null)
            {
                throw new SharpSharpException("Failed to load buffers.");
            }

            var k1 = 0.01;
            var k2 = 0.03;
            var c1 = k1 * 255 * (k1 * 255);
            var c2 = k2 * 255 * (k2 * 255);
            var c3 = c2 / 2;

            double valSum1 = 0;
            double valSum2 = 0;

            for (var y = 0; y < left.Height; y++)
            {
                for (var x = 0; x < left.Width; x++)
                {
                    for (var channel = 0; channel < left.Bands; channel++)
                    {
                        valSum1 += leftBuffer[y * left.Height + x + channel];
                        valSum2 += rightBuffer[y * left.Height + x + channel];
                    }
                }
            }

            var miu1 = valSum1 / (left.Width * left.Height * left.Bands);
            var miu2 = valSum2 / (left.Width * left.Height * left.Bands);

            double varSum1 = 0;
            double varSum2 = 0;
            double covSum  = 0;

            for (var y = 0; y < left.Height; y++)
            {
                for (var x = 0; x < left.Width; x++)
                {
                    for (var channel = 0; channel < left.Bands; channel++)
                    {
                        var e1 = leftBuffer[y * left.Height + x + channel] - miu1;
                        var e2 = rightBuffer[y * left.Height + x + channel] - miu2;
                        varSum1 += e1 * e1;
                        varSum2 += e2 * e2;
                        covSum  += e1 * e2;
                    }
                }
            }

            var sigma1  = Math.Sqrt(varSum1 / (left.Width * left.Height * left.Bands - 1));
            var sigma2  = Math.Sqrt(varSum2 / (left.Width * left.Height * left.Bands - 1));
            var sigma12 = covSum / (left.Width * left.Height * left.Bands - 1);

            var l = (2 * miu1 * miu2 + c1) / (miu1 * miu1 + miu2 * miu2 + c1);
            var c = (2 * sigma1 * sigma2 + c2) / (sigma1 * sigma1 + sigma2 * sigma2 + c2);
            var s = (sigma12 + c3) / (sigma1 * sigma2 + c3);

            return(l * c * s);
        }