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

Python 相似圖片搜尋實戰:差值雜湊 (dHash) 建立圖片指紋資料庫

     編輯:更多程式設計知識

利用感知圖像雜湊 進行相似圖片檢測。本文採用 差值雜湊 (dHash) 演算法,建立圖片指紋資料庫,實現以圖搜圖功能。適用於濫用圖片攔截、重複圖片去重、反向圖片搜尋等場景。

核心概念

  • 圖片指紋:根據視覺內容計算的雜湊值,相似圖片產生相似雜湊。
  • dHash:比較相鄰像素亮度差異,生成 64-bit 雜湊,抗縮放、壓縮、微小編輯。
  • 漢明距離:兩雜湊不同位元數,距離越小越相似。

依賴套件


pip install pillow imagehash
# 自動安裝 numpy/scipy 依賴

步驟一:建立指紋索引


# index.py
from PIL import Image
import imagehash, argparse, shelve, glob

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True, help="輸入圖片資料夾")
ap.add_argument("-s", "--shelve", required=True, help="輸出 shelve 資料庫")
args = vars(ap.parse_args())

db = shelve.open(args["shelve"], writeback=True)

for path in glob.glob(args["dataset"] + "/*.jpg"):
    img = Image.open(path)
    h = str(imagehash.dhash(img))
    fname = path[path.rfind("/") + 1:]
    db[h] = db.get(h, []) + [fname]  # 同雜湊可能多檔

db.close()

python index.py --dataset images --shelve db.shelve

步驟二:查詢相似圖片


# search.py
from PIL import Image
import imagehash, argparse, shelve

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required=True)
ap.add_argument("-s", "--shelve", required=True)
ap.add_argument("-q", "--query", required=True, help="查詢圖片路徑")
args = vars(ap.parse_args())

db = shelve.open(args["shelve"])
query_img = Image.open(args["query"])
h = str(imagehash.dhash(query_img))
filenames = db.get(h, [])

print("Found {} images".format(len(filenames)))
for fname in filenames:
    Image.open(args["dataset"] + "/" + fname).show()

db.close()

python search.py --dataset images --shelve db.shelve --query images/test.jpg

實測結果

從 Caltech-101 隨機抽 17 張圖,各產生 N 張縮放變體。查詢任一變體,皆能精準找出同組其他變體,即使解析度不同、長寬比微調。

進階優化方向

  • 漢明距離搜尋:允許雜湊差異 ≤ k 位,發現近似但非完全相同圖片。
  • 索引結構優化:資料量大時,線性掃描過慢。引入 K-d Tree、VP Tree 將搜尋複雜度從 O(N) 降為次線性。
  • 多雜湊融合:結合 aHash、pHash、dHash 提升召回率。

應用場景

  • 使用者上傳內容審核(色情、暴力、版權圖片攔截)。
  • 個人相簿去重、雲端同步去重。
  • 電商商品圖片相似度推薦。
  • 版權監控:全網爬蟲比對原創圖片被盜用情況。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved