Как определить сходство двух изображений


/ Published in: PHP
Save to your folder(s)

Класс для сравнения двух изображений. Возвращает расстояние Хэмминга. Подробнее можно почитать здесь: http://habrahabr.ru/blogs/image_processing/120562/


Copy this code and paste it in your HTML
  1. class Hamming
  2. {
  3. private function _resizeImage($from_file, $to_file, $width, $height, $quality)
  4. {
  5. $img1 = imagecreatefromjpeg($from_file);
  6. $img2 = imagecreatetruecolor($width, $height);
  7.  
  8. imagecopyresampled($img2, $img1, 0, 0, 0, 0, $width, $height, imagesx($img1), imagesy($img1));
  9.  
  10. imagejpeg($img2, $to_file, $quality);
  11.  
  12. imagedestroy($img1);
  13. imagedestroy($img2);
  14. }
  15.  
  16. private function _grayScaleImage($filename)
  17. {
  18. $img_size = getimagesize($filename);
  19. $width = $img_size[0];
  20. $height = $img_size[1];
  21. $img = imagecreate($width,$height);
  22.  
  23. for ($c = 0; $c < 256; $c++)
  24. {
  25. imagecolorallocate($img, $c, $c, $c);
  26. }
  27.  
  28. $img2 = imagecreatefromjpeg($filename);
  29. imagecopymerge($img,$img2,0,0,0,0, $width, $height, 100);
  30. imagejpeg($img, $filename);
  31. imagedestroy($img);
  32. }
  33.  
  34. private function _getPixelValue($filename, $x, $y)
  35. {
  36. $image = imagecreatefromjpeg($filename);
  37. $color = imagecolorat($image, $x, $y);
  38. $r = ($color >> 16) & 0xFF;
  39. $g = ($color >> 8) & 0xFF;
  40. $b = $color & 0xFF;
  41.  
  42. imagedestroy($image);
  43.  
  44. return array('r'=>$r, 'g'=>$g, 'b'=>$b);
  45. }
  46.  
  47. private function _getChainOfBits($image)
  48. {
  49. $tmpfile = sys_get_temp_dir() . uniqid(md5(rand()), true) . '.jpg';
  50. $this->_resizeImage($image, $tmpfile, 8, 8, 100);
  51. $this->_grayScaleImage($tmpfile);
  52.  
  53. $a = array();
  54. for($i=0; $i<8; $i++)
  55. {
  56. for($j=0; $j<8; $j++)
  57. {
  58. $rgb = $this->_getPixelValue($tmpfile, $i, $j);
  59. $a[] = $rgb['r'];
  60. }
  61. }
  62. $avrg = (int)(array_sum($a) / count($a));
  63.  
  64. $s = '';
  65. foreach ($a as $value)
  66. {
  67. $s .= ($value > $avrg ? '0' : '1');
  68. }
  69. unlink($tmpfile);
  70.  
  71. return $s;
  72. }
  73.  
  74. public function getDistance($image1, $image2)
  75. {
  76. $bits1 = $this->_getChainOfBits($image1);
  77. $bits2 = $this->_getChainOfBits($image2);
  78.  
  79. $distance = 0;
  80. for($i=0; $i<64; $i++)
  81. {
  82. $bit1 = $bits1[$i];
  83. $bit2 = $bits2[$i];
  84.  
  85. if ( $bit1 != $bit2 )
  86. {
  87. $distance++;
  88. }
  89. }
  90.  
  91. return $distance;
  92. }
  93. }
  94.  
  95.  
  96. $hamming = new Hamming();
  97. $distance = $hamming->getDistance('image-1.jpg', 'image-2.jpg');
  98.  
  99. echo $distance;

URL: http://habrahabr.ru/blogs/image_processing/120562/

Report this snippet


Comments

RSS Icon Subscribe to comments

You need to login to post a comment.