我试图将源图像与集合中的数千个图像进行比较,以获得最有可能匹配的相似性得分(0-1)每个图像都很小(64x64或更小)。每个图像是1位,这意味着每个像素要么关闭(完全透明),要么打开(完全白色)我正在尝试创建一个非常快速的相似性算法来比较这些图像。我通过google搜索找到了许多相似性算法,但它们都涉及到比较大的全彩图像,我不需要这样做。
我知道我可以只比较匹配/不匹配的像素,但这可能会很慢,因为比较集可能非常大比较集图像的大小与查找图像的大小完全相同。
是否可以为这些类型的图像创建散列或其他快速查找,其中可以执行散列或二进制搜索查找,并使用最可能的匹配项创建相似度分数?
最佳答案
为了得到二值图像的比较分数,我建议您使用异或操作计算Hamming distance,然后计算其中的个数使用ssse3指令的快速popcount操作可以大大加快速度。
Hamming距离告诉您两个二进制字符串之间不同的位数(因此它实际上是一个不同的值)要获得该范围内的分数,例如[0, 1]
,可以除以图像的大小(这样就可以得到与图像大小不变的分数)。
关于与数千幅图像的比较,请确保这是一个瓶颈,因为如果数据没有那么大,可能会比您想象的要快。如果您仍然需要加快速度,您可以考虑以下任何或两种想法:
1)并行化:例如,该函数可能很容易与OpenMP或tbb并行化。
2)哈希表:使用每个图像的第一个(或某些子集)位将它们索引到向量中然后,比较那些只属于同一散列箱的图像。当然,这是一种近似的方法,你不会得到任何一对图像的比较分数,只有那些足够相似的图像。
请记住,如果要与所有图像进行比较,则必须对所有数据库运行完全比较,因此除了并行化之外,几乎没有其他机会加快比较速度。