2 つのヒストグラムを整数配列に変換すると、サイズが array1[65536] と array2[65536] の 2 つの配列があり、値の範囲は異なるインデックスで 0 ~ 255 です。ここで、これら 2 つの画像がどの程度一致しているかの結果を取得できるように、これら 2 つの配列を一致させたいと思います????? 至急助けてください。
3 に答える
できません。
画像ヒストグラムは、特定の色が画像に表示される回数を示します。画像 A を 25 ピクセルの黒い縦線、画像 B を 5x5 ピクセルの黒いボックスの画像と想像してください。
A と B のヒストグラムはまったく同じですが、明らかに類似した画像ではありません。
うーん、イメージが合っていないと比較にならない。Tergiver が言ったように、画像ヒストグラムは、画像の色調 (明度) 分布をグラフィカルに表現したものです。
ヒストグラムを比較して、それらが互いにどの程度異なるかを確認したい場合は、次の例のようにすることができます (これは単純化するために、5 要素サイズの配列の例です)。
int[] array1 = {0,255,100,200,78 };
int[] array2 = {255, 0, 250, 15, 34 };
float[] diff = new float[5];
for (int i = 0; i < 5; i++)
{
diff[i] = ((float)Math.Abs(array1[i] - array2[i])) / 255;
}
float degreeOfDiff = diff.Sum()/array1.Length*100;
bool sameDistribution = degreeOfDiff == 0;
Debug.WriteLine(degreeOfDiff + "%");
Debug.WriteLine(sameDistribution);
これは画像が等しいかどうかをチェックしないことを強調します。
質問は少しあいまいですが、対称的な違いが必要な場合は、1 行の LINQ クエリを次に示します。
int[] foo = new int[] { 1,2,3 };
int[] bar = new int[] { 4,5,6 };
int distance = foo.Zip(bar, (x,y)=>Math.Abs(x-y)).Aggregate( (x,y)=>x+y );
Console.WriteLine("Symmetric difference between foo and bar: {0}", distance);
類似度を計算するためのより洗練された方法があるかもしれません。それは、どの画像を「類似」と見なしたいかによって大きく異なります。「ほぼ」同じ色の画像が「類似」として登録されるように、より小さな配列(つまり、類似した色合いを組み合わせる)でもより良い結果が得られる可能性があると思います。
編集: Earth mover の距離が必要なようです: Wikiedia のページには、EMD の優れたアプリケーションとして画像比較がリストされています。
コンピュータ サイエンスにおける EMD の初期の用途は、ディザリング、ぼかし、または局所的な変形によって異なる可能性のある 2 つのグレースケール イメージを比較することでした[4]。この場合、領域はイメージのドメインであり、光 (またはインク) の総量は再配置される「汚れ」です。
EMD は、2 つのデジタル画像のカラー ヒストグラム間の距離を計算するために、コンテンツ ベースの画像検索で広く使用されています。この場合、領域は RGB カラー キューブであり、各画像ピクセルは「汚れ」の区画です。輝度、勾配、ビデオ フレーム内の見かけの動きなど、他の定量的なピクセル属性にも同じ手法を使用できます。
ウィキペディアのページには、EMD を計算するアルゴリズムの疑似コードもあります。これが問題に対する正しい答えだと思います。