計算圖片相似度的應用很廣泛,如google、baidu、360等搜索引擎以圖搜圖的功能就是其典型應用
相似圖像去重一般分爲如下兩個步驟
1、圖像特徵表達的提取
2、圖像之間相似度計算兩個主要步驟。
對於圖像特徵表達的提取,常見的手工設計特徵有顏色、紋理、HOG、SIFT 和 SURF 等;此外基於深度學習的深層特徵表達也經常被使用。對於圖像之間相似度計算,常見的無監督距離度量方法有歐式距離、曼哈頓距離和餘弦距離等;常見的有監督距離度量方法有 LMNN、KISSME、LFDA 和 MFA 等。然而這些方法基於浮點特徵計算相似度,計算速度普遍較慢,因
此通過哈希學習方法將圖像特徵轉換爲二元編碼,再利用漢明距離進行相似度的快速計算更加符合工業界對圖像數據處理速度的要求。對於相同/相似圖像,大部分全局特徵(比如顏色、紋理和 HOG)不能很好地解決圖像裁剪殘缺和旋轉變化等問題;一些局部特徵(比如 SIFT 和 SURF)與基於深度學習的特徵雖然表達效果較好,但是由於特徵提取複雜,計算速度過於緩慢。針對以上特徵提取方法存在的缺陷,我們採用一種快速特徵點提取和描述算法 ORB 作爲圖像的特徵表達,並使用漢明距離完成相似度計算。
ORB 特徵具有以下優點:
1、特徵提取速度快;
2、在大多數情況下,去重效果能夠與 SIFT/SURF 持平;
3、提取的特徵直接是二元編碼形式,無需使用哈希學習方法就可以直接利用漢明距離快速計算相似度。
# -*- encoding=utf-8 -*-
import cv2
# 自定義計算兩個圖片相似度函數
def img_similarity(img1_path,img2_path):
"""
:param img1_path: 圖片1路徑
:param img2_path: 圖片2路徑
:return: 圖片相似度
"""
try:
# 讀取圖片
img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)
# 初始化ORB檢測器
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# 提取並計算特徵點
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
# knn篩選結果
matches = bf.knnMatch(des1, trainDescriptors=des2, k=2)
# 查看最大匹配點數目
good = [m for (m, n) in matches if m.distance < 0.75 * n.distance]
print(len(good))
print(len(matches))
similary = len(good) / len(matches)
print("兩張圖片相似度爲:%s" % similary)
return similary
except:
print('無法計算兩張圖片相似度')
return '0'
if __name__ == '__main__':
img1_path=r'F:\img_spam\test\7ba.jpg'
img2_path=r'F:\img_spam\test\ba.jpg'
similary=img_similarity(img1_path,img2_path)
7ba.jpg
ba.jpg
E:\laidefa\python.exe F:/文本標籤/圖片反垃圾/ORB算法計算圖片相似度.py
466
478
兩張圖片相似度爲:0.9748953974895398
Process finished with exit code 0