PHP实现的简易版图片相似度比较
发布时间:2020-12-13 02:19:55 所属栏目:PHP教程 来源:网络整理
导读:《PHP实现的简易版图片相似度比较》要点: 本文介绍了PHP实现的简易版图片相似度比较,希望对您有用。如果有疑问,可以联系我们。 由于相似图片搜索的php实现的 API 不怎么符合我的用途,所以我重新定义 API 的架构,改写成比拟简单的函数方式,虽然还是用对象
《PHP实现的简易版图片相似度比较》要点: 由于相似图片搜索的php实现的 API 不怎么符合我的用途,所以我重新定义 API 的架构,改写成比拟简单的函数方式,虽然还是用对象的方式包装.
代码如下:
<?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为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |