根据Neal Krawetz博士的解释,实现相似图片搜素的关键技术叫做"感知哈希算法"(Perceptualhash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。
以下是一个最简单的Java实现:
预处理:读取图片
第一步,缩小尺寸。
将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
第二步,简化色彩。
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
第三步,计算平均值。
计算所有64个像素的灰度平均值。
第四步,比较像素的灰度。
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
第五步,计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hammingdistance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。
你可以将几张图片放在一起,也计算出他们的汉明距离对比,就可以看看两张图片是否相似。
这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。
实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较
分享到:
相关推荐
图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法图片分类算法
此资料是利用MATLAB处理图像的经典算法,其中还包括各种MATLAB要处理的经典图片,很适合图像研究者
相信很多人都为怎么去写一个图片旋转算法而苦恼不以.现在上传一个动态连接库和相应的源代码,方法大家直接使用.测试后效率非常好.是个非常不错的算法. 支持C C++ VC VB C# 等等N多编程语言.
此代码段存在两个算法: 1、传统像素比较; 2、图片文件转BASE64字符串快速比对
BMP图片的解码算法.doc
图片缩放算法原理,思路清晰,容易理解,适合新手
视频转换成图片的算法
(利用GIF_LZW算法实现的)网络图片传输 技术特点 ~~~~~~~~ 一、使用TCP协议传输数据。理由:稳定性好。 二、使用字节数据流进行传输,理由: A:VB的String存在自动Unicode转换问题,影响速度; B:可以直接发送8位...
J2ME插值算法实现图片的放大缩小 J2ME插值算法实现图片的放大缩小
经典图像匹配算法的比较,通过比较大家可以很容易清楚各自的优缺点
包括256色转灰度图 对比度拉伸 二值化变换 反色 亮度增减 取对数 取指数 直方...傅立叶变换 Walsh变换 方块编码 图像细化 用Canny算子提取边缘 Hough变换 逆滤波处理 维纳滤波处理 共28种图片算法 适合研究图片的朋友们
图片文字提取的技术与算法研究——图片文字提取的技术与算法研究——图片文字提取的技术与算法研究——图片文字提取的技术与算法研究
一个初学者学习完K聚类算法后进行的一些初步尝试,对图片进行矩阵化后尝试将图片压缩同时保持图片原来的色彩。感觉编写得并不够好,比较适合初学者去理解
java算法全卷(包括基本算法和图算法)
基于Java的贝叶斯图片识别并分类的算法,将图片读入后二值化,然后利用贝叶斯算法求在X发生的条件下那个类别发生的概率最大,然后进行分类
图片 处理 缩放 算法 可以查看使用这段压缩算法到其它方面
利用OpenCvSharp实现感知哈希算法进行图片相似度对比及Stitcher类图像拼接生成全景图像 vs2015环境
差值算法自适应图片.doc差值算法自适应图片.doc差值算法自适应图片.doc差值算法自适应图片.doc差值算法自适应图片.doc
34467bmplib的读取和各种经典图片变化处理算法的比较
c#处理图片的30中算法。感觉非常棒,之前学习的时候的资源现在,分享一下,向深度学习c#高级绘图的可以学习下。