您的位置:首页 > 编程语言 > PHP开发

php怎么实现根据图片搜索图片功能

2014-02-22 20:42 351 查看
php怎么实现相似图片的搜索呢?

其中的原理来解释下

1、缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

2、简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。

3、计算平均值。计算所有64个像素的灰度平均值。

4、比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。

5、计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。

使用代码

hash($f);

}

return $isString ? $result[0] : $result;

}

public function checkIsSimilarImg($imgHash, $otherImgHash){

if (file_exists($imgHash) && file_exists($otherImgHash)){

$imgHash = $this->run($imgHash);

$otherImgHash = $this->run($otherImgHash);

}

if (strlen($imgHash) !== strlen($otherImgHash)) return false;

$count = 0;

$len = strlen($imgHash);

for($i=0;$i<$len;$i++){

if ($imgHash{$i} !== $otherImgHash{$i}){

$count++;

}

}

return $count <= (5 * $rate * $rate) ? true : false;

}

public function hash($file){

if (!file_exists($file)){

return false;

}

$height = 8 * $this->rate;

$width = 8 * $this->rate;

$img = imagecreatetruecolor($width, $height);

list($w, $h) = getimagesize($file);

$source = $this->createImg($file);

imagecopyresampled($img, $source, 0, 0, 0, 0, $width, $height, $w, $h);

$value = $this->getHashValue($img);

imagedestroy($img);

return $value;

}

public function getHashValue($img){

$width = imagesx($img);

$height = imagesy($img);

$total = 0;

$array = array();

for ($y=0;$y<$height;$y++){

for ($x=0;$x<$width;$x++){

$gray = ( imagecolorat($img, $x, $y) >> 8 ) & 0xFF;

if (!is_array($array[$y])){

$array[$y] = array();

}

$array[$y][$x] = $gray;

$total += $gray;

}

}

$average = intval($total / (64 * $this->rate * $this->rate));

$result = '';

for ($y=0;$y<$height;$y++){

for ($x=0;$x<$width;$x++){

if ($array[$y][$x] >= $average){

$result .= '1';

}else{

$result .= '0';

}

}

}

return $result;

}

public function createImg($file){

$ext = $this->getFileExt($file);

if ($ext === 'jpeg') $ext = 'jpg';

$img = null;

switch ($ext){

case 'png' : $img = imagecreatefrompng($file);break;

case 'jpg' : $img = imagecreatefromjpeg($file);break;

case 'gif' : $img = imagecreatefromgif($file);

}

return $img;

}

public function getFileExt($file){

$infos = explode('.', $file);

$ext = strtolower($infos[count($infos) - 1]);

return $ext;

}

}

调用方式如下:

require_once "Imghash.class.php";

$instance = ImgHash::getInstance();

$result = $instance->checkIsSimilarImg('chenyin/IMG_3214.png', 'chenyin/IMG_3212.JPG');

如果$result值为true, 则表明2个图片相似,否则不相似。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: