PHP实现搜索相似图片


Posted in PHP onSeptember 22, 2015

感知哈希算法

count < =5 匹配最相似
count > 10 两张不同的图片
var_dump(ImageHash::run(‘./1.png', ‘./psb.jpg'));

<?php
class ImageHash {
  const FILE_NOT_FOUND = '-1';
  const FILE_EXTNAME_ILLEGAL = '-2';
  private function __construct() {}
  public static function run($src1, $src2) {
    static $self;
    if(!$self) $self = new static;
    if(!is_file($src1) || !is_file($src2)) exit(self::FILE_NOT_FOUND);
    $hash1 = $self->getHashValue($src1);
    $hash2 = $self->getHashValue($src2);
    if(strlen($hash1) !== strlen($hash2)) return false;
    $count = 0;
    $len = strlen($hash1);
    for($i = 0; $i < $len; $i++) if($hash1[$i] !== $hash2[$i]) $count++;
    return $count <= 10 ? true : false;
  }
  public function getImage($file) {
    $extname = pathinfo($file, PATHINFO_EXTENSION);
    if(!in_array($extname, ['jpg','jpeg','png','gif'])) exit(self::FILE_EXTNAME_ILLEGAL);
    $img = call_user_func('imagecreatefrom'. ( $extname == 'jpg' ? 'jpeg' : $extname ) , $file);
    return $img;
  }
  public function getHashValue($file) {
    $w = 8;
    $h = 8;
    $img = imagecreatetruecolor($w, $h);
    list($src_w, $src_h) = getimagesize($file);
    $src = $this->getImage($file);
    imagecopyresampled($img, $src, 0, 0, 0, 0, $w, $h, $src_w, $src_h);
    imagedestroy($src);
    $total = 0;
    $array = array();
    for( $y = 0; $y < $h; $y++) {
      for ($x = 0; $x < $w; $x++) {
        $gray = (imagecolorat($img, $x, $y) >> 8) & 0xFF;
        if(!isset($array[$y])) $array[$y] = array();
        $array[$y][$x] = $gray;
        $total += $gray;
      }
    }
    imagedestroy($img);
    $average = intval($total / ($w * $h * 2));
    $hash = '';
    for($y = 0; $y < $h; $y++) {
      for($x = 0; $x < $w; $x++) {
        $hash .= ($array[$y][$x] >= $average) ? '1' : '0';
      }
    }
    var_dump($hash);
    return $hash;
  }
}
var_dump(ImageHash::run('./1.png', './psb.jpg'));

方法二:

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个图片相似,否则不相似。

PHP 相关文章推荐
一个程序下载的管理程序(三)
Oct 09 PHP
PHP获取网站域名和地址的代码
Aug 17 PHP
php $_SERVER当前完整url的写法
Nov 12 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
Jan 22 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP中curl_setopt函数用法实例分析
Apr 16 PHP
PHP使用CURL模拟登录的方法
Jul 08 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
laravel 实现向公共模板中传值 (view composer)
Oct 22 PHP
从刷票了解获得客户端IP的方法
Sep 21 #PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
Sep 20 #PHP
分享ThinkPHP3.2中关联查询解决思路
Sep 20 #PHP
使用PHPCMS搭建wap手机网站
Sep 20 #PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 #PHP
PHP执行SQL文件并将SQL文件导入到数据库
Sep 17 #PHP
如何使用PHP对网站验证码进行破解
Sep 17 #PHP
You might like
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
PHP命令空间namespace及use的用法小结
2017/11/27 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
Mac系统下Webstorm快捷键整理大全
2017/05/28 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
微信小程序 可搜索的地址选择实现详解
2019/08/28 Javascript
python3实现域名查询和whois查询功能
2018/06/21 Python
pandas对dataFrame中某一个列的数据进行处理的方法
2019/07/08 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
用sqlalchemy构建Django连接池的实例
2019/08/29 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
表决心的诗句大全
2014/03/11 职场文书
四风问题个人对照检查材料
2014/09/26 职场文书
乡镇党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
2014年酒店工作总结范文
2014/11/17 职场文书
党员个人年度总结
2015/02/14 职场文书
2015年上半年信访工作总结
2015/03/30 职场文书
职工培训工作总结
2015/08/10 职场文书
导游词之包公祠
2019/11/25 职场文书
python程序的组织结构详解
2021/12/06 Python