常用图片指纹计算方式python版:https://blog..net/enter89/article/details/90293971
在本地电脑上测试5中不同的指纹计算算法
执行10000次时间(单位分钟):
均值哈希算法aHash:03.556553
差值哈希算法dHash:01.203760
感知哈希算法pHash:01.838117
三直方图算法:43.244584
单通道的直方图:11.793451
1、差值哈希算法
2、将图片缩放为98像素
3、获取像素点的灰度值
4、每行从第二个像素开始和该行的第一个参数对比,如果大于为1,小于为0
5、组成一个88=64为的二进制数字,即为该图的指纹
function dHash($src)
{
if (empty($src)) {
return false;
}
$w = 9;
$h = 8;
$dst = imagecreatetruecolor($w, $h);
//如果是图片目录
$img = imagecreatefromstring(file_get_contents($src));
//如果是数据库或者下载下来的二进制数据
$img = imagecreatefromstring($src);
$img && imagecopyresized($dst, $img, 0, 0, 0, 0, $w, $h, 132, 132);
$hash = '';
for ($y = 0; $y < $h; $y++) {
$pix = $this->getGray(imagecolorat($dst, 0, $y));
for ($x = 1; $x < $w; $x++) {
$_pix = $this->getGray(imagecolorat($dst, $x, $y));
$_pix > $pix ? $hash .= '1' : $hash .= '0';
$pix = $_pix;
}
}
return $hash;
}
function getGray($rgb)
{
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
return intval(($r + $g + $b) / 3) & 0xFF;
}