//计算图片的指纹信息
        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);
        }
Exemple #2
0
        /// <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));
                                }
                            }
                        }
                    }
                }
            }
        }