gpt4 book ai didi

c++ - 如何在大量无损压缩图像中提取重复图像对(完全相同)?如何 std::hash 在内存中?

转载 作者:行者123 更新时间:2023-11-28 07:25:07 24 4
gpt4 key购买 nike

我的应用程序问题是,我可以获得大约 500 张图像,但是一对 2 个图像中可能有 1 个或 2 个完全相同,这意味着文件的校验和相同。我的最终目标是找出哪些是重复的图像 paris。

但是现在我必须对这 500 张图像应用压缩算法,因为未压缩的图像占用太多磁盘空间。好吧,压缩破坏了校验和,所以我无法使用压缩图像文件的校验和来找出哪些是重复的图像对。

幸运的是,我的压缩算法是无损的,这意味着恢复的未压缩图像仍然可以以某种方式散列。但我只想在没有太多磁盘写入访问的情况下在内存中执行此操作。那么我的问题是如何在内存中的大量图像文件中高效地提取重复图像?

我经常使用 opencv,但只要高效且不在磁盘上保存任何文件,答案就很好。 Python/Bash 代码也可以接受,C/C++ 和 OpenCV 是首选。

我可以想到使用 OpenCV 的 Mat 和 std::hash,但是 std::hash 不能直接工作,我必须编码 std::hash<cv::Mat>具体来说,我还不知道如何正确地做到这一点。

当然可以,

For each 2 images in all my images:
if ((cv::Mat)img1 == (cv::Mat)img2):
print img1 and img2 are identical

但这是非常低效的,基本上是一个 n^4 算法。

注意我的问题不是图片相似度问题,而是memroy中的哈希问题。

最佳答案

获取图像哈希算法的思路:

  1. 减小原始图像的大小 (cvResize()),这样只有重要的对象会保留在图片上(去除高频)。将图像缩小为 8x8,则总像素数将为 64,哈希将适合所有类型的图像,无论其大小和纵横比如何。

  2. 移除颜色。将上一步中获得的图像转换为灰度。 (cvCvtColor())。因此,hash 将从 192(三个 channel 的 64 个值 - 红色、绿色和蓝色)减少到 64 个亮度值。

  3. 求出生成图像的平均亮度。 (cvAvg())

  4. 图像的二值化。 (cvThreshold()) 只保留那些大于平均值的像素(将它们视为 1,将其他所有视为 0)。

  5. 构建哈希。 1和0图片的64个值在一个64位哈希值中的翻译。

接下来,如果您需要比较两个图像,那么只需为每个图像构建一个哈希并计算不同位的数量(使用汉明距离)。汉明距离——相同长度的两个二进制字各自的数不同的位置的个数。

距离为零表示很可能是同一幅图像,其他值表征它们彼此相差多少。

关于c++ - 如何在大量无损压缩图像中提取重复图像对(完全相同)?如何 std::hash 在内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18886951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com