psnr和ssim的pytorch代码
时间: 2023-05-31 08:18:04 浏览: 310
图像去噪MWCNN的Pytorch复现代码,包含计算PSNR/SSIM代码以及训练好的模型文件,可以直接使用,训练自己的数据集
5星 · 资源好评率100%
### 回答1:
PSNR的PyTorch代码:
```python
import torch
def psnr(img1, img2):
mse = torch.mean((img1 - img2) ** 2)
if mse == :
return float('inf')
PIXEL_MAX = 1
return 20 * torch.log10(PIXEL_MAX / torch.sqrt(mse))
```
SSIM的PyTorch代码:
```python
import torch
import torch.nn.functional as F
def ssim(img1, img2, window_size=11, window=None, size_average=True):
if window is None:
window = create_window(window_size, img1.shape[1]).to(img1.device)
mu1 = F.conv2d(img1, window, padding=window_size//2, groups=img1.shape[1])
mu2 = F.conv2d(img2, window, padding=window_size//2, groups=img1.shape[1])
mu1_sq = mu1.pow(2)
mu2_sq = mu2.pow(2)
mu1_mu2 = mu1 * mu2
sigma1_sq = F.conv2d(img1 * img1, window, padding=window_size//2, groups=img1.shape[1]) - mu1_sq
sigma2_sq = F.conv2d(img2 * img2, window, padding=window_size//2, groups=img1.shape[1]) - mu2_sq
sigma12 = F.conv2d(img1 * img2, window, padding=window_size//2, groups=img1.shape[1]) - mu1_mu2
C1 = (.01 * 1) ** 2
C2 = (.03 * 1) ** 2
ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
if size_average:
return ssim_map.mean()
else:
return ssim_map.mean(1).mean(1).mean(1)
def create_window(window_size, channel):
_1D_window = torch.tensor([math.exp(-(x - window_size//2)**2/float(2*1.5**2)) for x in range(window_size)])
_1D_window = _1D_window / _1D_window.sum()
window = _1D_window.unsqueeze().unsqueeze(1).repeat(channel, 1, window_size, 1)
return window
```
### 回答2:
PSNR和SSIM是常用的图像质量评价指标。PSNR(Peak Signal-to-Noise Ratio)衡量原始图像与压缩图像之间的质量损失,通过计算均方误差(MSE)来评估两幅图像之间的相似度。SSIM(Structural Similarity Index)是一种结构相似度评价指标,它在图像数量表述和信息处理方面有更好的表现。接下来我将用Pytorch代码演示如何计算PSNR和SSIM指标。
1. PSNR
在Pytorch中,我们可以使用以下代码来计算PSNR指标:
```python
import torch
import torch.nn.functional as F
def PSNR(img1, img2):
mse = F.mse_loss(img1, img2)
max_pixel = 1.0
psnr = 20 * torch.log10(max_pixel / torch.sqrt(mse))
return psnr.item()
```
在上面的代码中,我们使用了Pytorch中的F.mse_loss函数来计算两幅图像之间的均方误差(MSE)。我们还需要指定图像像素的最大值,这里我们将其设置为1.0。最后,通过使用PSNR公式,我们计算并返回PSNR值。
2. SSIM
在Pytorch中,我们可以使用以下代码来计算SSIM指标:
```python
import torch
import torch.nn.functional as F
def SSIM(img1, img2, window_size=11, size_average=True):
channel = img1.size(1)
window = create_window(window_size, channel)
mu1 = F.conv2d(img1, window, padding=window_size//2, groups=channel)
mu2 = F.conv2d(img2, window, padding=window_size//2, groups=channel)
mu1_sq = mu1.pow(2)
mu2_sq = mu2.pow(2)
mu1_mu2 = mu1 * mu2
sigma1_sq = F.conv2d(img1 * img1, window, padding=window_size//2, groups=channel) - mu1_sq
sigma2_sq = F.conv2d(img2 * img2, window, padding=window_size//2, groups=channel) - mu2_sq
sigma12 = F.conv2d(img1 * img2, window, padding=window_size//2, groups=channel) - mu1_mu2
C1 = 0.01 ** 2
C2 = 0.03 ** 2
ssim_map = ((2 * mu1_mu2 + C1) * (2 * sigma12 + C2)) / ((mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2))
if size_average:
return ssim_map.mean().item()
else:
return ssim_map.mean(1).mean(1).mean(1).item()
def create_window(window_size, channel):
window = torch.Tensor(window_size, window_size).type(torch.FloatTensor)
_window = window.expand(channel, 1, window_size, window_size)
return _window / (_window ** 2).sum([2, 3]).sqrt().unsqueeze(1)
```
在上面的代码中,我们定义了create_window函数来创建一个SSIM窗口(也称为高斯加权窗口),它将依次应用于每个颜色通道。然后我们计算两幅图像之间的均值和标准偏差,并应用公式计算SSIM值。我们还需要指定窗口的大小,默认为11。最后,如果size_average参数设置为True,则返回平均值,否则返回每个图像的值。
### 回答3:
PSNR和SSIM是衡量图像品质的两个重要指标。PSNR是Peak Signal-to-Noise Ratio的缩写,即峰值信噪比。而SSIM是Structural Similarity Index的缩写,即结构相似性指标。现在我们来看一下如何使用PyTorch来计算PSNR和SSIM。
1. PSNR
PSNR的计算公式如下:
PSNR = 10 * log10(max^2 / MSE)
其中,max是像素的最大值(一般是255),MSE为均方误差(Mean Squared Error),公式如下:
MSE = 1/n * ∑(i=1~n) (f(i) - g(i))^2
其中,f(i)和g(i)分别表示两个图像在第i个像素点的值,n为像素数。
下面是PyTorch中计算PSNR的代码:
```python
import torch
import torch.nn.functional as F
def psnr(img1, img2):
mse = F.mse_loss(img1, img2)
psnr = 10 * torch.log10(255**2 / mse)
return psnr
```
其中,img1和img2可以是两张图像的Tensor或Variable。
2. SSIM
SSIM的计算公式如下:
SSIM = (2μ1μ2 + C1)(2σ12 + C2) / (μ1^2 + μ2^2 + C1)(σ1^2 + σ2^2 + C2)
其中,μ1、μ2为两张图像的均值,σ1、σ2为两张图像的标准差,σ12为两张图像的协方差,C1和C2是常数,用于避免分母为0。
下面是PyTorch中计算SSIM的代码:
```python
import torch
import torch.nn.functional as F
def ssim(img1, img2):
C1 = (0.01 * 255)**2
C2 = (0.03 * 255)**2
mu1 = F.avg_pool2d(img1, 3, 1, 0)
mu2 = F.avg_pool2d(img2, 3, 1, 0)
sigma1 = F.avg_pool2d(img1**2, 3, 1, 0) - mu1**2
sigma2 = F.avg_pool2d(img2**2, 3, 1, 0) - mu2**2
sigma12 = F.avg_pool2d(img1 * img2, 3, 1, 0) - mu1 * mu2
ssim_num = (2 * mu1 * mu2 + C1) * (2 * sigma12 + C2)
ssim_den = (mu1**2 + mu2**2 + C1) * (sigma1 + sigma2 + C2)
ssim = ssim_num / ssim_den
return ssim.mean()
```
其中,img1和img2同样可以是两张图像的Tensor或Variable。C1和C2在上面的代码中取的是默认值,也可以根据不同的需求进行调整。
阅读全文