画像から 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 と連携します。