PHP實現圖片相似性對比

來源:互聯網
上載者:User
PHP如何?圖片相似性對比?本文將通過感知雜湊演算法來實現搜尋相似圖片。希望對大家有所協助。

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

感知雜湊演算法

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


<?phpclass 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 圖片處理類

thumbs是什麼意思 PHPThumb PHP 圖片縮圖庫

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.