ホームページ  >  記事  >  バックエンド開発  >  PHP で実装された画像類似性比較の簡易バージョン、_PHP チュートリアル

PHP で実装された画像類似性比較の簡易バージョン、_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:09:551340ブラウズ

PHPで実装された画像類似性比較の簡易版、

類似画像検索用に PHP で実装された API は私の目的にはあまり適していないため、API の構造を再定義し、オブジェクト形式でパッケージ化されていますが、比較的単純な関数メソッドに書き直しました。

コードをコピーします コードは次のとおりです:

/**  
* 画像電影上度画像
*
* @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $
* @著者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
**/
   パブリック静的 $similarity = 80;   
   
   /**画像タイプに応じたオープニング関数
*@アクセス非公開
* @staticvar 文字列
**/
   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 画像が正常に開けた場合は画像リソース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);   
       imageCopyResize($img,$src, 0,0,0,0, $delta,$delta,imagesX($src),imagesY($src));   
   
/*画像のグレースケール値を計算します*/
$grayArray = array();
for ($y=0; $y for ($x=0; $x $rgb = imagecolorat($img,$x,$y); $col = imagecolorsforindex($img, $rgb); $gray = intval(($col['red']+$col['green']+$col['blue'])/3)& 0xFF;

$grayArray[] = $gray;                                                                                                                                              画像破壊($img);
/*すべてのピクセルのグレースケール平均を計算します*/
$average = array_sum($grayArray)/count($grayArray);

/*ハッシュ値を計算*/
$hashStr = '';
foreach ($grayArray として $gray){
$hashStr .= ($gray>=$average) '1' : '0';                                                                     
return $hashStr; }


/**ハッシュ画像ファイル
* @param string $filePath ファイルアドレスパス
* @return 文字列画像ハッシュ値、失敗した場合は false
**/
パブリック静的関数 hashImageFile($filePath){
$src = self::createImage($filePath);
$hashStr = self::hashImage($src);
imagedestroy($src);
return $hashStr; }


/**2 つのハッシュ値を比較して、類似しているかどうかを確認します
* @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::$類似度)/100;

/*2 つのハッシュ値のハミング距離を計算します*/
$ distance = 0;
for($i=0; $i If ($aHash{$i} !== $bHash{$i}){ $ distance++ }
                                                                    
return ($ distance<=$allowGap) ? true : false; }


/**2 つの画像ファイルを比較して、類似しているかどうかを確認します
* @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);
}

}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/939420.html技術記事 PHPで実装した画像類似度の簡易版の比較 PHPで実装した類似画像検索用のAPIがあまり用途に合わないため、APIの構造を再定義してよりシンプルなものに書き直しました...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。