Я использую алгоритм MinHash для поиска похожих изображений между изображениями.
Я столкнулся с этим сообщением, How can I recognize slightly modified images?
, который указал мне на алгоритм MinHash.
Я использовал реализацию С# из этого сообщения в блоге, Set Similarity and Min Hash
.
Но при попытке использовать реализацию я столкнулся с двумя проблемами.
- Какое значение следует установить для значения
universe
для? - При передаче массива байтов изображения в
HashSet
он содержит только отдельные байтовые значения; таким образом, сравнивая значения от 1 до 256.
Что это за universe
в MinHash?
И что я могу сделать для улучшения реализации С# MinHash?
Так как HashSet<byte>
содержит значения до 256, значение подобия всегда выходит в 1.
Вот источник, который использует реализацию С# 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);
}
}
}