4

我今天大部分时间都在尝试找到某种功能来为已知图像生成密钥,以便稍后进行比较以确定图像是什么。我尝试使用 SIFT 和 SURF 描述符,它们都太慢(并且已获得商业用途专利)。我最近的尝试是使用以下方法创建 dct 哈希:

   int mm_dct_imagehash(const char* file, float sigma, uint64_t *hash){

    if (!file)  return -1;
    if (!hash) return -2;

    *hash = 0;

    IplImage *img = cvLoadImage(file, CV_LOAD_IMAGE_GRAYSCALE);
    if (!img) return -3;

    cvSmooth(img, img, CV_GAUSSIAN, 7, 7, sigma, sigma);

    IplImage *img_resized = cvCreateImage(cvSize(32,32), img->depth, img->nChannels);
    if (!img_resized) return -4;

    cvResize(img, img_resized, CV_INTER_CUBIC);

    IplImage *img_prime = cvCreateImage(cvSize(32,32), IPL_DEPTH_32F, img->nChannels);
    if (!img_prime) return -5;


    cvConvertScale(img_resized, img_prime,1, 0);

    IplImage *dct_img = cvCreateImage(cvSize(32,32), IPL_DEPTH_32F, img->nChannels);
    if (!dct_img) return -6;

    cvDCT(img_prime, dct_img, CV_DXT_FORWARD);

    cvSetImageROI(dct_img, cvRect(1,1,8,8));

    double minval, maxval;
    cvMinMaxLoc(dct_img, &minval, &maxval, NULL, NULL, NULL);

    double medval = (maxval + minval)/2;

    int i,j;
    for (i=1;i<=8;i++){
        const float *row = (const float*)(dct_img->imageData + i*dct_img->widthStep);
        for (j=1;j<=8;j++){
            if (row[j] > medval){
                (*hash) |= 1;
            }
            (*hash) <<= 1;
        }
    }

    cvReleaseImage(&img);
    cvReleaseImage(&img_resized);
    cvReleaseImage(&img_prime);
    cvReleaseImage(&dct_img);

    return 0;
}

这确实产生了我正在寻找的那种类型的东西,但是当我尝试将它与已知哈希的数据库进行比较时,我的误报与我的正数一样多。所以,我又回来了,我想我可能会问专家。

你们中的任何人都知道/有一个功能可以为我提供某种标识符/校验和,用于提供的图像,在相似的图像中保持相似,因此它可以用于通过与数据库的比较来快速识别图像?简而言之,图像最匹配的校验和类别是什么?

我不是在寻找理论、概念、论文或想法,而是在寻找实际可行的解决方案。我不会再花一天时间在死胡同里挖掘,感谢任何花时间整理一些代码的人。


通过更多研究,我知道 autoit 开发人员设计了 pixelchecksum 以使用“Adler-32”算法。我想下一步是找到 ac 实现并让它处理像素数据。欢迎任何建议!

4

2 回答 2

0

谷歌搜索“微软图像哈希”在我所知道的关于该主题的两篇最佳论文中排名靠前。两者都提供了实用的解决方案。

于 2012-07-15T02:30:15.960 回答
0

简短的回答是,没有针对您的问题的开箱即用的解决方案。此外,Adler-32 算法不会解决您的问题。

不幸的是,使用图像签名(或相关概念)通过视觉相似性比较图像是一个非常活跃和开放的研究课题。例如,您说您的测试中有很多误报。但是,什么是正确或不正确的结果是主观的,取决于您的应用程序。

在我看来,解决您的问题的唯一方法是为您的问题找到一个足够的图像描述符,然后使用它来比较图像。请注意,比较从图像中提取的描述符并非易事。

于 2012-07-15T20:09:27.903 回答