MinHash アルゴリズムを使用して、画像間で類似の画像を見つけています。MinHashアルゴリズムHow can I recognize slightly modified images?
を指摘したこの投稿に出くわしました。
このブログ投稿の C# 実装を使用していましたSet Similarity and Min Hash
。
しかし、実装を使用しようとしているときに、2 つの問題に遭遇しました。
- 値をどの値に設定すればよい
universe
ですか? - イメージ バイト配列を に渡す場合
HashSet
、個別のバイト値のみが含まれます。したがって、1 ~ 256 の値を比較します。
これuniverse
は MinHash で何ですか?
また、C# MinHash の実装を改善するにはどうすればよいですか?
HashSet<byte>
最大 256 の値が含まれているため、類似度の値は常に 1 になります。
の C# MinHash 実装を使用するソースは次のSet Similarity and Min Hash
とおりです。
class Program
{
static void Main(string[] args)
{
var imageSet1 = GetImageByte(@".\Images\01.JPG");
var imageSet2 = GetImageByte(@".\Images\02.TIF");
//var app = new MinHash(256);
var app = new MinHash(Math.Min(imageSet1.Count, imageSet2.Count));
double imageSimilarity = app.Similarity(imageSet1, imageSet2);
Console.WriteLine("similarity = {0}", imageSimilarity);
}
private static HashSet<byte> GetImageByte(string imagePath)
{
using (var fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
using (var br = new BinaryReader(fs))
{
//List<int> bytes = br.ReadBytes((int)fs.Length).Cast<int>().ToList();
var bytes = new List<byte>(br.ReadBytes((int) fs.Length).ToArray());
return new HashSet<byte>(bytes);
}
}
}