The advantage of perceptual hashing is that it is simple and fast, not affected by the size of the picture, and the disadvantage is that the contents of the picture cannot be changed. In practical applications, more powerful phash algorithms and sift algorithms are often used to identify the deformation of images. As long as the degree of deformation does not exceed 25%, they can match the original image.
Perceptual hashing algorithm
Count < = 5 Match most similar
Count > 102 Different pictures
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 ($src 1, $src 2) {static $self; if (! $self) $self = new Static; if (!is_file ($src 1) | |!is_file ($SRC 2)) exit (Self::file_not_found); $hash 1 = $self->gethashvalue ($src 1); $hash 2 = $self->gethashvalue ($src 2); if (strlen ($hash 1)!== strlen ($hash 2)) return false; $count = 0; $len = strlen ($hash 1); for ($i = 0; $i < $len; $i + +) if ($hash 1[$i]!== $hash 2[$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; The 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 '));
Method Two:
hash ($f); } return $isString? $result [0]: $result; The 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; The 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; The 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) & 0xF F if (!is_array ($array [$y])) {$array [$y] = array (); } $array [$y] [$x] = $gray; $total + = $gray; }} $average = Intval ($total/(* $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; SW Itch ($ext) {case ' png ': $img = Imagecreatefrompng ($file); Case ' jpg ': $img = Imagecreatefromjpeg ($file); Case ' gif ': $img = Imagecreatefromgif ($file); } return $img; The Public Function Getfileext ($file) {$infos = explode ('. ', $file); $ext = Strtolower ($infos [Count ($infos)-1]); return $e xt }}
The method is called as follows:
Require_once "Imghash.class.php"; $instance = Imghash::getinstance (); $result = $instance->checkissimilarimg (' Chenyin/img_3214.png ', ' chenyin/img_3212.jpg ');
If the $result value is true, it indicates that 2 pictures are similar, otherwise not similar.
Summary: the above is the entire content of this article, I hope to be able to help you learn.
Related recommendations:
PHP (iterative + recursive) implementation of infinite level classification
A detailed example of a single case model and factory model in PHP
PHP under the MONGODB Connection remote database detailed and case