我正在尝试找出图像的地理散列方法。这很难,因为可能图像的空间比 lat/lng 的维度要高得多。(地理散列将位置转换为字符串,其中字符串逐渐细化位置)
所以,我需要的是:
- INPUT:磁盘上的 JPG 或 PNG 图像列表
- 输出:对于每个图像一个字符串,其中任何两个图像之间的公共字符串前缀越长,两个图像相同的可能性就越高。
它不需要完美,也不需要处理极端情况,例如裁剪图像或经过大量调整的图像。它适用于不同分辨率和压缩级别的同一图像的多个副本。
我不能使用:
- 文件或图像数据散列,因为即使两个图像之间的微小变化也会产生完全不同的散列,并且您不会得到任何接近
- 图像减法,因为它不会是 N 对 N 比较。
我已阅读其他答案以尝试小波压缩或拉普拉斯/高斯金字塔,但我不确定如何在 Java 或 Python 中实现。不过,我进步了!
- 使用http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html将大小调整为 32x32以不丢弃数据。好的,一切都变成了一个正方形。
- 创建一个由逐渐缩小的缩略图组成的金字塔,一直到 2x2。
- 在 2x2 中,编码一串“下一个像素是否比当前像素亮?如果是,则为 1,否则为 0 ”(这会丢弃所有色调和饱和度,我可能想以某种方式使用色调)
- 对 8x8 和 32x32 金字塔中的连续二进制数进行编码
- 将大二进制数转换为更高的基数表示,如 Base62。
这似乎运作良好!压缩或色彩平衡的微小差异不足以改变“该区域的左侧是否比右侧更亮”。但是,我认为我正在重新发明轮子,某种渐进式编码可能会更好?SIFT 和其他特征检测是多余的,我不需要能够处理裁剪或旋转。