对比图片相似度, 相似度越接近1 表示相似度越高,
import cv2
import numpy as np
from scipy.ndimage import gaussian_filter
def load_image_grayscale(image_path):
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if img is None:
raise ValueError(f"无法读取图像: {image_path}")
img = img.astype(np.float64) / 255.0
return img
def compute_statistics(img1, img2, window_size=11, sigma=1.5):
mu1 = gaussian_filter(img1, sigma=sigma)
mu2 = gaussian_filter(img2, sigma=sigma)
sigma1_sq = gaussian_filter(img1 ** 2, sigma=sigma) - mu1 ** 2
sigma2_sq = gaussian_filter(img2 ** 2, sigma=sigma) - mu2 ** 2
sigma12 = gaussian_filter(img1 * img2, sigma=sigma) - mu1 * mu2
return mu1, mu2, sigma1_sq, sigma2_sq, sigma12
def calculate_ssim(img1, img2, window_size=11, sigma=1.5, K1=0.01, K2=0.03, L=1.0):
mu1, mu2, sigma1_sq, sigma2_sq, sigma12 = compute_statistics(img1, img2, window_size, sigma)
C1 = (K1 * L) ** 2
C2 = (K2 * L) ** 2
luminance = (2 * mu1 * mu2 + C1) / (mu1 ** 2 + mu2 ** 2 + C1)
print(f"luminance: {np.mean(luminance):.4f}")
# 确保方差值非负
sigma1_sq = np.maximum(sigma1_sq, 0)
sigma2_sq = np.maximum(sigma2_sq, 0)
contrast = (2 * np.sqrt(sigma1_sq) * np.sqrt(sigma2_sq) + C2) / (sigma1_sq + sigma2_sq + C2)
print(f"contrast: {np.mean(contrast):.4f}")
structure = (sigma12 + C2 / 2) / (np.sqrt(sigma1_sq) * np.sqrt(sigma2_sq) + C2 / 2)
print(f"structure: {np.mean(structure):.4f}")
ssim_map = luminance * contrast * structure
return np.mean(ssim_map)
def ssim_index(image1_path, image2_path, window_size=11, sigma=1.5, K1=0.01, K2=0.03):
img1 = load_image_grayscale(image1_path)
img2 = load_image_grayscale(image2_path)
if img1.shape != img2.shape:
raise ValueError("输入的两幅图像必须具有相同的尺寸")
ssim = calculate_ssim(img1, img2, window_size, sigma, K1, K2, L=1.0)
return ssim
# 示例使用
if __name__ == "__main__":
image1_path = '/Users/pkl/Downloads/3.png'
image2_path = '/Users/pkl/Downloads/3_副本.png'
try:
ssim_value = ssim_index(image1_path, image2_path)
print(f"两张图像的SSIM值为: {ssim_value:.4f}")
except Exception as e:
print(f"计算SSIM时发生错误: {e}")
输出结果>
❯ /opt/anaconda3/bin/python "SSIM结构相似性值计算.py"
luminance: 0.9946
contrast: 0.9917
structure: 0.9869
两张图像的SSIM值为: 0.9831