本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

几天前看到阮一峰的博客里写到关于相似图片搜索的原理, 里面介绍了Google相似图片搜索的大致原理,主要是从Neal Krawetz博士的LOOKS LIKE IT翻译而来。文章详细的介绍了相似图片搜索处理的相关步骤,并且给出了一个python的实现,由于我对PHP比较熟,所以写了个PHP的版本。
 
图片相似搜索的简单原理
 
根据文章里的描述,其实原理比较简单,大致有如下几个步骤:
 
1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
 
2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
 
3、计算平均值。计算所有64个像素的灰度平均值。
 
4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
 
5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。
 
这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。实际应用中,往往采用更强大的pHash算法和SIFT算法,它们能够识别图片的变形。只要变形程度不超过25%,它们就能匹配原图。
 
图片相似搜索的PHP实现
 
原文中给出了一个python版本的实现,代码只有53行。我写了个对应的PHP版本,由于直接是用类写的,所以代码有100行,具体如下:
 
hash($f);
}
return $isString ? $result[0] : $result;
}
public function checkIsSimilarImg($imgHash, $otherImgHash){
if (file_exists($imgHash) && file_exists($otherImgHash)){
$imgHash = $this->run($imgHash);
$otherImgHash = $this->run($otherImgHash);
}
if (strlen($imgHash) !== strlen($otherImgHash)) return false;
$count = 0;
$len = strlen($imgHash);
for($i=0;$i<$len;$i++){
if ($imgHash{$i} !== $otherImgHash{$i}){
$count++;
}
}
return $count <= (5 * $rate * $rate) ? true : false;
}
public function hash($file){
if (!file_exists($file)){
return false;
}
$height = 8 * $this->rate;
$width = 8 * $this->rate;
$img = imagecreatetruecolor($width, $height);
list($w, $h) = getimagesize($file);
$source = $this->createImg($file);
imagecopyresampled($img, $source, 0, 0, 0, 0, $width, $height, $w, $h);
$value = $this->getHashValue($img);
imagedestroy($img);
return $value;
}
public function getHashValue($img){
$width = imagesx($img);
$height = imagesy($img);
$total = 0;
$array = array();
for ($y=0;$y<$height;$y++){
for ($x=0;$x<$width;$x++){
$gray = ( imagecolorat($img, $x, $y) >> 8 ) & 0xFF;
if (!is_array($array[$y])){
$array[$y] = array();
}
$array[$y][$x] = $gray;
$total += $gray;
}
}
$average = intval($total / (64 * $this->rate * $this->rate));
$result = '';
for ($y=0;$y<$height;$y++){
for ($x=0;$x<$width;$x++){
if ($array[$y][$x] >= $average){
$result .= '1';
}else{
$result .= '0';
}
}
}
return $result;
}
public function createImg($file){
$ext = $this->getFileExt($file);
if ($ext === 'jpeg') $ext = 'jpg';
$img = null;
switch ($ext){
case 'png' : $img = imagecreatefrompng($file);break;
case 'jpg' : $img = imagecreatefromjpeg($file);break;
case 'gif' : $img = imagecreatefromgif($file);
}
return $img;
}
public function getFileExt($file){
$infos = explode('.', $file);
$ext = strtolower($infos[count($infos) - 1]);
return $ext;
}
}
调用方式如下:
 
require_once "Imghash.class.php";
$instance = ImgHash::getInstance();
$result = $instance->checkIsSimilarImg('chenyin/IMG_3214.png', 'chenyin/IMG_3212.JPG');
如果$result值为true, 则表明2个图片相似,否则不相似。
 
 
 
其他
 
在实际的相似图片搜索中,算图片的指纹并不是难点,难点而是在怎么从海量的图片指纹里找出与之相似的指纹。

个人公众号谢谢各位老铁支持

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加)。

QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235

我的淘宝店,可以进去逛逛噢:https://shop108912636.taobao.com/index.htm?spm=2013.1.w5001-7867000954.3.1d29318dPlLar7&scene=taobao_shop

转载于:https://www.cnblogs.com/piwefei/p/5354087.html

php实现图片相似搜索相关推荐

  1. html+css 带图片的搜索框

    最近写B/S项目比较忙,很久没更新,今天分享一个B/S比较常见的带图片的搜索框代码.希望可以对你们有所帮助. 效果图先展示一下: 图片用的是阿里巴巴矢量图标库的图,需要用到的话,直接拷贝到代码里面就可 ...

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

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

  3. htm怎么让图片和搜索框在同一行_新手怎么玩好小红书

    新接触一个平台,为了能更快更好的的上手,达到自己的目的,应找一些资料学习.那么新手怎么样才能玩小红书呢,玩好小红书必需了解以下几点. 一.简单的了解小红书 1.至现今小红书每天有超过30亿次曝光,用户 ...

  4. 印象笔记图片文字搜索能力

    背景 双十一的时候半价升级印象笔记为高级账号,一大好处就是能同时在N(3个以上)的设备上同步使用一个账号.刚刚,我竟然发现了它的搜索功能是如此的强大,搜索范围已经扩展到图片上的内容了. 搜索 我的印象 ...

  5. 1688用图片精准搜索查找商品?

    今天CC来和小伙伴唠唠识图找物的这个话题.相信很多购物爱好者也好,电商狂人也好,对这个话题并不会感觉到陌生.因为随着很多电商平台的迭代更新,也是很多的平台都有这个功能,它可以帮助我们快速查找到我们无法 ...

  6. htm怎么让图片和搜索框在同一行_对于优化来说,内链应该怎么使用你知道吗?...

    做优化的人都知道,我们在优化的过程中,除了需要做外链,内链也是一样重要.内链往往成为一个短板.所以,今天就怎么通过内链来增加网站权重从而做好优化来进行分析,希望对大家有所帮助. 增加内链深度 在做一个 ...

  7. java 图片相似搜索_java获取两张图片的相似度

    package com.sinosoft.lis.utils; import java.awt.Graphics2D; import java.awt.color.ColorSpace; import ...

  8. java 图片相似搜索_JAVA比较两张图片相似度的方法

    本文实例讲述了JAVA比较两张图片相似度的方法.分享给大家供大家参考.具体如下: 摘要: importjava.awt.image.BufferedImage; importjava.io.File; ...

  9. 10个相似图片搜索以图找图的网站

    有没有遇到过:看到一张图片,想找到它的原始图片,或者是凭着一张小的缩略图找出原始大图?不管你有没有遇到过,反正我是遇到了.不过现在不担心了,因为下面的十款搜索引擎可以帮你实现,以图找图,以图搜图,以图 ...

最新文章

  1. 第二周 数据获取与表示 第一节 数据获取 Data Acquisition
  2. Python学习笔记:Web后端开发一览
  3. 通过帧中继验证OSPF支持的不同网络类型
  4. 【机器视觉】 dev_update_var算子
  5. 每天扫扫扫,二维码会被我们扫完吗?
  6. php查找顶级分类,php 无限级分类 获取顶级分类ID,php顶级_PHP教程
  7. 苹果正在研发iPhone检测抑郁症功能
  8. python下载大文件mp4_Python 下载 m3u8 格式视频
  9. Bresenham直线算法与画圆算法
  10. Matlab中值滤波去噪
  11. 麻瓜编程python百度云_麻瓜编程 实用主义学Python
  12. 设置新版谷歌浏览器自动启用flash
  13. C++程序设计谭浩强 第三章(程序设计初步)习题答案(部分有改进)
  14. Discuz!首页去掉版块的最后发表、主题数、总帖数
  15. 苯小孩的伤感空间日志发布:一个人,一座城,满心疼
  16. Quartus中jtagserver找不到指定文件的解决方法
  17. 数据分析之缺失值填充(重点讲解多重插值法Miceforest)
  18. java 在线excel_开源Excel在线协同工具
  19. cmakeLists.txt中增加-g选项不生效/gcc -s参数
  20. 解决:Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-defin

热门文章

  1. 《C语言程序设计》谭浩强 第五版 编程10题解答2
  2. MySQL 的create table as 与like 的使用
  3. windows7无法升级.错误 代码80072EE2 80072EFE
  4. 2021-2027全球及中国G Suite开发工具行业研究及十四五规划分析报告
  5. SDWebImage图片加载过程
  6. Educoder–Java高级特性(第二章)- 集合框架【笔记+参考代码】
  7. 讲解java源码_Java学习之Java源码讲解
  8. 2.18 串联系统与并联系统可靠度计算
  9. 到底什么是分布式系统,该如何学习
  10. 【微博关注】小白软件管家