算法
缩小尺寸。
将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
简化色彩。
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
计算平均值。
计算所有64个像素的灰度平均值。
比较像素的灰度。
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
对比指纹
看看64位中有多少位是不一样的。在理论上,这等同于计算”汉明距离”(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。
实现关键点
计算灰阶
private static double calculateGrayValue(int pixel) {
int red = (pixel >> 16) & 0xFF;
int green = (pixel >> 8) & 0xFF;
int blue = (pixel) & 255;
return 0.3 * red + 0.59 * green + 0.11 * blue;
}
汉明距离
最终指纹其实是 0101 的二进制数字,举例
111000
111111
那么这两个数字的汉明距离,其实就是 ^ 运算后 1 的个数。
private static int hamDist(long finger1, long finger2) {
int dist = 0;
long result = finger1 ^ finger2;
while (result != 0) {
++dist;
result &= result - 1;
}
return dist;
}
源码
https://github.com/gavinliu/SimilarPhoto
参考资料
相似图片搜索的原理
- 大小: 126.9 KB
分享到:
相关推荐
Base64是一种将二进制数据转换为可打印字符的方法,广泛应用于电子邮件、HTTP传输、图片编码等领域。Apache Commons Codec提供了Base64编码器和解码器,可以方便地将字节流或字符串进行Base64转换。在Android中,...
在Android开发中,感知哈希(Perceptual Hashing,简称pHash)是一种用于比较图像相似性的算法。这种算法能够生成一个简化的、固定大小的图像指纹,即使图像经过缩放、旋转或轻微修改,其生成的哈希值仍然相似。这种...
总的来说,Android-Free是一款基于libtorrent的高效、功能丰富的Android 4 torrent客户端,它充分利用了libtorrent库的优势,为Android用户提供了一种便捷的P2P文件分享方式。对于开发者而言,研究Android-Free的...
在Android开发中,React Native(简称RN)是一种流行的JavaScript框架,它允许开发者使用JavaScript和React来构建原生的Android应用程序。RN的优点在于可以跨平台开发,显著提高开发效率,同时保持与原生应用相似的...
在Android平台上实现基于内容的图像检索,是一种技术挑战性较高的任务。这个项目主要涉及到了计算机视觉和图像处理领域,利用了OpenCV库的功能,尤其是在C++环境中进行开发。OpenCV是一个强大的开源计算机视觉库,...
MTCNN是用于人脸检测的一种高效算法,由三个部分组成:P-Net(Proposal Network)、R-Net(Refine Network)和O-Net(Output Network)。这三部分网络协同工作,首先在图像中快速定位潜在的人脸区域,然后进行精细化...
在Android平台上,使用OpenCV库进行图像处理是一个常见的选择,特别是在进行高级图像分析任务时,如图片相似度计算、结构相似性检测、感知哈希算法、轮廓检测、直线和圆的识别、直线交点计算、图像旋转角度矫正以及...
一种常见方法是使用直方图距离,如汉明距离(Hamming Distance)或切比雪夫距离(Chebyshev Distance),也可以采用更复杂的相似性度量如归一化的交叉相关(Normalized Cross-Correlation)或结构相似指数...
三边定位算法是一种常见的无线通信中用于确定物体位置的技术,尤其在室内定位系统中被广泛应用。该算法利用了信号传播时间(Time of Arrival, TOA)或者信号强度(Received Signal Strength Indicator, RSSI)来计算...
摘要中提到的是一种针对Android应用相似性检测的新方法,该方法称为“基于资源签名的Android应用相似性快速检测方法”。由于盗版Android应用通常保留了正版应用的用户体验,因此检测这些相似应用的需求变得尤为重要...
Python是一种强大的、面向对象的编程语言,被广泛用于各种领域,包括图像处理。在这个特定的项目中,我们有一个名为"Python-一个python脚本用来压缩android项目的图片和查找相同的图片"的工具,它专为Android开发者...
- **感知哈希算法(Perceptual Hashing, pHash)**:这是一种将图像转化为固定长度哈希值的方法,通过比较哈希值的相似性来判断图像的相似性。即使图像有微小变化,pHash也能检测出来。 2. **轮廓检测**: - 在...
在Android开发领域,手势解锁(Gesture Lock)是一种常见的用户验证方式,它允许用户通过画出预设的手势路径来解锁设备或应用。本项目“Android代码-gesturelock”旨在实现一个与Android原生解锁相似的功能,提供了...
峰值信噪比是一种衡量图像质量的客观指标,通过计算像素级别的均方误差来评估图像的相似性。PSNR越高,表示图像的失真程度越低。然而,PSNR并不完全符合人类视觉系统,对于某些情况下的图像失真判断可能与人眼感知...
在提供的"INTRUSIONDETECT"这个文件中,可能是包含了一个入侵检测系统的源代码或者示例,可能利用了上述的一种或多种方法来判断图片是否相同,以检测潜在的安全威胁。为了具体了解这个系统的工作原理和实现细节,...
Alpha-Beta剪枝是Minimax算法的一种优化形式,用于减少搜索树的深度。在决策树中,每个节点代表一个游戏状态,分支代表可能的走法。Minimax算法通过模拟所有可能的棋局发展,预测对手的最佳选择,但其效率较低,因为...
**JBIG(Joint Bi-level Image Group)二值图像压缩算法是一种专为黑白图像设计的高效压缩标准,其第二版JBIG2则是这个领域的国际标准。本文将深入探讨JBIT2编码实现的关键技术和流程,以及在C++中的实现方法。** ...
一种生成proguard字典的算法 为了保护我们的JAVA/Android代码,我们常使用proguard对代码进行混淆(http://proguard.sourceforge.net/)。 默认情况下,proguard混淆时将类/变量/方法重命名为a,b,c,...的格式。 我们可以...