//计算图片的指纹信息 string ImageHashValue(Mat src) { Mat image1 = new Mat(src.Height, src.Width, MatType.CV_8UC1); Mat image = new Mat(src.Height, src.Width, MatType.CV_32FC1); //1.灰度化 if (src.Channels() == 3) { Cv2.CvtColor(src, image1, ColorConversionCodes.BGR2GRAY); image1.ConvertTo(image, MatType.CV_32FC1, 1 / 225.0); } else { src.CopyTo(image1); image1.ConvertTo(image, MatType.CV_32FC1, 1 / 225.0); } //2.缩小尺寸 8 * 8 Mat temp = new Mat(8, 8, MatType.CV_32F); Mat dst = new Mat(8, 8, MatType.CV_32F); Cv2.Resize(image, temp, new Size(8, 8)); //3.DCT Cv2.Dct(temp, dst); //3.求取DCT系数均值(左上角8*8区块的DCT系数) double[] dIdex = new double[64]; double mean = 0.0; int k = 0; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { dIdex[k] = dst.At <double>(i, j); mean += dst.At <double>(i, j) / 64; ++k; } } //4.计算哈希值 string resStr = ""; for (int i = 0; i < 64; ++i) { if (dIdex[i] >= mean) { resStr += '1'; } else { resStr += '0'; } } return(resStr); }
/// <summary> /// pHash /// </summary> /// <param name="src">Изображение</param> /// <returns></returns> public long PHash(Mat src) { using (var grayImg = new Mat()) { // Убрать цвет Cv2.CvtColor(src, grayImg, ColorConversionCodes.BGR2GRAY); // Уменьшить размер using (var smallImg = ResizeGrayImg(grayImg, 32, 32, ResizeMethod)) { using (var prepImg = new Mat()) { // Преобразуем к нужному типу smallImg.ConvertTo(prepImg, MatType.CV_32FC1, 1.0 / 255.0); using (var dctImg = new Mat()) { // Запустить дискретное косинусное преобразование Cv2.Dct(prepImg, dctImg); // Сократить DCT using (var shortDct = new Mat(dctImg, new Range(0, 8), new Range(0, 8))) { // Вычислить среднее значение double avg = 0; for (var j = 0; j < 8; j++) { for (var i = 0; i < 8; i++) { if (j == 0 && j == 0) { continue; } avg += shortDct.At <float>(j, i); } } var thresh = avg / 63.0; // Ещё сократить DCT using (var bits = shortDct.Threshold(thresh, 255, ThresholdTypes.Binary)) { return(GetHash(bits, (float)255)); } } } } } } }