图像指纹来比较许多图像的相似性
我需要创建许多图像的指纹(大约100.000现有,每天1000新,RGB,JPEG,最大大小800×800),以便快速比较每个图像与其他图像。我不能使用二进制比较方法,因为也应该识别几乎相似的图像。
最好是现有的库,但也有一些提示现有的算法会帮助我很多。 解决方法
正常散列或CRC计算算法对图像数据不能很好地工作。必须考虑信息的维度性质。
如果你需要非常强健的指纹,如果考虑仿射变换(缩放,旋转,平移,翻转),你可以使用Radon transformation on the image source来产生图像数据的规范映射 – 将它与每个图像存储,然后仅比较指纹。这是一个复杂的算法,不是为了微弱的心。 一些简单的解决方案是可能的: >为图像创建一个亮度直方图作为指纹 亮度直方图(特别是被分成RGB分量的直方图)是图像的合理指纹,并且可以相当有效地实现。从另一个直方图中减去一个直方图将产生一个新的历史记录,您可以处理以确定两个图像之间的相似程度。直方图,因为仅评估亮度/颜色信息的分布和发生,处理仿射变换相当好。如果将每个颜色分量的亮度信息量化为8位值,则768字节的存储空间足以用于几乎任何合理大小的图像的指纹。当操纵图像中的颜色信息时,亮度直方图产生假阴性。如果应用像对比度/亮度,posterize,颜色转换,亮度信息变化的变换。假阳性对于某些类型的图像也是可能的…例如风景和其中单个颜色支配其他颜色的图像。 使用缩放的图像是将图像的信息密度降低到更容易比较的水平的另一种方式。在原始图片尺寸的10%以下的缩小通常会丢失太多的信息,因此800×800像素的图片可缩小为80×80,并仍然提供足够的信息来执行良好的指纹。与直方图数据不同,当源分辨率具有不同的宽高比时,必须执行图像数据的各向异性缩放。换句话说,将300×800图片缩小为80×80缩略图会导致图片变形,因此与300×500图片(非常相似)相比,会导致假阴性。当涉及仿射变换时,缩略图指纹也常常产生假否定。如果您翻转或旋转图像,其缩略图将与原始图像完全不同,并可能导致假阳性。 组合这两种技术是一种合理的方法来对冲你的赌注,减少假阳性和假阴性的发生。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |