【发布时间】:2016-05-05 16:42:30
【问题描述】:
我正在为类似图像开发一个memoization 系统。我会将这个问题分为两个子问题,因为一个是另一个的下一步,但如果您认为这更合适,我可以发布两个不同的问题。
首先要知道:我对图像处理一无所知,所以请对这个可怜的家伙温柔一点:)
问题描述
我们有一个函数ReturnType foo(Image),它获取一张图像,对其进行一些耗时的计算并返回一些东西(这取决于应用程序)。我正在设计的 memoizator 是一个unordered_map<ImageHash,ReturnType>(或等效结构),因此如果用户两次提交相同的图像,它会直接返回已经计算的ReturnType 值。
我需要什么
如你所想,我需要一些HashFunction s.t. HashFunction(Image)=ImageHash,其中ImageHash 很有可能是唯一的。
请注意,此ImageHash 必须不依赖于特定的运行、机器和时间。这是因为unordered_map 将在文件中序列化(因此可以在不同的运行中使用)并与其他用户共享。
由于性能确实至关重要,因此快速散列函数会很好。
我找到this question关于这个话题,但是作者在图像上引入了很多限制(并且沉迷于没有给出好的解决方案)。
注意:图像没有限制,因此您可以提出您喜欢的任何解决方案(包括为其设计的图像集)。
注意: SHA-1 可能是一种可能的解决方案吗?我只将它用于字符串,我不知道它是否可以用于图像(以及它是否存在 C++ 实现)
下一步
我想扩展之前的解决方案,以便我们为相似图像返回相同的结果。正式地,给定Image image1 类似于Image image2,那么如果image1 之前已经计算过image1,系统将返回ReturnType result。
我听说过phash,但我不知道它是否适合这个目的。
【问题讨论】:
-
md5 是这类事情的常用哈希算法。至于使用散列来匹配相似的图像,我认为这是行不通的——散列码在很大程度上取决于用于生成它们的确切字节序列,并且(据我所知)没有任何方法使用它们来测试不精确的相等性。
-
@JeremyFriesner 所以 sha-1 也不错 :)
标签: c++ image hash memoization