首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 實現圖片相似度比較:感知哈希算法實戰

     編輯:PHP 綜合知識

前言

在開發圖片搜索或去重功能時,常需要判斷兩張圖片是否相似。現有的 PHP 擴展或 API 可能過於複雜,不符合輕量級項目需求。本文介紹一個基於感知哈希的 ImageHash 類,提供簡單易用的靜態方法,支援多種圖片格式,並可調整採樣率與相似度閾值。

核心原理

  1. 縮放與灰度化:將圖片縮放至固定大小(預設 16×16),轉為灰度值。
  2. 計算平均灰度:統計所有像素的平均亮度。
  3. 生成哈希指紋:每個像素與平均值比較,大於等於為 1,否則為 0,組成 256 位二進制字串。
  4. 漢明距離比較:兩個哈希值對應位不同的數量即為漢明距離;距離小於容許閾值則判定為相似。

類結構與關鍵參數

class ImageHash {
    public static $rate = 2;        // 採樣倍率 1~10,影響縮放尺寸 (8*rate)
    public static $similarity = 80; // 相似度閾值 0~100,允許的最大差異百分比

    // 內部映射:圖片類型 => GD 開啟函數
    private static $_createFunc = [ ... ];
    ...
}

主要方法說明

方法用途
createImage($filePath)根據副檔名/MIME 呼叫對應的 imagecreatefrom* 函數,回傳 GD 資源或 false。
hashImage($src)對 GD 資源執行縮放、灰度、平均值、哈希生成,回傳 256 字元的 '0'/'1' 字串。
hashImageFile($filePath)封裝開啟→哈希→銷毀資源,直接由檔案路徑取得哈希值。
isHashSimilar($aHash, $bHash)計算漢明距離,判斷是否在 $similarity 允許範圍內。
isImageFileSimilar($aPath, $bPath)一鍵比較兩個圖片檔案是否相似。

使用範例

<?php
require_once 'ImageHash.php';

// 範例 1:先取得哈希再比較
$aHash = ImageHash::hashImageFile('photo1.jpg');
$bHash = ImageHash::hashImageFile('photo2.jpg');
var_dump(ImageHash::isHashSimilar($aHash, $bHash)); // bool(true/false)

// 範例 2:直接比較兩個檔案
var_dump(ImageHash::isImageFileSimilar('photo1.jpg', 'photo2.jpg'));

// 調整靈敏度(可選)
ImageHash::$rate = 3;        // 更精細採樣
ImageHash::$similarity = 85; // 更嚴格相似度
?>

效能與注意事項

  • 時間複雜度 O(N) 其中 N = (8*rate)²,預設 256 像素,極快。
  • 需啟用 GD 擴展並支援對應圖片格式(JPEG, PNG, GIF, BMP, WBMP, XBM)。
  • 對於旋轉、裁剪、輕微色調變化有較好魯棒性;大幅構圖改變可能誤判。
  • 若需更高精度,可考慮 DCT 基礎的 pHash,但計算成本較高。

總結

ImageHash 類以極簡代碼實用化了感知哈希算法,適合中小型專案快速集成圖片去重、相似推薦等功能。透過調整 $rate 與 $similarity 可在速度與準確度間取得平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved