以图搜图

以图搜图


感知哈希算法

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'));


转载于:https://my.oschina.net/yonghan/blog/510621

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值