daybreaker Asked:2020-03-07 17:42:27 +0000 UTC2020-03-07 17:42:27 +0000 UTC 2020-03-07 17:42:27 +0000 UTC 比较图片的相似度 772 如何比较图1和图2? 为了相似性,它们的大小没有必要不同。此外,它们不必是 100% 相似的。 研究这个主题的最佳材料是什么? java 1 个回答 Voted Best Answer gil9red 2020-03-07T18:04:05Z2020-03-07T18:04:05Z 通过感知散列算法可以比较大小(亮度、对比度等)可能不同的图片。 感知散列可以相互比较并推断两组数据之间的差异程度。 在 habrahabr 上有一篇关于此主题的文章。我还在c++ 中找到了这个算法的实现。当然java,要么有算法,要么你可以写,因为 那里没有什么离谱的。 在这里,我将引用关于 Habré 的文章来描述通用算法: 减小尺寸。消除高频的最快方法是减少图像。在本例中,我们将其缩小为 8x8,因此总像素数为 64。您不必担心比例,只需将其平方为 8x8。因此,哈希将匹配图像的所有变体,无论大小和纵横比如何。 去除颜色。小图像被转换为灰度,因此哈希减少了 3 倍,从 64 个像素(64 个红色、64 个绿色和 64 个蓝色)到总共 64 个颜色值。 找到平均值。计算所有 64 种颜色的平均值。 比特链。这是最有趣的部分:对于每种颜色,您会得到 1 或 0,具体取决于它是高于还是低于平均值。 建立一个哈希。将 64 个单独的位转换为单个 64 位值。只要保持不变,顺序就无关紧要(我从左到右,从上到下写位)。 如果图像被缩放、压缩或拉伸,最终的哈希值不会改变。改变亮度或对比度,甚至改变颜色也不会产生太大的影响。最重要的是:这个算法非常快! 如果您需要比较两张图片,那么只需为每张图片构建一个哈希并计算不同位的数量(这就是汉明距离)。零距离意味着这些很可能是相同的图片(或相同图片的变体)。距离为 5 表示图片有些不同,但总体上它们仍然相当接近。如果距离为 10 或更大,那么这些可能是完全不同的图像。 总共比较两张图片: 我们需要找到两张图片的感知哈希。 使用汉明距离,确定哈希之间的差异程度,并根据差异确定它们的相似性。 PS。 有一个python库来比较图像imagehash。我玩过它,可以提供两个例子: 控制台(在给定文件夹中搜索图片并显示相似图片) 窗口化(对于选定的图像,找到了 3 个相似的图像,它们用框架突出显示并放在下面的列表中),截图:
通过感知散列算法可以比较大小(亮度、对比度等)可能不同的图片。
感知散列可以相互比较并推断两组数据之间的差异程度。
在 habrahabr 上有一篇关于此主题的文章。我还在c++ 中找到了这个算法的实现。当然
java,要么有算法,要么你可以写,因为 那里没有什么离谱的。在这里,我将引用关于 Habré 的文章来描述通用算法:
总共比较两张图片:
PS。
有一个python库来比较图像imagehash。我玩过它,可以提供两个例子:
控制台(在给定文件夹中搜索图片并显示相似图片)
窗口化(对于选定的图像,找到了 3 个相似的图像,它们用框架突出显示并放在下面的列表中),截图: