2012-07-04 10 views
11

私は(できれば簡単で高速な)画像ハッシングアルゴリズムが必要です。ハッシュ値はルックアップテーブルで使用され、暗号化には使用されません。速く簡単な画像ハッシングアルゴリズム

画像の一部は、実線で塗りつぶされた矩形、ラスタライズされたテキストなどですが、妥当なノイズ振幅で、豊かな色のスペクトル、主に滑らかな画像も含まれています。

また、特定の画像部分にハッシュアルゴリズムを適用できるようにしたいと思います。つまり、イメージはグリッドセルに分割でき、各セルのハッシュ関数はこのセルの内容にのみ依存する必要があります。 2つの画像に共通の領域がある場合(適切に配置されている場合)、すばやく検出することができます。

注:私は2枚のだけの画像(またはその一部)が同じあるかどうかを知る必要があります。つまり、類似の画像に一致させる必要はなく、フィーチャー認識、相関、その他のDSP技術は必要ありません。

好きなハッシュアルゴリズムは何ですか?

グリッドセル内のすべてのピクセルを単にXORする「写真」画像の場合は、多かれ少なかれです。異なる画像に対する同じハッシュ値の確率はかなり低く、特に(ほぼ白色の)ノイズの存在がすべての潜在的な対称性を壊すためです。さらに、そのようなハッシュ関数のスペクトルはよく見えます(ほぼ同じ確率で任意の値が可能です)。

しかし、このような単純なアルゴリズムは、「人工的な」グラフィックスでは使用できません。同一ピクセル、繰り返しパターン、幾何学的オフセット不変性は、そのような画像には非常に一般的です。すべてのピクセルをXORすると、同じピクセルの偶数の画像に対して0が与えられます。

CRT-32のようなものを使用すると若干有望に見えますが、もっと速く何かを見つけたいと思います。私は、このオプションに傾いてるようモジュロ素数を行う

hashValue = (hashValue * /*something*/ | newPixelValue) % /* huge prime */ 

おそらく、良好な分散を与える必要があります。私は、新しい各ピクセルは、このような現在のハッシュ値が、変異し、反復式を考えました。しかし、私はより良いvariansがあるかどうかを知りたいです。

ありがとうございます。

+0

なぜmd5のような平易なハッシュアルゴリズムを使用しないのですか? –

+0

@Karoly Horvath:良い質問です。確かにこれは私が必要とするものです。しかし、MD5は(恐らく)CPUを必要としているので、一方向のハッシュ関数であるように設計されています。 OTOH私はセキュリティの考慮事項がないので、もっと簡単なものが必要です。私はCRC-32について考えています。しかし、もっと単純なものを見つけたいと思っています – valdo

+0

多くの画像でこれを行うと、ボトルネックはディスクの速度になります。 –

答えて

7

非常に高速にしたい場合は、画像全体を読み取らないようにピクセルのランダムな部分集合を取ることを検討する必要があります。次に、それらのピクセルの値のシーケンスに対してハッシュ関数を計算します。ランダムサブセットは、固定シードを持つ確定的擬似乱数生成器によって選択されるべきであり、その結果、同一画像は同一のサブセットおよび結果として同一のハッシュ値を生成する。

これは人工的な画像であってもうまくいくはずです。しかし、画像の画素数が少ない場合、ハッシュ衝突が発生します。反復回数が増えるほど信頼性が向上します。このような場合、たとえば、画像セットに1つの異なるピクセルとのペアが存在する可能性が高い場合は、ハッシュ値を計算するためにすべてのピクセルを読み取る必要があります。疑似ランダム係数との単純な線形結合を取ることは、人工的な画像に対してさえも十分である。

単純なアルゴリズム

Random generator = new generator(2847) // Initialized with fixed seed 
int num_iterations = 100 

int hash(Image image) { 
    generator.reset() //To ensure consistency on each evaluation 
    int value = 0 
    for num_iteration steps { 
     int nextValue = image.getPixel(generator.nextInt()%image.getSize()).getValue() 
     value = value + nextValue*generator.nextInt() 
    } 
    return value 
} 
+0

答えをありがとう。グリッドセル全体を読むのに問題はありません。私のグリッドセルはかなり小さい(8x8または16x16)。さらに、2つの画像のハッシュ値が等しい場合でも、画像は等しいことが保証されます。唯一欠けているパラメータは、ハッシュ関数自体です。それは何でしょうか? – valdo

+2

暗号化セキュリティを必要とせず、人工画像だけを心配するならば、私が記述したように、無作為係数を持つピクセル値の単純な線形結合で十分です。 問題は、v1 = [34,2,4,92,3]、v2 = [10,3,5,20,3]などの整数配列のハッシュを見つけることに似ています。あなたの目標は、どの人が平等であるかを見るためのハッシュを見つけることです。最初に無作為に選ばれた固定ベクトルm = [72,37,1,4,34]を選ぶ。すべての入力ベクトルに対して、v1のハッシュ値はv1 * m = 34 * 72 + 2 * 37 + 4 * 1 + 92 * 4 + 3 * 34です。この数値をモジュロで計算することもできます。 – akashnil

5

の擬似コードは、密接に一致する画像を検索するために使用されphashアルゴリズムhttp://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.htmlに、このチュートリアルを見てください。

+0

ご注意いただきありがとうございますが、これは私がIMHOしたいものではありません。記述されたアルゴリズムは、「類似の」画像を見つけるのに適しており、スケール不変でもある。私の問題ははるかに簡単で、はるかに効率的なソリューションを望んでいます – valdo

+0

@valdo:私はいくつかの情報を追加しました。 – Bytemain

関連する問題