相似图片检测
一、传统哈希算法
1.平均哈希算法(aHash)
此算法是基于比较灰度图每个像素与平均值来实现的,最适用于缩略图,放大图搜索
步骤:
1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图
附上几种常用的灰度图相关算法(R = red, G = green, B = blue)
1.浮点算法:Gray = R * 0.3 + G * 0.59 + B * 0.11
2.整数方法:Gray = (R * 30 + G * 59 + B * 11) / 100
3.移位方法:Gray = (R * 76 + G * 151 + B * 28) >> 8
4.平均值法:Gray = (R + G + B) / 3
5.仅取绿色:Gray = G
3.计算平均值: 计算进行灰度处理后图片的所有像素点的平均值
4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0
5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可
此算法可参考开源项目下载地址: http://download.csdn.net/detail/nash_/5093143
2.感知哈希算法(pHash)
平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法
步骤:
1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算DCT:DCT把图片分离成分率的集合
4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率
5.计算平均值:计算缩小DCT后的所有像素点的平均值
6.进一步减小DCT:大于平均值记录为1,反之记录为0
7.得到信息指纹:组合64个信息位,顺序随意保持一致性即可
此算法可参考开源项目pHash,下载地址: http://www.phash.org/download/
3.差异哈希算法(dHash)
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的
步骤:
1.缩小图片:收缩到9*8的大小,以便它有72的像素点
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)
3.计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值
4.获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0
流程如下:原始图像->压缩->灰度处理->计算hash值->汉明距离 这里着重介绍最后两步 对比指纹:根据两幅图片的指纹(选用上面三种hash计算方法中的一种计算出的值),计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)
二、几种特征算法
1.SIFT特征
SIFT具有较好的尺度不变性,即使改变旋转角度或者拍摄角度,仍然能够得到较好的检测效果,主要用来查找关键信息比如图片搜索。而且现在因为专利问题比较麻烦。
SIFT算法实现物体识别主要有三大工序,1、提取关键点;2、对关键点附加详细的信息(局部特征)也就是所谓的描述器;3、通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。
2.SURF特征
SURF(Speeded Up Robust Features)是对SIFT的改进版本,改进后的主要优点是速度更快,更适合做实时的特征检查。对于需要实时运算的场合,如基于特征点匹配的实时目标跟踪系统,每秒要处理8-24帧的图像,需要在毫秒级内完成特征点的搜索、特征矢量生成、特征矢量匹配、目标锁定等工作,这样SIFT算法就很难适应这种需求了。实验证明,SURF算法较SIFT在运算速度上要快3倍左右。
3.GIST特征
三、聚类算法
1.K-means聚类、聚类中心点作为特征向量、对比向量相近度
四、颜色直方图匹配
图像直方图是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素数。
直方图只能做相同图像相同事物的比较,在做相似性图像的比较时效果较差,很难直接用于工业上的图像的相似性检索等工作
五、卷积神经网络
计算量比较大