2

画像のジオハッシュ方法を見つけようとしています。可能な画像の空間は緯度/経度よりもはるかに高い次元であるため、難しいです。(ジオハッシュは場所を文字列に変換し、文字列は場所を徐々に絞り込みます)

だから、私が必要とするのは次のようなものです:

  • 入力: ディスク上の JPG または PNG 画像のリスト
  • 出力: 各画像の文字列2 つの画像に共通する文字列プレフィックスが長いほど、2 つの画像が同じである可能性が高くなります。

完璧である必要はなく、トリミングされた画像や大幅に調整された画像などの極端なケースを処理する必要もありません。これは、異なる解像度と圧縮レベルで同じ画像を複数コピーすることを目的としています。

私は使用できません:

  • ファイルまたは画像データのハッシュ。2 つの画像間のわずかな変更でも完全に異なるハッシュが作成され、近接性が得られないためです。
  • N 対 N の比較ではないため、画像の減算。

ウェーブレット圧縮またはラプラシアン/ガウス ピラミッドを試すために他の回答を読みましたが、Java または Python で実装する方法がわかりません。しかし、私は進歩しました!

  1. データを破棄しないように、 http: //today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html を使用して 32x32 にサイズ変更します。すべてが正方形に変わります。
  2. 2x2 まで、連続して小さいサムネイルのピラミッドを作成します。
  3. 2x2 で、「次のピクセルは現在のピクセルよりも明るいですか?」という文字列をエンコードします。そうであれば 1、そうでなければ 0 です(これによりすべての色相と彩度が破棄されます。何らかの形で色相を使用したい場合があります)。
  4. 8x8 および 32x32 ピラミッドから連続する 2 進数をエンコードする
  5. 大きな 2 進数を、Base62 などのより高い基数表現に変換します。

これはうまくいきそうです!圧縮またはカラー バランスによる小さな違いは、「この領域の左側が右側より明るいか」を変更するのに十分ではありません。しかし、私は車輪を再発明していると思います.ある種のプログレッシブエンコーディングの方が良いでしょうか? SIFT やその他の機能検出はやり過ぎです。クロッピングや回転を処理できる必要はありません。

4

3 に答える 3

0

これはどう。ハッシュ文字列は、赤、緑、青を表す 3 文字のグループで構成されます。

{R0, G0, B0}, {R1, G1, B1}, {R2, G2, B2}, ...

グループごとに、画像は 2^N x 2^N の正方形にサイズ変更されます。次に、値は、ピクセルを介したいくつかのウォークでの各色の強度の差の合計 (mod、たとえば 255、またはエンコードが何であれ) です。

小さな例として、たとえばグループ 1 (2x2 画像) を計算するには、次のコードを使用することができます (私は赤いピクセルだけを気にしました)。

int rSum = 0;
int rLast = 0;
for (int i=0; i<2; i++) {
  for (int j=0; j<2; j++) {
    rSum += Math.abs(image[i][j].r - rLast);
    rLast = image[i][j].r;
  }
}
rSum %= 255;

これには、ハッシュ内の各文字とハッシュ内の連続する文字の両方に関して、類似した画像が互いに近いはずであるという特性があると思います。

N の値が高いほど衝突の可能性は高くなりますが (多くの画像では、RG と B の強度の差の合計値が同じになります)、連続する各反復では、テストされていない画像に関する新しい情報が明らかになるはずです。前回の繰り返しで。

かなり計算コストがかかる可能性がありますが、特定のしきい値内でネガティブが検出されるとすぐにハッシュの計算を終了できるという利点があります (あなたが望むかもしれない質問から推測します)。

単なるアイデアです。明確でない場合はお知らせください。

于 2011-12-27T22:59:13.350 に答える
0

あなたが説明しているのは、画像の類似性の問題に適用された Locally Sensitive Hashingの例のようです。

共通のプレフィックス プロパティが適切なハッシュ関数に適しているかどうかはわかりません。優れたハッシュ関数には次の 2 つのプロパティがあると思います。

1) 適切なローカリゼーション - 画像 I1 と I2 の場合、norm(Hash(I1)-Hash(I2)) は、I1 と I2 の視覚的に認識される類似性を表す必要があります。

2) 適切な圧縮 - 高次元の画像データは、最も識別可能な方法でハッシュ関数の低次元空間に埋め込む必要があります。

于 2011-12-27T22:54:49.300 に答える
0

以下から良い結果が得られます。

3 つの画像 (1x7 7x1 と 6x6 の画像) に (情報を破棄しない適切なスケーリングを使用して) 縮小します。

すべてグレースケールに変換します。

画像ごとに、「次のピクセルは明るいですか?'1':'0' エンコードを行い、base62 として出力します。

これらの出力は、3 つの列の値になります。2 文字、2 文字、および 6 文字にパックされた、逐次洗練された素敵な差分。確かに、すべての色を破棄しますが、それでも問題ありません!

于 2012-01-06T23:29:46.097 に答える