参考文章:https://zhuanlan.zhihu.com/p/50757421
https://blog.csdn.net/weixin_36815313/article/details/108531674
实现方式有两种
- skimage.measure.compare_ssim
sk_psnr = skimage.measure.compare_psnr(im1, im2, 255)
print(sk_psnr )
- 手动实现
def calculate_psnr(img1, img2):# img1 and img2 have range [0, 255]img1 = img1.astype(np.float64)img2 = img2.astype(np.float64)mse = np.mean((img1 - img2)**2)if mse == 0:return float('inf')return 20 * math.log10(255.0 / math.sqrt(mse))
以上两种方式的计算结果一致。
一般来说,MSE越小,则PSNR 越大,代表着图像质量越好。
- PSNR高于40dB说明图像质量极好(即非常接近原始图像)
- 在30-40dB通常表示图像质量是好的(即失真可以察觉但可以接受)
- 在20-30dB说明图像质量差
- 低于20dB图像不可接受
对于三通道的图像,对每个通道分别求ssim值,之后求平均,最大值为1.0
实现方式有两种
- skimage.measure.compare_ssim
sk_ssim = measure.compare_ssim(img1, img2, gaussian_weights = True,multichannel = True, data_range=255)
print(sk_ssim )
- 手动实现
def calculate_ssim(img1, img2):'''calculate SSIMthe same outputs as MATLAB'simg1, 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.')def ssim(img1, img2):C1 = (0.01 * 255)**2C2 = (0.03 * 255)**2img1 = 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] # validmu2 = cv2.filter2D(img2, -1, window)[5:-5, 5:-5]mu1_sq = mu1**2mu2_sq = mu2**2mu1_mu2 = mu1 * mu2sigma1_sq = cv2.filter2D(img1**2, -1, window)[5:-5, 5:-5] - mu1_sqsigma2_sq = cv2.filter2D(img2**2, -1, window)[5:-5, 5:-5] - mu2_sqsigma12 = cv2.filter2D(img1 * img2, -1, window)[5:-5, 5:-5] - mu1_mu2ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) *(sigma1_sq + sigma2_sq + C2))return ssim_map.mean()
以上两种方式的计算结果基本一致。
SSIM,Structural Similarity,结构相似性. 也是衡量两幅图片相似性的指标.
结构相似性的基本原理是,认为自然图像时高度结构化的,即相邻像素间具有很强的关联性,而这种关联性表达了场景中物体的结构信息. 人类视觉系统对于图像已经具有很强的理解与信息抽取能力,所以在衡量图像质量时,结构性失真是很重要的考量