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