1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import cv2
- import numpy as np
- import imagehash
- from PIL import Image
- from skimage.metrics import structural_similarity as ssim
- # 色度直方图相似度
- def calculate_color_histogram_similarity(image_path1, image_path2):
- # 读取图像
- img1 = cv2.imread(image_path1)
- img2 = cv2.imread(image_path2)
- # 将图像转换为 HSV 色彩空间
- hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
- hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
- # 计算色度直方图
- hist1 = cv2.calcHist([hsv1], [0, 1], None, [50, 60], [0, 180, 0, 256])
- hist2 = cv2.calcHist([hsv2], [0, 1], None, [50, 60], [0, 180, 0, 256])
- # 归一化直方图
- hist1 = cv2.normalize(hist1, hist1).flatten()
- hist2 = cv2.normalize(hist2, hist2).flatten()
- # 计算相似性
- correlation = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
- chi_square = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CHISQR)
- intersection = cv2.compareHist(hist1, hist2, cv2.HISTCMP_INTERSECT)
- bhattacharyya = cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA)
- return correlation, chi_square, intersection, bhattacharyya
- # SIFT特征相似度
- def feature_matching(img1_path, img2_path):
- img1 = cv2.imread(img1_path, cv2.IMREAD_GRAYSCALE)
- img2 = cv2.imread(img2_path, cv2.IMREAD_GRAYSCALE)
-
- # 初始化SIFT检测器
- sift = cv2.SIFT_create()
- kp1, des1 = sift.detectAndCompute(img1, None)
- kp2, des2 = sift.detectAndCompute(img2, None)
-
- # FLANN匹配器
- FLANN_INDEX_KDTREE = 1
- index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
- search_params = dict(checks=50)
- flann = cv2.FlannBasedMatcher(index_params, search_params)
-
- matches = flann.knnMatch(des1, des2, k=2)
-
- # 筛选优质匹配
- good = []
- for m, n in matches:
- if m.distance < 0.7 * n.distance:
- good.append(m)
-
- return len(good) / min(len(kp1), len(kp2)) # 归一化匹配率
- # 感知相似度
- def phash_similarity(img1_path, img2_path):
- hash1 = imagehash.phash(Image.open(img1_path))
- hash2 = imagehash.phash(Image.open(img2_path))
- return 1 - (hash1 - hash2) / len(hash1.hash) ** 2 # 归一化为0-1
- # SSIM相似度
- def compare_ssim(img1_path, img2_path):
- img1 = cv2.resize(cv2.imread(img1_path), (256, 256))
- img2 = cv2.resize(cv2.imread(img2_path), (256, 256))
- # 转换为灰度图
- gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
- gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
- # 计算 SSIM
- score, _ = ssim(gray1, gray2, full=True)
- return score
- if __name__ == '__main__':
- # 示例用法
- image_path1 = '/data/data/luosy/project/oral/data/key_frame/frame_001.jpg'
- image_path2 = '/data/data/luosy/project/oral/data/key_frame/frame_002.jpg'
- similarity_scores = calculate_color_histogram_similarity(image_path1, image_path2)
- print(f'相似性(⬆): {similarity_scores[0]}')
- print(f'卡方(⬇): {similarity_scores[1]}')
- print(f'交集(⬆): {similarity_scores[2]}')
- print(f'巴氏距离(⬇): {similarity_scores[3]}')
- match_ratio = feature_matching(image_path1, image_path2)
- print(f"特征点匹配率: {match_ratio:.4f}")
- print("pHash Similarity:", phash_similarity(image_path1, image_path2))
- print("SSIM:", compare_ssim(image_path1, image_path2))
|