Heim > Backend-Entwicklung > PHP-Tutorial > PHP implementiert den Bildähnlichkeitsvergleich

PHP implementiert den Bildähnlichkeitsvergleich

*文
Freigeben: 2023-03-18 18:16:02
Original
7874 Leute haben es durchsucht

Wie erreicht man einen Bildähnlichkeitsvergleich in PHP? In diesem Artikel wird der Wahrnehmungs-Hashing-Algorithmus verwendet, um nach ähnlichen Bildern zu suchen. Ich hoffe, es hilft allen.

Der Vorteil von Perceptual Hashing besteht darin, dass es einfach und schnell ist und nicht durch die Skalierung der Bildgröße beeinflusst wird. Der Nachteil besteht darin, dass der Inhalt des Bildes nicht geändert werden kann. In praktischen Anwendungen werden häufig der leistungsstärkere pHash-Algorithmus und der SIFT-Algorithmus verwendet, mit denen die Verformung von Bildern erkannt werden kann. Solange die Verzerrung 25 % nicht überschreitet, können sie mit dem Originalbild übereinstimmen.

Wahrnehmungs-Hash-Algorithmus

count < entspricht den ähnlichsten
count >
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;));
Nach dem Login kopieren


Methode 2:


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;
 }
}
Nach dem Login kopieren


Die Aufrufmethode ist wie folgt:


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


Wenn der $result-Wert wahr ist, bedeutet dies, dass die beiden Bilder ähnlich sind, andernfalls sind sie nicht ähnlich.

Verwandte Empfehlungen:

PHP-Bildbearbeitungsklasse, unterstützt das Generieren von Miniaturansichten, das Hinzufügen von Wasserzeichen und das Hochladen von Miniaturansichten

Leistungsstarke PHP-Bildverarbeitungsklasse

Was bedeuten Daumen? PHPThumb PHP-Miniaturansichtsgalerie

Das obige ist der detaillierte Inhalt vonPHP implementiert den Bildähnlichkeitsvergleich. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage