对比图片相似度, 相似度越接近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