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);
}
}
http://www.bkjia.com/PHPjc/939420.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/939420.html技術記事 PHPで実装した画像類似度の簡易版の比較 PHPで実装した類似画像検索用のAPIがあまり用途に合わないため、APIの構造を再定義してよりシンプルなものに書き直しました...