博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以图搜图
阅读量:6036 次
发布时间:2019-06-20

本文共 1722 字,大约阅读时间需要 5 分钟。

hot3.png

以图搜图

感知哈希算法

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

你可能感兴趣的文章
数论 - 最小乘法逆元
查看>>
企业架构研究总结(22)——TOGAF架构开发方法(ADM)之信息系统架构阶段
查看>>
接口测试(三)--HTTP协议简介
查看>>
周志华《机器学习》课后答案——第4章.决策树
查看>>
frameset分帧问题
查看>>
特殊样式:ime-mode禁汉字,tabindex焦点
查看>>
linux
查看>>
Layout父元素点击不到的解决办法
查看>>
【面试次体验】堆糖前端开发实习生
查看>>
基于apache实现负载均衡调度请求至后端tomcat服务器集群的实现
查看>>
C#+QQEmail自动发送邮件
查看>>
[Hadoop]MapReduce多输出
查看>>
Android Activity详解(一)
查看>>
快准车服完成3000万元A+轮融资,年底将开始B轮融资
查看>>
让我去健身的不是漂亮小姐姐,居然是贝叶斯统计!
查看>>
MySQL 数据约束
查看>>
我的友情链接
查看>>
SERVLET容器简介与JSP的关系
查看>>
《服务器SSH Public Key认证指南》-补充
查看>>
我的友情链接
查看>>