import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim
import osdef is_similar(image1, image2, threshold=0.95):'''對圖像的顏色信息敏感,能快速計算。對圖像的旋轉、縮放等幾何變換不敏感。缺點:對圖像的結構、紋理等信息不敏感。不能很好地處理圖像的局部變化或噪聲。'''# 將圖像轉換為灰度圖像image1_gray = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)image2_gray = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# 計算直方圖hist1 = cv2.calcHist([image1_gray], [0], None, [256], [0, 256])hist2 = cv2.calcHist([image2_gray], [0], None, [256], [0, 256])# 歸一化直方圖cv2.normalize(hist1, hist1, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)cv2.normalize(hist2, hist2, alpha=0, beta=1, norm_type=cv2.NORM_MINMAX)# 計算相似度similarity = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)print("similarity",similarity)# return similarity > threshold
def calculate_ssim(image1, image2):'''結構相似性指數(Structural Similarity Index, SSIM):優點:綜合考慮了亮度、對比度和結構信息,能夠更好地反映人類視覺感知。對局部變化和噪聲有較好的魯棒性。缺點:計算復雜度較高,速度較慢。對大范圍的幾何變換不敏感。適用場景:適用于需要精確比較圖像結構信息的場景,如圖像壓縮質量評估、圖像增強效果評估等醫學圖像分析。'''# Convert images to grayscalegray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# Calculate SSIMssim_score, _ = ssim(gray1, gray2, full=True)# print("calculate_ssim",ssim_score)return ssim_score
def calculate_mae(image1, image2):'''均值絕對誤差(Mean Absolute Error, MAE):優點:簡單直接,計算像素值的絕對差異。對圖像的整體亮度變化敏感。缺點:對圖像的幾何變換(如平移、旋轉、縮放)敏感。不能很好地處理局部變化和噪聲。適用場景:適用于對整體亮度或顏色變化敏感的場景,如醫學圖像分析、監控圖像等。'''# Convert images to grayscalegray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)# Calculate Mean Absolute Error (MAE)mae = np.mean(np.abs(gray1 - gray2))# print("mae",mae) #0到255 越小越來約相似return mae