对比图片相似度, 相似度越接近1 表示相似度越高,

 1import cv2
 2import numpy as np
 3from scipy.ndimage import gaussian_filter
 4
 5def load_image_grayscale(image_path):
 6    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
 7    if img is None:
 8        raise ValueError(f"无法读取图像: {image_path}")
 9    img = img.astype(np.float64) / 255.0
10    
11    return img
12
13def compute_statistics(img1, img2, window_size=11, sigma=1.5):
14    mu1 = gaussian_filter(img1, sigma=sigma)
15    mu2 = gaussian_filter(img2, sigma=sigma)
16    
17    sigma1_sq = gaussian_filter(img1 ** 2, sigma=sigma) - mu1 ** 2
18    sigma2_sq = gaussian_filter(img2 ** 2, sigma=sigma) - mu2 ** 2
19    
20    
21    
22    sigma12 = gaussian_filter(img1 * img2, sigma=sigma) - mu1 * mu2
23    
24    
25    return mu1, mu2, sigma1_sq, sigma2_sq, sigma12
26
27def calculate_ssim(img1, img2, window_size=11, sigma=1.5, K1=0.01, K2=0.03, L=1.0):
28    mu1, mu2, sigma1_sq, sigma2_sq, sigma12 = compute_statistics(img1, img2, window_size, sigma)
29    
30    C1 = (K1 * L) ** 2
31    C2 = (K2 * L) ** 2
32    
33    luminance = (2 * mu1 * mu2 + C1) / (mu1 ** 2 + mu2 ** 2 + C1)
34    
35    print(f"luminance: {np.mean(luminance):.4f}")
36    
37    # 确保方差值非负
38    sigma1_sq = np.maximum(sigma1_sq, 0)
39    sigma2_sq = np.maximum(sigma2_sq, 0)
40    
41    contrast = (2 * np.sqrt(sigma1_sq) * np.sqrt(sigma2_sq) + C2) / (sigma1_sq + sigma2_sq + C2)
42    print(f"contrast: {np.mean(contrast):.4f}")
43    structure = (sigma12 + C2 / 2) / (np.sqrt(sigma1_sq) * np.sqrt(sigma2_sq) + C2 / 2)
44    print(f"structure: {np.mean(structure):.4f}")
45    
46    ssim_map = luminance * contrast * structure
47    return np.mean(ssim_map)
48
49def ssim_index(image1_path, image2_path, window_size=11, sigma=1.5, K1=0.01, K2=0.03):
50    img1 = load_image_grayscale(image1_path)
51    img2 = load_image_grayscale(image2_path)
52    
53    if img1.shape != img2.shape:
54        raise ValueError("输入的两幅图像必须具有相同的尺寸")
55    
56    ssim = calculate_ssim(img1, img2, window_size, sigma, K1, K2, L=1.0)
57    return ssim
58
59# 示例使用
60if __name__ == "__main__":
61    image1_path = '/Users/pkl/Downloads/3.png'
62    image2_path = '/Users/pkl/Downloads/3_副本.png'
63    
64    try:
65        ssim_value = ssim_index(image1_path, image2_path)
66        print(f"两张图像的SSIM值为: {ssim_value:.4f}")
67    except Exception as e:
68        print(f"计算SSIM时发生错误: {e}")
69
70    

输出结果>

1❯ /opt/anaconda3/bin/python "SSIM结构相似性值计算.py"
2luminance: 0.9946
3contrast: 0.9917
4structure: 0.9869
5两张图像的SSIM值为: 0.9831