基于感知哈希算法的中药标本相似图片的搜索

一 前言

笔者最近在开发中药标本相似图片的搜索,就是根据用户上传的图片,然后到中药标本库里找到相似的图片,从而帮助用户识别标本,获取标本信息。查阅了大量资料,看到了阮一峰的一篇文章,经过一个月的开发终于完成

二 下面是阮一峰的一个最简单的实现(原文点击打开链接

你输入Google图片的网址,或者直接上传图片,Google就会找出与其相似的图片。下面这张图片是美国女演员Alyson Hannigan。


上传后,Google返回如下结果:


这种技术的原理是什么?计算机怎么知道两张图片相似呢?
根据Neal Krawetz博士的解释,原理非常简单易懂。我们可以用一个快速算法,就达到基本的效果。
这里的关键技术叫做"感知哈希算法"(Perceptual hash algorithm),它的作用是对每张图片生成一个"指纹"(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。


下面是一个最简单的实现:
第一步,缩小尺寸。
将图片缩小到8x8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。


第二步,简化色彩。
将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。


第三步,计算平均值。
计算所有64个像素的灰度平均值。

第四步,比较像素的灰度。
将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

第五步,计算哈希值。
将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。


得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算"汉明距离"(Hamming distance)。如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,它就认不出来了。所以,它的最佳用途是根据缩略图,找出原图。实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。这些算法虽然更复杂,但是原理与上面的简便算法是一样的,就是先将图片转化成Hash字符串,然后再进行比较。

三  基于感知哈希算法的中药标本相似图片的搜索
在参考了阮一峰的思路后,自己开发了基于感知哈希算法的中药标本相似图片的搜索,本打算用比较熟悉的java开发的,但是想尝试一下php的开发速度,于是最终采用了php开发此系统,php自带的GD图像处理函数还是很方便的,下面简单介绍一下系统
1.用户上传查询图片界面


用户选择图片文件后,单击上传即可进行图片的上传,采用ajax返回,同时用户可以在线图片进行剪裁,这里主要采用了jcrop插件

单击图像识别后,就可以到数据库里查找相似图片了,这里主要是用php实现了上面说的感知哈希算法,计算用户上传图片的指纹编码和数据库中标本图片指纹编码进行比对,如果小于10就认为它们是相似的。

单击找到的记录名称,即可查看该相似标本的详细信息,为了很好的用户体验,这里的弹出框主要采用了fancybox

2.系统后台界面(超过10条记录就会出现分页,这里我才添加了7条记录,呵呵)


数据添加界面(这里的富文本编辑器主要采用了KindEditor,数据采用ajax提交,用了jquery.form):


由于时间仓促,源代码还在整理中,等整理好了,会考虑开源。

参考资料:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值