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;
}

これは私が探していたタイプの何かを生成しましたが、それを既知のハッシュのデータベースと比較しようとすると、陽性と同じ数の誤検知がありました. それで、私はそれに戻って、専門家に尋ねるかもしれないと思いました.

提供された画像のある種の識別子/チェックサムを提供できる機能を知っている/持っている人はいますか?データベースとの比較によって画像をすばやく識別するために使用できますか? 要するに、画像が最もよく一致するチェックサムのカテゴリはどれですか?

私は理論、概念、論文、またはアイデアを探しているのではなく、実際に機能するソリューションを探しています。私は行き止まりを掘るのにもう 1 日を費やすつもりはありません。時間をかけてコードをまとめてくれる人に感謝します。


もう少し調査したところ、autoit の開発者が「Adler-32」アルゴリズムを使用するように pixelchecksum を設計したことがわかりました。次のステップは、ac の実装を見つけて、ピクセル データを処理できるようにすることだと思います。どんな提案も大歓迎です!

4

2 に答える 2

0

簡単に言えば、問題に対してすぐに使える解決策はないということです。さらに、Adler-32 アルゴリズムは問題を解決しません。

残念ながら、画像シグネチャ (または関連する概念) を使用して視覚的類似性によって画像を比較することは、非常に活発で開かれた研究トピックです。たとえば、テストで多くの誤検出があったとおっしゃいました。ただし、何が正しいか正しくないかは主観的なものであり、アプリケーションによって異なります。

私の意見では、問題を解決する唯一の方法は、問題に適した画像記述子を見つけて、それを使用して画像を比較することです。画像から抽出された記述子を比較することは簡単な作業ではないことに注意してください。

于 2012-07-15T20:09:27.903 に答える
0

「マイクロソフト イメージ ハッシュ」を Google で検索すると、私が知っている主題に関する 2 つの最高の論文が一番上に表示されます。どちらも実用的なソリューションを提供します。

于 2012-07-15T02:30:15.960 に答える