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 相关文章推荐
php 远程图片保存到本地的函数类
Dec 08 PHP
PHP Document 代码注释规范
Apr 13 PHP
邮箱正则表达式实现代码(针对php)
Jun 21 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
彻底删除thinkphp3.1案例blog标签的方法
Dec 05 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
PHP获取文件扩展名的4种方法
Nov 24 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
Dec 09 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
php访问对象中的成员的实例方法
Nov 17 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 echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
JMenuTab简单使用说明
2008/03/13 Javascript
JQuery防止退格键网页后退的实现代码
2012/03/23 Javascript
asm.js使用示例代码
2013/11/28 Javascript
javascript操作html控件实例(javascript添加html)
2013/12/02 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
利用Angularjs和原生JS分别实现动态效果的输入框
2016/09/01 Javascript
JS绘制微信小程序画布时钟
2016/12/24 Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
2017/04/21 jQuery
js实现单张图片平移切换效果
2017/10/11 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
对python3 sort sorted 函数的应用详解
2019/06/27 Python
Python简单处理坐标排序问题示例
2019/07/11 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python如何实现单链表的反转
2020/02/10 Python
Python如何在DataFrame增加数值
2020/02/14 Python
python实现读取类别频数数据画水平条形图案例
2020/04/24 Python
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
英国领先的在线药房:Pharmacy First
2017/09/10 全球购物
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
工厂实习感言
2014/01/14 职场文书
贷款委托书
2014/08/01 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
个人租房协议书
2014/11/28 职场文书
就业导师推荐信范文
2015/03/27 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
党员干部学习三严三实心得体会
2016/01/05 职场文书
保安辞职申请书应该怎么写?
2019/07/15 职场文书