>  기사  >  백엔드 개발  >  PHP_php 기술로 구현된 단순 버전의 이미지 유사성 비교

PHP_php 기술로 구현된 단순 버전의 이미지 유사성 비교

WBOY
WBOY원래의
2016-05-16 20:26:191018검색

유사 이미지 검색을 위해 PHP에 구현된 API는 제 목적에 별로 적합하지 않기 때문에, 여전히 객체 형태로 패키징되어 있지만 API 구조를 다시 정의하고 비교적 간단한 함수 방식으로 다시 작성했습니다.

코드 복사 코드는 다음과 같습니다.

/**  
* 图image图image可以titude可以  
*  
* @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $
* @author jax.hu
*  
* <코드>  
*  //샘플_1  
*  $aHash = ImageHash::hashImageFile('wsz.11.jpg');  
* $bHash = ImageHash::hashImageFile('wsz.12.jpg');  
*  var_dump(ImageHash::isHashSimilar($aHash, $bHash));  
*  
*  //샘플_2  
*  var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg', 'wsz.12.jpg'));  
*   
*/   
   
클래스 ImageHash {   
   
   /**샘플링 레이트 1~10
* @접속 공개
* @staticvar int
**/   
   공개 정적 $rate = 2;   
   
   /**유사성 허용값 0~64
* @접속 공개
* @staticvar int
**/   
   공개 정적 $ 유사성 = 80;   
   
   /**이미지 유형에 해당하는 열기 기능
* @액세스 프라이빗
* @staticvar 문자열
**/   
   개인 정적 $_createFunc = 배열(   
       IMAGETYPE_GIF   =>'imageCreateFromGIF',   
       IMAGETYPE_JPEG  =>'imageCreateFromJPEG',   
       IMAGETYPE_PNG   =>'imageCreateFromPNG',   
       IMAGETYPE_BMP   =>'imageCreateFromBMP',   
       IMAGETYPE_WBMP  =>'imageCreateFromWBMP',   
       IMAGETYPE_XBM   =>'imageCreateFromXBM',   
   );   
   
   
   /**파일에서 이미지 생성
* @param string $filePath 파일 주소 경로
* @return 리소스 이미지가 성공적으로 열리면 이미지 리소스 ID가 전달되고, 실패하면 false
**/   
   공개 정적 함수 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; }   
   
       $func($filePath)를 반환합니다.   
   }   
   
   
   /**해시 이미지
* @param 리소스 $src 이미지 리소스 ID
* @return 문자열 이미지 해시 값, 실패하면 false
**/   
   공개 정적 함수 hashImage($src){   
       if(!$src){ false를 반환합니다. }   
   
       /*缩小图文尺寸*/   
       $delta = 8 * self::$rate;   
       $img = imageCreateTrueColor($delta,$delta);   
       imageCopyReised($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));   
   
​ ​ /*이미지의 회색조 값 계산*/  
            $grayArray = array();                                           ($y=0; $y<$delta; $y ){
($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[] = $회색
~ ~ 이미지파괴($img)
 
​ ​ /*모든 픽셀의 회색조 평균을 계산합니다*/  
          $average = array_sum($grayArray)/count($grayArray);                                                
            /*해시 값 계산*/                                                                           $hashStr = '';                                               foreach($grayArray를 $gray로){
               $hashStr .= ($gray>=$average) ? '1' : '0'; ~  
         $hashStr 반환;                                     }  
 
 
/**해시 이미지 파일
* @param string $filePath 파일 주소 경로
* @return 문자열 이미지 해시 값, 실패하면 false
**/ 
공개 정적 함수 hashImageFile($filePath){
            $src = self::createImage($filePath);                                                               $hashStr = self::hashImage($src);                                                 이미지파괴($src)
 
         $hashStr 반환;                                 }  
 
 
/**두 개의 해시 값을 비교하여 유사한지 확인하세요
* @param string $aHash A 사진의 해시 값
* @param string $bHash B 사진의 해시값
* @return bool 그림이 유사하면 true를 전달하고, 그렇지 않으면 false를 전달합니다
**/ 
공개 정적 함수 isHashSimilar($aHash, $bHash){
$aL = strlen($aHash); $bL = strlen($bHash)
If ($aL !== $bL){ return false }
 
​ ​ /*허용 간격 계산*/  
          $allowGap = $aL*(100-self::$similarity)/100;                                                
​ ​ /*두 해시 값의 해밍 거리 계산*/  
          $distance = 0;                                               for($i=0; $i<$aL; $i ){
If ($aHash{$i} !== $bHash{$i}){ $distance }
~  
              반환($distance<=$allowGap) ? true: false;                                       }  
 
 
/**두 개의 이미지 파일을 비교하여 유사한지 확인
* @param string $aHash 사진 경로
* @param string $bHash B 사진 경로
* @return bool 그림이 유사하면 true를 전달하고, 그렇지 않으면 false를 전달합니다
    * */    공개 정적 함수 isImageFileSimilar($aPath, $bPath){   
       $aHash = ImageHash::hashImageFile($aPath);           $bHash = ImageHash::hashImageFile($bPath);           return ImageHash::isHashSimilar($aHash, $bHash);       }     }
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.