PSNR-峰值信噪比和SSIM-结构相似性,以及python代码实现

1 PSNR概念参考博客

https://zhuanlan.zhihu.com/p/50757421
https://blog.csdn.net/sinat_36197913/article/details/103417334
https://blog.csdn.net/leviopku/article/details/84586446

MSE和PSNR的区别?为什么有了MSE还需要PSNR?
看公式就能看出区别来,PSNR相对MSE多了一个峰值;我的理解是mse是绝对误差,再加上峰值是一个相对误差指标

2 SSIM概念参考博客

https://blog.csdn.net/leviopku/article/details/84635897

3 计算两幅图像的PSNR

参考博客
https://blog.csdn.net/weixin_41036461/article/details/108406265
https://blog.csdn.net/Resume_f/article/details/103339722

psnr是用来评价两幅图像相比质量的好坏,即失真情况。这两幅图像分别为原图像经图像重建或者压缩后等图像处理方法的图像。PSNR越高,图像失真越小

自己这里找一张原始的清晰图片和去模糊之后的图片,计算两者之间的PSNR

from PIL import Image
import numpy
import math


def psnr(img1, img2):
    mse = numpy.mean((img1 - img2) ** 2)
    if mse == 0:
        return 100
    PIXEL_MAX = 255.0
    return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))


img1 = Image.open('001.png')
img2 = Image.open('deblur_001.png')

i1_array = numpy.array(img1)
i2_array = numpy.array(img2)

r12 = psnr(i1_array, i2_array)
print(r12)

输出结果
32.367225405020655

4 计算两幅图像的SSIM

参考博客和上面一样

同样还是计算上面两张图片的SSIM

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("001.png", 0)
img2 = cv2.imread("deblur_001.png", 0)

img1 = np.array(img1)
img2 = np.array(img2)


ss = calculate_ssim(img1, img2)
print(ss)

输出结果

0.8298707254509092

5 直接调用函数计算PSNR和SSIM

可以参考下面这些博客
https://www.cnblogs.com/lwp-nicol/p/14330034.html
https://blog.csdn.net/qq_42856191/article/details/118445380

posted on   健力宝1995  阅读(1843)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示