首頁 >後端開發 >php教程 >PHP中感知雜湊演算法

PHP中感知雜湊演算法

墨辰丷
墨辰丷原創
2018-06-07 11:22:272679瀏覽

感知哈希的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。在實際應用中,往往採用更強大的pHash演算法和SIFT演算法,它們能夠辨識圖片的變形。只要變形程度不超過25%,它們就能符合原圖。

感知雜湊演算法

count 9ab7f036a89122194ddc2a574895324e 10 兩張不同的圖片
var_dump(ImageHash:: run('./1.png', './psb.jpg'));

<?php
class ImageHash {
  const FILE_NOT_FOUND = &#39;-1&#39;;
  const FILE_EXTNAME_ILLEGAL = &#39;-2&#39;;
  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, [&#39;jpg&#39;,&#39;jpeg&#39;,&#39;png&#39;,&#39;gif&#39;])) exit(self::FILE_EXTNAME_ILLEGAL);
    $img = call_user_func(&#39;imagecreatefrom&#39;. ( $extname == &#39;jpg&#39; ? &#39;jpeg&#39; : $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 = &#39;&#39;;
    for($y = 0; $y < $h; $y++) {
      for($x = 0; $x < $w; $x++) {
        $hash .= ($array[$y][$x] >= $average) ? &#39;1&#39; : &#39;0&#39;;
      }
    }
    var_dump($hash);
    return $hash;
  }
}
var_dump(ImageHash::run(&#39;./1.png&#39;, &#39;./psb.jpg&#39;));

方法二:

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 = &#39;&#39;;
 for ($y=0;$y<$height;$y++){
  for ($x=0;$x<$width;$x++){
  if ($array[$y][$x] >= $average){
   $result .= &#39;1&#39;;
  }else{
   $result .= &#39;0&#39;;
  }
  }
 }
 return $result;
 }
 public function createImg($file){
 $ext = $this->getFileExt($file);
 if ($ext === &#39;jpeg&#39;) $ext = &#39;jpg&#39;;
 $img = null;
 switch ($ext){
  case &#39;png&#39; : $img = imagecreatefrompng($file);break;
  case &#39;jpg&#39; : $img = imagecreatefromjpeg($file);break;
  case &#39;gif&#39; : $img = imagecreatefromgif($file);
 }
 return $img;
 }
 public function getFileExt($file){
 $infos = explode(&#39;.&#39;, $file);
 $ext = strtolower($infos[count($infos) - 1]);
 return $ext;
 }
}

呼叫方式如下:

 require_once "Imghash.class.php";
$instance = ImgHash::getInstance();
$result = $instance->checkIsSimilarImg(&#39;chenyin/IMG_3214.png&#39;, &#39;chenyin/IMG_3212.JPG&#39;);

如果$ result值為true, 則表示2張圖片相似,否則不相似。

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助。

相關推薦:

PHP(迭代遞歸)實現無限級分類詳解

PHP中單例模式與工廠模式詳解及實例

PHP下Mongodb 連線遠端資料庫詳解及案例

#

以上是PHP中感知雜湊演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn