PHP实现搜索相似图片

作者:hebedich 时间:2024-05-03 15:52:53 

感知哈希算法

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,图片,相似度
0
投稿

猜你喜欢

  • Python3 pywin32模块安装的详细步骤

    2023-01-20 06:42:46
  • 标签水平右对齐更适合中文网站

    2009-05-01 11:54:00
  • Django模板标签中url使用详解(url跳转到指定页面)

    2023-12-18 00:09:54
  • pyinstaller打包找不到文件的问题解决

    2022-03-28 06:21:01
  • ASP Access实现网站计数器(访问量)

    2011-04-10 10:33:00
  • FrontPage XP设计制作网页小技巧八则

    2008-06-04 12:43:00
  • jquery精度计算代码 jquery指定精确小数位

    2024-05-21 10:20:21
  • 详解tensorflow训练自己的数据集实现CNN图像分类

    2023-02-28 10:47:04
  • asp多关键词查询方案

    2008-05-09 12:24:00
  • 基于javascript实现tab切换特效

    2024-02-24 12:31:58
  • MYSQL复杂查询练习题以及答案大全(难度适中)

    2024-01-12 14:54:45
  • Python中WebService客户端接口调用及身份验证的问题

    2021-12-22 06:01:05
  • ASP trim,ltrim,rtrim 去前后空格 函数

    2011-03-03 10:39:00
  • mysql 显示SQL语句执行时间的代码

    2024-01-16 03:25:14
  • MySQL 数据库锁的实现

    2024-01-13 01:30:29
  • python如何利用traceback获取详细的异常信息

    2023-06-14 00:53:18
  • java解析php函数json_encode unicode 编码问题

    2023-07-03 17:10:23
  • python 进阶学习之python装饰器小结

    2023-05-12 07:13:42
  • UE、UI、UCD、Interaction Design、UED、UX、HCI、Usability,IA

    2022-09-11 04:22:56
  • 基于 Python实现云服务器的CDN域名远程鉴权配置

    2023-07-31 20:44:51
  • asp之家 网络编程 m.aspxhome.com