我正在尝试找出图像的地理哈希方法。这很难,因为可能的图像空间比lat / lng具有更高的维度。 (地理哈希将位置转换为字符串逐渐细化位置的字符串)
所以,我需要的是:
它不需要是完美的,它不需要处理极端情况,如裁剪图像或严重调整的图像。它适用于不同分辨率和压缩级别的同一图像的多个副本。
我无法使用:
我已经阅读了其他答案来尝试小波压缩或拉普拉斯/高斯金字塔,但我不确定如何在Java或Python中实现。但是,我取得了进步!
这似乎运作良好!与压缩或色彩平衡的微小差别不足以改变“该区域的左侧比右侧更亮”。但是,我认为我正在重新发明轮子,某种渐进式编码可能会更好? SIFT和其他特征检测过度,我不需要能够处理裁剪或旋转。
答案 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个字符。没错,丢弃所有颜色,但仍然很好!