根据Neal Krawetz博士的解释,实现相似图片搜素的关键技术叫做"感知哈希算法"(Perceptualhash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。
以下是一个最简单的Java实现:
预处理:读取图片
第一步,缩小尺寸。
将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
第二步,简化色彩。
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
第三步,计算平均值。
计算所有64个像素的灰度平均值。
第四步,比较像素的灰度。
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
第五步,计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。
你可以将几张图片放在一起,也计算出他们的汉明距离对比,就可以看看两张图片是否相似。
这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。
实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较
分享到:
相关推荐
图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法
"图片算法"则指的是用于处理图像的数学方法和程序。这些算法包括但不限于: 1. **图像转换**:比如灰度转换,可以将彩色图像转化为灰度图像,便于后续处理;傅立叶变换用于分析图像的频域特性,有助于滤波和特征...
视频转换成图片的算法 视频转换成图片的算法是指将视频文件转换为一系列的图片文件,以便于后续的图像处理和分析。这种算法广泛应用于计算机视觉、图像处理和机器学习等领域。 从标题和描述中可以看出,这个算法的...
在IT行业中,图片尺寸自适应算法是一个非常关键的领域,特别是在网页设计、移动应用和多媒体处理中。这种算法的主要目标是确保图片能够在不同设备和屏幕尺寸下呈现出良好的视觉效果,同时保持图片的质量和比例不失真...
在VB(Visual Basic)编程环境中,实现图片的快速模糊算法是一项常见的图像处理任务。模糊算法主要是通过对图像像素的处理,使得图像的边缘变得不清晰,从而达到模糊效果。这种技术常用于图片背景的柔化、视觉焦点的...
图片旋转是计算机图形学中的一个常见任务,尤其在图像处理和多媒体应用中。这个压缩包提供的资源似乎包含了一个动态链接库(DLL)和相应的源代码,用于实现图像任意角度旋转的功能,并且支持多种编程语言,如C、C++...
在iOS应用中,你可以用这种抖动算法来处理用户上传的图片,使其适应黑白或有限颜色的墨水屏显示。此外,它也可以用于创建具有独特视觉风格的艺术效果,或者在资源有限的设备上优化图像质量。 总的来说,这个项目...
此代码段存在两个算法: 1、传统像素比较; 2、图片文件转BASE64字符串快速比对
【图片缩放算法原理】 图片缩放是计算机图形学中常见的操作,用于调整图像的尺寸,使其适应不同的显示需求。图像缩放分为放大和缩小,通常涉及到像素级别的处理。这里我们将探讨一种常用的图像缩放算法——双线性内...
(利用GIF_LZW算法实现的)网络图片传输 技术特点 ~~~~~~~~ 一、使用TCP协议传输数据。理由:稳定性好。 二、使用字节数据流进行传输,理由: A:VB的String存在自动Unicode转换问题,影响速度; B:可以直接发送8位...
本项目是关于“基于Java的贝叶斯图片识别并分类的算法”,其核心在于利用贝叶斯定理对图像进行分析,从而实现自动化分类。 首先,我们要理解贝叶斯分类的基本原理。贝叶斯分类是一种统计分类技术,它基于贝叶斯定理...
在本文中,我们将深入探讨如何使用OpenCvSharp库,结合感知哈希算法与图像拼接技术,来实现图片的相似度对比与全景图像生成。首先,我们需要了解OpenCV和OpenCvSharp这两个核心工具。 **OpenCV** 是一个开源的...
在C#编程语言中,处理图片涉及到一系列的图像处理算法,这些算法可以帮助开发者实现各种复杂的图像操作,如图像转换、滤波、颜色处理、形状识别等。本资源提供了30种不同的图片处理算法,对于想要深入学习C#高级绘图...
Java算法全卷涵盖了基本算法和图算法,是学习和提升编程技能的重要资源。这份资料主要针对使用Java语言进行算法实现的开发者,适用于那些对ANT、EJB、J2EE、JAVA和SPRING等技术栈有了解或兴趣的人群。下面我们将深入...
通过滴水算法分割图片,能够处理复杂的粘连字符问题,提高验证码识别的准确度。通过上述Python实现的示例,读者可以更加深入地理解和掌握滴水算法的原理和应用。需要注意的是,算法实现过程中可能存在的错误识别问题...
本篇将深入探讨"android经典图片压缩算法 - 永不失真"这一主题,帮助开发者了解如何有效地压缩图片,同时保持图像质量。 首先,我们要理解的是,"不失真"压缩是指在压缩过程中不损失任何图像细节,即压缩后的图片与...
### SIFT与SURF算法的比较 #### 一、引言 随着计算机视觉技术的发展,图像匹配成为了一项重要的研究领域。在众多图像匹配方法中,尺度不变特征变换(SIFT)与加速稳健特征(SURF)是两种非常流行的局部特征提取算法...
这本书的电子版包含了原书的图片,使得读者在阅读过程中能够更好地理解和掌握复杂的算法示意图。"含数学符号"的标签表明书中涉及到的算法分析可能包含了大量的数学表达式,如时间复杂度、空间复杂度的计算,以及概率...
本文将详细探讨图片缩放的相关算法,以及这些算法在不同场景下的应用。 首先,我们要了解图片是由像素构成的,缩放过程中涉及到的关键就是像素的重采样。常见的缩放算法有以下几种: 1. 最近邻插值(Nearest ...
包括256色转灰度图 对比度拉伸 二值化变换 反色 亮度增减 取对数 取指数 直方...傅立叶变换 Walsh变换 方块编码 图像细化 用Canny算子提取边缘 Hough变换 逆滤波处理 维纳滤波处理 共28种图片算法 适合研究图片的朋友们