Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MinHash查找两幅图像之间的相似性_C#_Image Processing_Fuzzy Comparison_Minhash - Fatal编程技术网

C# 使用MinHash查找两幅图像之间的相似性

C# 使用MinHash查找两幅图像之间的相似性,c#,image-processing,fuzzy-comparison,minhash,C#,Image Processing,Fuzzy Comparison,Minhash,我正在使用MinHash算法查找图像之间的相似图像。 我偶然看到这篇文章,它把我指向了算法 我使用的是这篇博客文章中的C#实现 但是在尝试使用实现时,我遇到了两个问题 我应该将universe值设置为什么值 将图像字节数组传递给HashSet时,它只包含不同的字节值;因此,比较1~256之间的值 这个宇宙在MinHash中是什么 我可以做些什么来改进C#MinHash实现? 由于包含多达256个值,因此相似度值始终为1 以下是使用C#MinHash实现的源代码,来自: 类程序 { 静态voi

我正在使用MinHash算法查找图像之间的相似图像。 我偶然看到这篇文章,它把我指向了算法

我使用的是这篇博客文章中的C#实现

但是在尝试使用实现时,我遇到了两个问题

  • 我应该将
    universe
    值设置为什么值
  • 将图像字节数组传递给HashSet时,它只包含不同的字节值;因此,比较1~256之间的值
这个
宇宙在MinHash中是什么
我可以做些什么来改进C#MinHash实现?

由于包含多达256个值,因此相似度值始终为1

以下是使用C#MinHash实现的源代码,来自:

类程序
{
静态void Main(字符串[]参数)
{
var imageSet1=GetImageByte(@.\Images\01.JPG”);
var imageSet2=GetImageByte(@“\Images\02.TIF”);
//var-app=新的最小哈希(256);
var app=new MinHash(Math.Min(imageSet1.Count,imageSet2.Count));
双重图像相似性=应用程序相似性(图像集1、图像集2);
WriteLine(“相似性={0}”,imageSimilarity);
}
私有静态哈希集GetImageByte(字符串imagePath)
{
使用(var fs=newfilestream(imagePath,FileMode.Open,FileAccess.Read))
使用(var br=新二进制读取器(fs))
{
//List bytes=br.ReadBytes((int)fs.Length.Cast().ToList();
var bytes=新列表(br.ReadBytes((int)fs.Length.ToArray());
返回新的哈希集(字节);
}
}
}

先回答第二个问题:

我可以做些什么来改进C#MinHash实现

您正试图在
字节
级别上比较文件的图像,这些文件的固有结构非常不同(您将TIFF用作一个图像,将GIF用作另一个图像)。即使这些文件在视觉上完全相同,您的实现也永远不会找到重复的文件,除非这些文件是相同类型的

这就是说,您的实现应该依赖于为创建签名而散列的图像的可比较属性

虽然字节的值肯定是图像的属性,但如果它们的格式不同,就无法相互比较

例如,对于图像,可以使用图像中每个像素的RGB(可能还有alpha)值。无论图像采用何种格式,这些值都是可比较的(您可以使用CMYK或任何其他您想要的格式)

但是,对每个像素使用单独的值将导致较差的结果。用于比较每个集合中的值(无论是否散列任何内容),并且由于集合没有指定任何顺序,因此具有相同颜色的相同像素数但排列在不同空间中的图像将导致误报

以以下图像为例:

它们都是100px x 100px,有50像素的红色和50像素的绿色

使用Jaccard相似度来比较两者,您会得到以下结果(请注意,由于值相同,因此集合中每个颜色只包含一个元素。如果需要,您可以使用来比较具有相同项目的多个计数的行李,但在这种情况下,值将是相同的):

关于
right image={r,g}
表示的注意事项:由于集合是无序的,
{r,g}
{g,r}
相同,因此它们实际上是相同的,即使没有计算Jaccard比较,这一点也很明显

但很明显,这些图像并不相同

这就是为什么通常使用该方法在集合中查找不同的小区域,这些小区域可以共同用于唯一标识项目

对于图像,可以使用固定长度的连续RGB值(在本例中,从左到右,从上到下,在击中边缘时环绕)生成木瓦。在本例中,假设木瓦长度为3,您的集如下所示(注意,我使用方括号表示属性/向量,因为木瓦本身不是集):

并为您提供一个Jaccard相似性:

intersection(left, right) = 2
union(right, left) = 6

similarity(left, right) = 2 / 6 = 33.33%
这是对这些图像与原始图像的相似程度的更接近的估计

请注意,木瓦可以是您选择的任何长度。您必须确定哪些木瓦会产生适当的Jaccard相似性结果(以及阈值),然后回答“这些木瓦有多相似?”

现在,回答你的第一个问题:

宇宙的价值是什么

在这个特殊的例子中,是宇宙中可能存在的物品的数量。如果使用单个RGB像素,则整个世界将是:

255 * 255 * 255 = 16,581,375
在处理这些项目的组合时,使用木瓦的价值要高得多。理想情况下,您希望为一组minhash函数生成一组。然而,由于类型系统的限制(或者,因为您不想在另一个存储介质中存储非常大的数字),您的重点应该放在使冲突最小化的哈希函数上

如果您知道项集合中可能的项的数量,那么它可以帮助您生成减少冲突数量的哈希函数


在这个宇宙中,大小用于生成一个随机数,然后传递这些数字以生成多个散列函数,用于Minhash,理想情况下,会产生最小的冲突。

简而言之,对于查找类似图像而言,单靠Minhash是一个糟糕的解决方案。当与适当的图像特征提取一起使用时,它应该可以很好地工作。但这远非易事。我会解释:

广义地说,Minhash根据shar的数量计算相似性
left image = { [r, r, r], [r, r, g], [r, g, g], [g, g, g] }
right image = { [g, g, g], [g, g, r], [g, r, r], [r, r, r] } 
intersection(left, right) = 2
union(right, left) = 6

similarity(left, right) = 2 / 6 = 33.33%
255 * 255 * 255 = 16,581,375