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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理