N张图片之间的距离:递增! (同样的作物,但重新压缩/调整)

时间:2011-12-27 17:04:47

标签: java image-processing image-comparison geohashing

我正在尝试找出图像的地理哈希方法。这很难,因为可能的图像空间比lat / lng具有更高的维度。 (地理哈希将位置转换为字符串逐渐细化位置的字符串)

所以,我需要的是:

  • INPUT:磁盘上的JPG或PNG图像列表
  • 输出:对于每个图像,字符串WHERE 任意两个图像之间的字符串前缀越长,两个图像相同的可能性就越大。

它不需要是完美的,它不需要处理极端情况,如裁剪图像或严重调整的图像。它适用于不同分辨率和压缩级别的同一图像的多个副本。

我无法使用:

  • 文件或图片数据哈希,因为即使两张图片之间的微小变化也会产生完全不同的哈希并且您没有任何接近度
  • 图像减法,因为它不是N对N的比较。

我已经阅读了其他答案来尝试小波压缩或拉普拉斯/高斯金字塔,但我不确定如何在Java或Python中实现。但是,我取得了进步!

  1. 使用http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html调整为32x32以不丢弃数据。好的,一切都变成了正方形。
  2. 创建一个连续较小缩略图的金字塔,一直到2x2。
  3. 在2x2中,编码一串“是下一个比当前更亮的像素?如果是,1,否则0 ”(这会抛弃所有色调和饱和度,我可能想要<某种程度上使用色调)
  4. 对来自8x8和32x32金字塔的连续二进制数进行编码
  5. 将大二进制数转换为某些更高的基数表示,如Base62。
  6. 这似乎运作良好!与压缩或色彩平衡的微小差别不足以改变“该区域的左侧比右侧更亮”。但是,我认为我正在重新发明轮子,某种渐进式编码可能会更好? SIFT和其他特征检测过度,我不需要能够处理裁剪或旋转。

3 个答案:

答案 0 :(得分:0)

我在描述的内容似乎是Locally Sensitive Hashing应用于图像相似性问题的示例。

我不确定公共前缀属性是否适合良好的哈希函数。我希望一个好的哈希函数有两个属性:

1)良好的定位 - 对于图像I1和I2,norm(Hash(I1)-Hash(I2))应该代表I1和I2的视觉感知的同源性。

2)良好的压缩 - 高维图像数据应以最有辨别力的方式嵌入到散列函数的低维空间中。

答案 1 :(得分:0)

这个怎么样?哈希字符串由三个字符组成,表示红色绿色和蓝色:

{R0, G0, B0}, {R1, G1, B1}, {R2, G2, B2}, ...

对于每个组,图像的大小调整为2 ^ N×2 ^ N的平方。然后,该值是每个颜色的强度差异的总和(mod,比方说,255,或者你的编码是什么)。在一些遍历像素的情况下。

所以作为一个小例子,要计算例如组1(2x2图像),可以使用以下代码(我只用红色像素打扰)

int rSum = 0;
int rLast = 0;
for (int i=0; i<2; i++) {
  for (int j=0; j<2; j++) {
    rSum += Math.abs(image[i][j].r - rLast);
    rLast = image[i][j].r;
  }
}
rSum %= 255;

我相信这具有相似图像应该彼此接近的属性,对于散列中的每个字符以及散列中的连续字符而言都是如此。

虽然对于较高的N值,碰撞的可能性会更高(许多图像对于它们的RG和B强度具有相同的差值和),每次连续迭代都应该揭示关于图像的新信息。未经上一次迭代测试。

可能计算成本相当昂贵,但你有一个优势(我可以根据你的问题推断)你可以在一定阈值内检测到负数后立即结束哈希的计算。

只是一个想法,如果我不清楚,请告诉我!

答案 2 :(得分:0)

从以下方面获得良好结果:

缩小(使用不丢弃信息的良好缩放)到三个图像: 1X7 7X1 和一个6x6的图像。

将全部转换为灰度。

对于每张图片,&#34;下一个像素是否更明亮?&#39; 1&#39;:&#39; 0&#39; 0编码,输出为base62。

这些输出成为三列的值。不错的先后精制差异,包括2个字符,2个字符和6个字符。没错,丢弃所有颜色,但仍然很好!