Php实现imagehash
PHP 实现 ImageHash
ImageHash 是一种用于图像相似度比较的技术,通过计算图像的哈希值来判断图像是否相似。以下是使用 PHP 实现 ImageHash 的方法。
安装依赖库
确保安装了 GD 库或 Imagick 扩展,用于图像处理。可以通过以下命令检查:
php -m | grep gd
如果未安装,可以通过以下方式安装:
sudo apt-get install php-gd # Debian/Ubuntu
sudo yum install php-gd # CentOS/RHEL
实现步骤
-
加载图像并转换为灰度图 使用 GD 库加载图像并将其转换为灰度图,以减少颜色对哈希计算的影响。

function loadImage($filePath) { $image = imagecreatefromstring(file_get_contents($filePath)); imagefilter($image, IMG_FILTER_GRAYSCALE); return $image; } -
调整图像大小 将图像调整为固定大小(如 8x8 或 16x16),以便统一计算哈希值。
function resizeImage($image, $width = 8, $height = 8) { $resized = imagecreatetruecolor($width, $height); imagecopyresampled($resized, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image)); return $resized; } -
计算平均像素值 遍历图像的每个像素,计算所有像素的平均值。

function calculateAveragePixelValue($image) { $width = imagesx($image); $height = imagesy($image); $total = 0; for ($y = 0; $y < $height; $y++) { for ($x = 0; $x < $width; $x++) { $rgb = imagecolorat($image, $x, $y); $total += ($rgb >> 16) & 0xFF; // 取红色通道作为灰度值 } } return $total / ($width * $height); } -
生成哈希值 将每个像素与平均像素值比较,生成二进制哈希字符串。
function generateHash($image, $average) { $width = imagesx($image); $height = imagesy($image); $hash = ''; for ($y = 0; $y < $height; $y++) { for ($x = 0; $x < $width; $x++) { $rgb = imagecolorat($image, $x, $y); $pixelValue = ($rgb >> 16) & 0xFF; $hash .= ($pixelValue > $average) ? '1' : '0'; } } return $hash; } -
计算汉明距离 比较两个哈希值的相似度,汉明距离越小,图像越相似。
function hammingDistance($hash1, $hash2) { $distance = 0; $length = min(strlen($hash1), strlen($hash2)); for ($i = 0; $i < $length; $i++) { if ($hash1[$i] != $hash2[$i]) { $distance++; } } return $distance; }
完整示例
以下是一个完整的示例代码,用于计算并比较两个图像的哈希值:
function imageHash($filePath, $size = 8) {
$image = loadImage($filePath);
$resized = resizeImage($image, $size, $size);
$average = calculateAveragePixelValue($resized);
$hash = generateHash($resized, $average);
imagedestroy($image);
imagedestroy($resized);
return $hash;
}
$hash1 = imageHash('image1.jpg');
$hash2 = imageHash('image2.jpg');
$distance = hammingDistance($hash1, $hash2);
echo "Hash1: $hash1\n";
echo "Hash2: $hash2\n";
echo "Hamming Distance: $distance\n";
注意事项
- 图像哈希适用于快速比较图像相似度,但不适用于精确匹配。
- 调整图像大小时,较小的尺寸(如 8x8)可以提高计算速度,但可能降低准确性。
- 汉明距离的阈值可以根据实际需求调整,通常距离小于 5 表示图像相似。




