对比图像与图像库或密钥的图像。

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”算法。我想下一步是找到C实现并让它处理像素数据。欢迎任何建议!

你应该看看这个链接:http://stackoverflow.com/questions/9986766/which-computer-vision-library-algorithms-for-human-behaviour-analysis/9988561#9988561。不要误解我,但是你应该从一开始就知道这种应用程序**不是免费的**。有一些研究人员提出了一些概念,还有一些公司,比如谷歌,能够将理论变成商业产品。你肯定可以尝试一些东西——SIFT/SURF/AGAST/FREAK检测器是最好的,但你必须把项目时间计算在几个月或几年内,而不是几天内。 - Sam
不要被关于这个主题的大量网络参考所困惑 - 其中大多数是学生发布的OpenCV SIFT示例的小变体。从那里到商业应用还有很长的路要走。 - Sam
感谢您花时间考虑您的答案,但您正在过度复杂化问题。这不是在视频流(例如网络摄像头)中检测对象的复杂过程。我说的是小截图,比如仅包含“添加评论”按钮中文本的截图,然后生成校验和。它距离适用阶段不远了,autoit用户已经使用它一段时间了,请参见:http://www.autoitscript.com/forum/topic/48333-find-pixelchecksum/。 - Tiago
我来这里看看在OSX上是否有其他可供我实施的选择。 - Tiago
2个回答

0
一次谷歌搜索“微软图像哈希”会在前面列出我所知道的两篇最好的论文。它们都提供了实用的解决方案。

我试图尽可能清楚地表达以下概念:A)该项目在OSX上。B)我想要指纹图像,以便能够识别相似性,而不是完全独立的密钥。 - Tiago
此外,它已经不再处于研究阶段了。至少是不应该了。使用AutoIT进行Windows编程的人很可能已经使用了这个: http://www.autoitscript.com/forum/topic/48333-find-pixelchecksum/但当然,这只适用于Windows(和autoit)。 - Tiago

0

简短的回答是,对于您的问题,没有现成的解决方案。此外,Adler-32算法也无法解决您的问题。

不幸的是,使用图像签名(或相关概念)进行视觉相似性比较的研究非常活跃和开放。例如,您说在测试中有许多误报。然而,正确或错误的结果是主观的,并且将取决于您的应用程序。

在我看来,解决您的问题的唯一方法是找到一个适当的图像描述符并使用它们来比较图像。请注意,比较从图像提取的描述符并不是一项微不足道的任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接