• 技术文章 >后端开发 >php教程

    PHP实现搜索相似图片_PHP

    2016-05-29 11:48:27原创479
    感知哈希算法

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:php简单日历函数_PHP 下一篇:php实现的单一入口应用程序实例分析_PHP
    Web大前端开发直播班

    相关文章推荐

    • php依赖注入总结分享• 注册页面之前先验证用户名是否存在的php代码_PHP• 用PHP与XML联手进行网站开发_PHP• PHP中重新定向到另一个页面_PHP• Windows 下 PHP 环境的配置

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网