加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP实现的简易版图片相似度比较

发布时间:2020-12-13 02:19:55 所属栏目:PHP教程 来源:网络整理
导读:《PHP实现的简易版图片相似度比较》要点: 本文介绍了PHP实现的简易版图片相似度比较,希望对您有用。如果有疑问,可以联系我们。 由于相似图片搜索的php实现的 API 不怎么符合我的用途,所以我重新定义 API 的架构,改写成比拟简单的函数方式,虽然还是用对象

《PHP实现的简易版图片相似度比较》要点:
本文介绍了PHP实现的简易版图片相似度比较,希望对您有用。如果有疑问,可以联系我们。

由于相似图片搜索的php实现的 API 不怎么符合我的用途,所以我重新定义 API 的架构,改写成比拟简单的函数方式,虽然还是用对象的方式包装.
PHP实战

代码如下:

<?php???
/**??
* 图片相似度比拟??
*??
* @version???? $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $??
* @author????? jax.hu??
*??
* <code>??
*? //Sample_1??
*? $aHash = ImageHash::hashImageFile('wsz.11.jpg');??
*? $bHash = ImageHash::hashImageFile('wsz.12.jpg');??
*? var_dump(ImageHash::isHashSimilar($aHash,$bHash));??
*??
*? //Sample_2??
*? var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg','wsz.12.jpg'));??
* </code>??
*/???
???
class ImageHash {???
???
?? /**取样倍率 1~10??
??? * @access public??
??? * @staticvar int??
??? * */???
?? public static $rate = 2;???
???
?? /**相似度允许值 0~64??
??? * @access public??
??? * @staticvar int??
??? * */???
?? public static $similarity = 80;???
???
?? /**图片类型对应的开启函数??
??? * @access private??
??? * @staticvar string??
??? * */???
?? private static $_createFunc = array(???
?????? IMAGETYPE_GIF?? =>'imageCreateFromGIF',???
?????? IMAGETYPE_JPEG? =>'imageCreateFromJPEG',???
?????? IMAGETYPE_PNG?? =>'imageCreateFromPNG',???
?????? IMAGETYPE_BMP?? =>'imageCreateFromBMP',???
?????? IMAGETYPE_WBMP? =>'imageCreateFromWBMP',???
?????? IMAGETYPE_XBM?? =>'imageCreateFromXBM',???
?? );???
???
???
?? /**从文件建立图片??
??? * @param string $filePath 文件地址路径??
??? * @return resource 当成功开启图片则传递图片 resource ID,失败则是 false??
??? * */???
?? public static function createImage($filePath){???
?????? if(!file_exists($filePath)){ return false; }???
???
?????? /*判断文件类型是否可以开启*/???
?????? $type = exif_imagetype($filePath);???
?????? if(!array_key_exists($type,self::$_createFunc)){ return false; }???
???
?????? $func = self::$_createFunc[$type];???
?????? if(!function_exists($func)){ return false; }???
???
?????? return $func($filePath);???
?? }???
???
???
?? /**hash 图片??
??? * @param resource $src 图片 resource ID??
??? * @return string 图片 hash 值,失败则是 false??
??? * */???
?? public static function hashImage($src){???
?????? if(!$src){ return false; }???
???
?????? /*缩小图片尺寸*/???
?????? $delta = 8 * self::$rate;???
?????? $img = imageCreateTrueColor($delta,$delta);???
?????? imageCopyResized($img,$src,$delta,imagesX($src),imagesY($src));???
???
?????? /*计算图片灰阶值*/???
?????? $grayArray = array();???
?????? for ($y=0; $y<$delta; $y++){???
?????????? for ($x=0; $x<$delta; $x++){???
?????????????? $rgb = imagecolorat($img,$x,$y);???
?????????????? $col = imagecolorsforindex($img,$rgb);???
?????????????? $gray = intval(($col['red']+$col['green']+$col['blue'])/3)& 0xFF;???
???
?????????????? $grayArray[] = $gray;???
?????????? }???
?????? }???
?????? imagedestroy($img);???
???
?????? /*计算所有像素的灰阶平均值*/???
?????? $average = array_sum($grayArray)/count($grayArray);???
???
?????? /*计算 hash 值*/???
?????? $hashStr = '';???
?????? foreach ($grayArray as $gray){???
?????????? $hashStr .= ($gray>=$average) ? '1' : '0';???
?????? }???
???
?????? return $hashStr;???
?? }???
???
???
?? /**hash 图片文件??
??? * @param string $filePath 文件地址路径??
??? * @return string 图片 hash 值,失败则是 false??
??? * */???
?? public static function hashImageFile($filePath){???
?????? $src = self::createImage($filePath);???
?????? $hashStr = self::hashImage($src);???
?????? imagedestroy($src);???
???
?????? return $hashStr;???
?? }???
???
???
?? /**比拟两个 hash 值,是不是相似??
??? * @param string $aHash A图片的 hash 值??
??? * @param string $bHash B图片的 hash 值??
??? * @return bool 当图片相似则传递 true,否则是 false??
??? * */???
?? public static function isHashSimilar($aHash,$bHash){???
?????? $aL = strlen($aHash); $bL = strlen($bHash);???
?????? if ($aL !== $bL){ return false; }???
???
?????? /*计算容许落差的数量*/???
?????? $allowGap = $aL*(100-self::$similarity)/100;???
???
?????? /*计算两个 hash 值的汉明距离*/???
?????? $distance = 0;???
?????? for($i=0; $i<$aL; $i++){???
?????????? if ($aHash{$i} !== $bHash{$i}){ $distance++; }???
?????? }???
???
?????? return ($distance<=$allowGap) ? true : false;???
?? }???
???
???
?? /**比拟两个图片文件,是不是相似??
??? * @param string $aHash A图片的路径??
??? * @param string $bHash B图片的路径??
??? * @return bool 当图片相似则传递 true,否则是 false??
??? * */???
?? public static function isImageFileSimilar($aPath,$bPath){???
?????? $aHash = ImageHash::hashImageFile($aPath);???
?????? $bHash = ImageHash::hashImageFile($bPath);???
?????? return ImageHash::isHashSimilar($aHash,$bHash);???
?? }???
???
}?

欢迎参与《PHP实现的简易版图片相似度比较》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读