最近的iOS项目要用到图片相似度算法,需求是这样的:用户在来电时按home+锁屏键截图,当回到我们的软件时,比对用户最近一次截图是否为来电截图,是来电截图,上传到服务端。这里需要用到图片相似度算法,客户端预制一张来电时的屏幕截图,当监控到用户有新的截图时,比较预制的截图和这个截图的相似度,相似度高,才会上传到服务器。
在网上搜罗了大量资料,最终找到一个比较靠谱也比较简单的思路(参考文档):
1.缩小尺寸。
将图片缩小到8*8的尺寸,总共有64个像素。
2.简化色彩。
将缩小后的图片转化为64级灰度,所有像素点总共只有64中颜色。
3.计算平均值。
计算所有64个像素的平均灰度值。
4.比较像素的灰度。
将每个像素的灰度,与平均值进行比较。大于或等于平均值记为1;小于平均值记为0.
5.计算哈希值。
将上步的比较结果组合在一起,就构成了64位证书,这就是这张图片的指纹(fingerprint)。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
得到指纹以后,就可以比较不同图片,64位中有多少位是不一样的。理论上,这等于计算汉明距离(Hanmming distance)。如果不同的位数不超过5个,说明两张图片很相似;如果大于10个,说明这是两张不同的图片。
对UIImage转换还不是很熟悉,所以转换成iOS代码还比较费劲。
未完待续。。。
相关的文章:
http://blog.csdn.net/luoweifu/article/details/8220992
http://my.oschina.net/leejun2005/blog/103628
http://blog.csdn.net/luoweifu/article/details/8220992
http://blog.csdn.net/forthcriminson/article/details/8729000