在python中计算ssim的方法(与Matlab结果一致)

如下代码可以计算输入的两张图像的结构相似度(SSIM),结果与matlab计算结果一致

// An highlighted block

import cv2

import numpy as np

def ssim(img1, img2):

C1 = (0.01 * 255)**2

C2 = (0.03 * 255)**2

img1 = img1.astype(np.float64)

img2 = img2.astype(np.float64)

kernel = cv2.getGaussianKernel(11, 1.5)

window = np.outer(kernel, kernel.transpose())

mu1 = cv2.filter2D(img1, -1, window)[5:-5, 5:-5] # valid

mu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]

mu1_sq = mu1**2

mu2_sq = mu2**2

mu1_mu2 = mu1 * mu2

sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sq

sigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sq

sigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2

ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *

(sigma1_sq + sigma2_sq + C2))

return ssim_map.mean()

def calculate_ssim(img1, img2):

'''calculate SSIM

the same outputs as MATLAB's

img1, img2: [0, 255]

'''

if not img1.shape == img2.shape:

raise ValueError('Input images must have the same dimensions.')

if img1.ndim == 2:

return ssim(img1, img2)

elif img1.ndim == 3:

if img1.shape[2] == 3:

ssims = []

for i in range(3):

ssims.append(ssim(img1, img2))

return np.array(ssims).mean()

elif img1.shape[2] == 1:

return ssim(np.squeeze(img1), np.squeeze(img2))

else:

raise ValueError('Wrong input image dimensions.')

img1 = cv2.imread("Test2_HR.bmp", 0)

img2 = cv2.imread("Test2_LR2.bmp", 0)

ss = calculate_ssim(img1, img2)

print(ss)

总结

以上所述是小编给大家介绍的在python中计算ssim的方法(与Matlab结果一致),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

以上是 在python中计算ssim的方法(与Matlab结果一致) 的全部内容, 来源链接: utcz.com/z/361851.html

回到顶部