跳过正文
Background Image
  1. 文档/

SSIM对比图片相似度

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

相关文章

Psnr对比图片画质
软件测试入门指南:从零基础到核心技能解析
华亭百咏 其四十三 思齐堂
吴中好风景二首 其二
张三-简历
1 分钟