ホームページ  >  記事  >  バックエンド開発  >  PHP画像類似性コード例

PHP画像類似性コード例

WBOY
WBOYオリジナル
2016-07-25 08:52:061810ブラウズ
  1. /**

  2. * 画像の類似性比較
  3. *
  4. * @version $Id: ImageHash.php 4429 2012-04-17 13:20:31Z jax $
  5. * @authorjax.hu
  6. * www.osxue.com
  7. *//Sample_1
  8. *$aHash = ImageHash::hashImageFile('wsz.11.jpg');
  9. *$bHash = ImageHash::hashImageFile('wsz.12.jpg');
  10. *var_dump(ImageHash::isHashSimilar($aHash, $bHash));
  11. *
  12. *//Sample_2
  13. *var_dump(ImageHash::isImageFileSimilar('wsz.11.jpg', 'wsz.12.jpg'));
  14. *
  15. */

  16. class ImageHash {

  17. /**サンプリングレート 1~10
  18. * @access public
  19. * @staticvar int
  20. **/
  21. public static $rate = 2;

  22. /**類似性の許容値 0~64

  23. * @access public
  24. * @staticvar int
  25. **/
  26. public static $similarity = 80;

  27. /**画像タイプに対応したオープニング関数

  28. * @access private
  29. * @staticvar string
  30. **/
  31. private static $_createFunc = array(
  32. IMAGETYPE_GIF =>'imageCreateFromGIF',
  33. IMAGETYPE_JPEG=>'imageCreateFromJPEG',
  34. IMAGETYPE_PNG =>'imageCreateFromPNG',
  35. IMAGETYPE_BMP =>'imageCreateFromB MP ',
  36. IMAGETYPE_WBMP=>'imageCreateFromWBMP',
  37. IMAGETYPE_XBM =>'imageCreateFromXBM',
  38. );

  39. /**ファイルから画像を作成する

  40. * @param string $filePath ファイルアドレス パス
  41. * @return resource 画像が正常に開くと画像リソース ID が渡され、失敗すると false になります
  42. **/
  43. public static function createImage($filePath) {
  44. if(!file_exists($filePath)){ return false; }

  45. /* 文件型が可能かどうか判断します*/

  46. $type = exif_imagetype($filePath);
  47. if(!array_key_exists($type,self::$_createFunc)){ return false; }

  48. $func = self::$_createFunc[$type];

  49. if(!function_exists($func)){ return false; }

  50. return $func($filePath);

  51. }

  52. /**ハッシュ画像

  53. * @param resource $src image リソース ID
  54. * @return string 画像ハッシュ値、失敗した場合は false
  55. **/
  56. public static function hashImage($src){
  57. if(!$src){ return false; }

  58. /*缩小图片尺寸*/

  59. $delta = 8 * self::$rate;
  60. $img = imageCreateTrueColor($delta,$delta);
  61. imageCopyResize($img,$src, 0,0,0,0, $デルタ,$デルタ,画像X($src),画像Y($src));

  62. /*計算図片灰阶值*/

  63. $grayArray = array();
  64. for ($y=0; $y for ($x=0; $x $rgb = imagecolorat($img,$x,$y);
  65. $col = imagecolorsforindex($img, $rgb);
  66. $gray = intval(($col['red']+$col[ 'green']+$col['blue'])/3)& 0xFF;

  67. $grayArray[] = $gray;

  68. }
  69. }
  70. imagedestroy($img);

  71. /* すべての画素の灰平均値を計算します*/

  72. $average = array_sum($grayArray)/count($grayArray);

  73. /*计算ハッシュ值*/

  74. $hashStr = '';
  75. foreach ($grayArray as $gray){
  76. $hashStr .= ($gray>=$average) ? '1' : '0';
  77. }
  78. return $hashStr;
  79. }

  80. /**ハッシュ画像ファイル

  81. * @param string $filePath ファイル アドレス パス
  82. * @return string 画像ハッシュ値、失敗した場合は false
  83. **/
  84. public static function hashImageFile($filePath){
  85. $src = self::createImage($filePath);
  86. $hashStr = self::hashImage($src);
  87. imagedestroy($src) ;

  88. return $hashStr;

  89. }

  90. /**2 つのハッシュ値を比較して似ているかどうかを確認します

  91. * @param string $aHash 写真 A のハッシュ値
  92. * @param string $bHash 写真 B のハッシュ値
  93. * @return bool 写真が似ている場合、true渡されます。それ以外の場合は false
  94. **/
  95. パブリック静的関数 isHashSimilar($aHash, $bHash){
  96. $aL = strlen($aHash); $bL = strlen($bHash);
  97. if ($aL !== $bL){ return false; }

  98. /*計算許容落差の数*/

  99. $allowGap = $aL*(100-self::$similarity)/100;

  100. /*2 つのハッシュ値を計算します*/

  101. $ distance = 0;
  102. for($i=0; $i if ($aHash{$i} !== $ bHash{$i}){ $ distance++; }
  103. }

  104. return ($ distance<=$allowGap) ? true : false;

  105. }

  106. /**2 つの画像ファイルを比較して、似ているかどうかを確認します

  107. * @param string $aHash 画像 A のパス
  108. * @param string $bHash 画像 B のパス
  109. * @return bool 画像が似ている場合は true が渡され、そうでない場合は嘘
  110. **/
  111. public static function isImageFileSimilar($aPath, $bPath){
  112. $aHash = ImageHash::hashImageFile($aPath);
  113. $bHash = ImageHash: :hashImageFile($bPath);
  114. return ImageHash::isHashSimilar($aHash, $bHash);
  115. }
  116. }>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。