我期待编目图像创建的ID系统。我不能使用MD5(),因为这将改变,如果我改变图像的EXIF标签。

我目前使用由ImageMagick的计算出的SHA1校验和。它完美的作品,但它是真的,真的很慢上较大的图像(〜在一个四核Xeon的21万像素的JPG 15秒)。

是否有唯一地识别的图像的任何其它的“视觉”的方法,这将是比较快?

有帮助吗?

解决方案

您可以尝试在实际的位图数据,而不是JPEG文件运行MD5。我在我的机器(也四核至强),并在约23万像素的图像上900毫秒以下运行进行测试。

uint32_t width  = MagickGetImageWidth(imageWand);
uint32_t height = MagickGetImageHeight(imageWand);

uint8_t *imageData = malloc(width * height * 3);

MagickExportImagePixels(imageWand,
   0, 0, width, height, "RGB", CharPixel, imageData);

unsigned char *imageDigest = MD5(imageData, width * height * 3, NULL);

free(imageData);

其他提示

什么叫“视觉校验和”是什么意思?算法你提到(MD5 / SHA / CRC)在基于字节的方式工作,但没有考虑到图像的视觉信息。如果您将您的图像JPEG的一个,这两个文件将显示相同的图像,但具有完全不同的MD5 / SHA / CRC校验。

如果你唯一担心的是EXIF编辑,可以使图像的临时副本,与exiv2库从中去除所有元数据和运行校验和算法即可。我想这是远远快于手动缩小图像。你也可以通过仅使用源文件的第一n千字节的校验加速计算。

如果您的所有图像文件都直接从相机,你甚至更好:你可以提取预生成的缩略图EXIF与exiv2(一般只有几个千字节),并计算其校验

关于按比例缩小的方法:另外要注意的是,ImageMagick的可能会改变其缩放algorithmsin未来,这将取消你的校验

正如托德Yandell指出,MD5可能是速度不够快。如果没有,你可以更快地通过使用得到的东西是32位或64位 CRC 为你的校验。主要的区别是,任何人都可以做了相同的CRC的新形象;这是很容易欺骗。这是很辛苦的人欺骗的MD5校验。微小的差别是,CRC有很多更少的位,但除非你有一个非常大的数字图像,碰撞仍然是不太可能的。

exiftool 权利要求,以便能够从提取二进制图像JPEG文件,这样就可以计算出您的校验和无解,但我不能从该名男子页找出如何做到这一点。

我没有在笔记本电脑上英特尔Core 2 Duo L7100 CPU一些实验中,和8MP JPEG需要约1秒至压缩到PPM格式,然后另一个1秒至执行校验和。校验时间没有显着不同的使用md5sumsumsha1sum。所以,你最好的选择可能是找到一种方法,没有解压缩它来提取二进制数据。

我也注意到,您的校验将是几乎一样好,即使它使用少得多的像素。比较这两个:

djpeg -scale 1/8 big.jpg | /usr/bin/sha1sum   # 0.70s
djpeg            big.jpg | /usr/bin/sha1sum   # 2.15s

您应该考虑到有人会裁剪图像或修改的调色板,色彩深度或任何东西,那么平坦的校验会有所不同,即使在视觉上原始和修改后的图像仍然看起来非常相像。 也许有一个有效的算法,裁剪或重新着色的,像谷歌图片用途相似图片搜索。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top