均方误差(Mean Squared Error,MSE):计算两个图像像素之间的平均差异的平方。MSE越小,表示两个图像越接近。
均方根误差(Root Mean Squared Error,RMSE):MSE的平方根。RMSE也用于衡量两个图像之间的差异,与MSE类似,但更易于解释。
均方根对数似然比误差(Root Mean Square Logarithmic Error,RMSLE):计算两个图像像素值的对数之间的均方根差异。RMSLE通常在图像处理和计算机视觉任务中使用。
结构相似性指数(Structural Similarity Index,SSIM):衡量两个图像在结构、纹理和亮度方面的相似性。SSIM值介于0和1之间,值越接近1表示图像越相似。
峰值信噪比(Peak Signal-to-Noise Ratio,PSNR):衡量图像失真程度的指标,常用于图像和视频压缩评估。PSNR值越高,表示图像质量越好。
结构相位相似性(Structural Phase Similarity,SPS):类似于SSIM,但在相位信息上进行比较。SPS测量了两个图像在结构和纹理方面的相似性。
多尺度结构相似性(Multi-Scale Structural Similarity,MS-SSIM):对图像进行多尺度分解,并计算每个尺度上的SSIM值,然后进行加权平均得到最终的相似性指数。
这些指标可以根据具体需求选择使用,不同的指标适用于不同的应用场景。
峰值信噪比(Peak Signal-to-Noise Ratio,PSNR): PSNR是衡量重建图像与原始图像之间峰值信噪比的指标,数值越高表示重建图像质量越好。
import torch
import torch.nn.functional as F
def psnr(img1, img2):
mse = F.mse_loss(img1, img2)
psnr = 10 * torch.log10(1 / mse)
return psnr
def psnr(img1, img2):
mse = F.mse_loss(img1, img2)
psnr = 10 * torch.log10(255** 2 / mse)
return psnr
结构相似性指数(Structural Similarity Index,SSIM): SSIM可以衡量重建图像与原始图像之间结构相似性的指标,数值越接近1表示重建图像质量越好
import torch
import torch.nn.functional as F
def ssim(img1, img2, window_size=11, size_average=True):
# 设置窗口参数
channels = img1.size(1)
window = create_window(window_size, channels).to(img1.device)
# 计算图像均值、方差和协方差
mu1 = F.conv2d(img1, window, padding=window_size//2, groups=channels)
mu2 = F.conv2d(img2, window, padding=window_size//2, groups=channels)
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=channels) - mu1_sq
sigma2_sq = F.conv2d(img2 * img2, window, padding=window_size//2, groups=channels) - mu2_sq
sigma12 = F.conv2d(img1 * img2, window, padding=window_size//2, groups=channels) - mu1_mu2
# 计算SSIM值
C1 = (0.01 * 255)**2
C2 = (0.03 * 255)**2
numerator = (2 * mu1_mu2 + C1) * (2 * sigma12 + C2)
denominator = (mu1_sq + mu2_sq + C1) * (sigma1_sq + sigma2_sq + C2)
ssim_map = numerator / denominator
if size_average:
return ssim_map.mean()
else:
return ssim_map.mean(1).mean(1).mean(1)
def gaussian(window_size, sigma):
gauss = torch.exp(-(torch.arange(window_size) - window_size//2)**2 / (2*sigma**2))
return gauss / gauss.sum()
def create_window(window_size, channels):
_1D_window = gaussian(window_size, 1.5).unsqueeze(1)
_2D_window = _1D_window.mm(_1D_window.t()).float().unsqueeze(0).unsqueeze(0)
window = _2D_window.expand(channels, 1, window_size, window_size).contiguous()
return window
# 示例用法
img1 = torch.randn(1, 3, 256, 256) # 输入图像1
img2 = torch.randn(1, 3, 256, 256) # 输入图像2
ssim_value = ssim(img1, img2)
print(ssim_value)
其它
import torch
import torch.nn.functional as F
def rmse(img1, img2):
mse = F.mse_loss(img1, img2)
rmse_value = torch.sqrt(mse)
return rmse_value
def sps(img1, img2):
fft1 = torch.fft.fftn(img1)
fft2 = torch.fft.fftn(img2)
phase_corr = torch.cos(fft1.angle() - fft2.angle())
sps_value = torch.mean(phase_corr)
return sps_value
计算RMSLE时,使用1加上两个图像像素值之间的差异的平方。这里加1的目的是为了避免当差异为0时取对数的问题。如果两个像素值相等,即img1 - img2 = 0,那么计算log(1 + (img1 - img2)**2)时,如果没有加1,就会变成log(0),这将导致无穷大或错误的结果。通过加1,我们确保了即使差异为0,取对数时也不会出现问题。
因此,在计算RMSLE时,通常会在差异平方的基础上加1,以确保计算的稳定性和正确性。
def rmsle(img1, img2):
log_diff = torch.log(1 + (img1 - img2)**2)
rmsle_value = torch.sqrt(torch.mean(log_diff))
return rmsle_value
# 示例用法
img1 = torch.randn(1, 3, 256, 256) # 输入图像1
img2 = torch.randn(1, 3, 256, 256) # 输入图像2
rmse_value = rmse(img1, img2)
sps_value = sps(img1, img2)
rmsle_value = rmsle(img1, img2)
print("RMSE:", rmse_value)
print("SPS:", sps_value)
print("RMSLE:", rmsle_value)