我正在开发 memoization相似图像系统。我会将这个问题分成两个子问题,因为一个是另一个的下一步,但如果您认为这更合适,我可以发布两个不同的问题。
首先要知道:我对图像处理一无所知,所以请对这个可怜的家伙温柔点:)
问题描述
我们有一个函数 ReturnType foo(Image)
拍摄图像,对其进行一些耗时的计算,然后返回一些东西(这取决于应用程序)。我正在设计的 memoizator 是一个 unordered_map<ImageHash,ReturnType>
(或等效结构),因此如果用户两次提交相同的图像,它会直接返回已经计算的 ReturnType
值(value)。
我需要什么
如你所想,我需要一些 HashFunction
英石。 HashFunction(Image)=ImageHash
, 其中ImageHash
是唯一的,概率很高。
注意这个 ImageHash
必须不依赖于特定的运行、机器、时间。这是因为 unordered_map
将在文件中序列化(因此它可以在不同的运行中使用)并与其他用户共享。
由于性能非常重要,因此快速散列函数会很好。
我找到了 this question关于题目,但是作者在图像上引入了很多限制条件(并且沉迷于没有给出好的解决方案)。
注意:图像没有限制,因此您可以提出您喜欢的任何解决方案(包括它设计的图像集)。
注意: SHA-1 可能是一种可能的解决方案吗?我只将它用于字符串,我不知道是否可以将它用于图像(以及它是否存在 C++ 实现)
下一步
我想扩展之前的解决方案,以便我们为相似图像 返回相同的结果。如此正式,给出 Image image1
类似于 Image image2
,则系统返回ReturnType result
对于 image1
如果(image1,result)
或 (image2,result)
之前已经计算过。
我听说过 phash但我不知道它是否适合这个目的。
最佳答案
我建议您先开始收集一些图像,然后再继续。话虽如此,目前最好的方法是使用深度学习学习相似度函数并将图像映射到某个 n 维特征空间并使用余弦距离来衡量相似度。下面是一些帮助您入门的示例代码 ( https://github.com/kevinlin311tw/caffe-cvprw15 )。如果您想要更高性能的技术并且愿意跟随兔子洞,请研究三元组排序损失。
Phash 确实有效,但它在生成相似性分数方面的表现远低于使用深度学习功能的表现。然而,它肯定比真正的散列技术更好,因为只要改变 jpeg 压缩级别就会改变散列值。如果你不想在这上面花太多时间,phash 将是最好的选择,因为它使用起来毫不费力。
关于c++ - c++中的图像哈希,具有相似的图像特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37042170/