博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php怎么实现根据图片搜索图片功能
阅读量:2490 次
发布时间:2019-05-11

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

php爱好者 们很对php开发的追求是永不止步的,今天偶然想起来了 发下

php怎么实现相似图片的搜索呢?

其中的原理来解释下

1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

3、计算平均值。计算所有64个像素的灰度平均值。

4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。

使用代码

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个图片相似,否则不相似。

转载地址:http://tekrb.baihongyu.com/

你可能感兴趣的文章
经典SQL语句大全
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>
suse创建的虚拟机,修改ip地址
查看>>
linux的挂载的问题,重启后就挂载就没有了
查看>>
docker原始镜像启动容器并创建Apache服务器实现反向代理
查看>>
docker容器秒死的解决办法
查看>>
管理网&业务网的一些笔记
查看>>
openstack报错解决一
查看>>
openstack报错解决二
查看>>
linux source命令
查看>>
openstack报错解决三
查看>>
乙未年年终总结
查看>>
子网掩码
查看>>
第一天上班没精神
查看>>
启动eclipse报错:Failed to load the JNI shared library
查看>>