1

画像から 25 個のサンプル ピースを取得し、それらの平均 RGB 値を取得して、5x5 Color 配列に保存します。これらは私の「署名」です。署名の値は次のようになります。

Color signature[5][5];

-21233 -1 -323211 ... ...
-123 -12323 ...  
...

署名のインデックスから赤、青、緑の値に到達できます。これらの値を使用して 2 つの画像の署名を比較し、「差」の値を取得します。

signature[1][1].getBlue() = 123, Color[1][1].getRed() = 200 ..

for (int x = 0; x < 5; x++) {   
        for (int y = 0;y < 5; y++) {
            int r1 = signature[x][y].getRed();
            int g1 = signature[x][y].getGreen();
            int b1 = signature[x][y].getBlue();
            int r2 = signature2[x][y].getRed();
            int g2 = signature2[x][y].getGreen();
            int b2 = signature2[x][y].getBlue();
            double tempDiff =  Math.sqrt((r1 - r2) * (r1 - r2) 
                                       + (g1 - g2) * (g1 - g2) 
                                       + (b1 - b2) * (b1 - b2));
            difference += tempDiff;
        }
 }

また、エッジで見つかったバージョンの署名を示す、画像の 2 つ目の署名も取得しました。2 つの画像を比較して、通常の署名の差とエッジの署名の差を乗算し、最終的な差の値を取得します。

2 つの画像を比較する際には、すべてがうまく機能します。ただし、大量の画像を取得したため、次のように署名をデータベースに保存しました。

Table images:
-COLUMN name-       -COLUMN signature-             -COLUMN edge signature-
myimg.jpg  |-12312 -132 -2 ... (25 of them) |-123 -1 -1234 -6921 .. (25 of them)|

シグネチャ インデックスをスペースで連結し、文字列として保存するだけです。

これが私の質問です。1 つの画像の類似点を見つける必要があります。データベースからすべての画像を選択すると、処理が非常に遅くなり、メモリが不足します。データベースから数千の画像を選択し、比較して次の 1000 を取得できますが、これはさらに遅くなります。

クエリで画像署名を比較する方法が必要です。テーブルの列を変更する準備ができており、署名のすべての RGB 値を保持する 100 列の非常識なテーブルを試す準備さえできています。署名の縮小またはハッシュが必要です。提案できる方法/アプローチ、リンク、またはライブラリはありますか? どんな助けでも大歓迎です。

必要に応じて、NetBeans で Java を使用し、MySQL と連携します。

4

3 に答える 3

0

150列が必要であることを確認した後、2つのアプローチが思い浮かびました。

  1. ロジックに従って列の数を減らします。
  2. 知覚ハッシュの使用(近いハッシュ値が近い前のハッシュ値を表すハッシュ)

ただし、醜くて厄介な実装の後、コードは問題なく機能しました。私がやっていることは、SQLクエリを使用して質問の計算を実行し、データベースから最も類似した50枚の画像を取得することです。結果を取得した後、コードを少し整理しました。コードは正常に高速に動作しています。

したがって、類似点を見つける成功を減らし、より速くする必要がないため、上記のアプローチを実装する必要は実際にはありませんでした。最高の50の結果が得られるため、メモリの複雑さも問題になりません。

プロジェクトの「Java部分」(またはその他の「コード」部分)で速度やメモリの問題が発生している場合は、「データベース部分」にできるだけ多くの作業を転送して、クエリで処理を実行することを強くお勧めします。 。

于 2012-07-02T07:55:59.510 に答える
0

同一ではなく類似した画像を検索しているため、ハッシュはおそらく機能しません。「類似」関係は比較関数の定義に基づいて推移的ではないため、類似の画像を同じキーにマップしても機能しません (A は B に類似し、B は C に類似していますが、C は A に類似していない可能性があります)。 )。

私が考えることができる唯一のことは、あなたが言ったように25 * 3列に保存することです。SQL ステートメントを記述して、距離テストに合格する可能性のある画像のみを選択できます(差が既にしきい値よりも大きい場合は、フィルターで除外します)。DB 内の画像があまり似ていない場合、この方法は問題なく機能するはずです。ただし、DB 内の画像が非常によく似ている場合、この方法は不適切です。

于 2012-05-29T08:37:12.943 に答える