php 怎么实现根据图片搜索图片功能
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);