/// <summary> /// compute dct robust image hash /// </summary> /// <param name="image">An image to compute DCT hash.</param> /// <returns>hash of type ulong</returns> public static ulong ComputeDctHash(IByteImage image) { var img = image.Convolve(new FloatImage(7, 7, 1)); var resized = img.Resize(32, 32); var C = CreateDctMatrix(32); var Ctransp = C.Transpose(); var dctImage = C.Multiply(resized).Multiply(Ctransp); var sum = 0f; for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { sum += dctImage[x, y]; } } var median = sum / 64f; var r = 0ul; for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { r |= dctImage[x, y] > median ? (1ul << (x + 8 * y)) : 0; } } return(r); }
/// <summary> /// compute dct robust image hash /// </summary> /// <param name="image">An image to compute DCT hash.</param> /// <returns>hash of type ulong</returns> public static ulong ComputeDctHash(IByteImage image) { var img = image.Convolve(new FloatImage(7, 7, 1)); var resized = img.Resize(32, 32); var coeff = _DctMatrix ?? (_DctMatrix = CreateDctMatrix(32)); var dctImage = coeff.MatrixMultiply(resized).MatrixMultiply(coeff, isTransposed: true); var median = GetMedianOf64(dctImage); var r = 0ul; for (var y = 0; y < 8; y++) { for (var x = 0; x < 8; x++) { r |= dctImage[x + 1, y + 1] > median ? (1ul << (x + 8 * y)) : 0; } } return(r); }
public static FloatImage Blur(this IByteImage image, float sigma) => image.Convolve(FloatImage.CreateGaussian(3, sigma));