跨境派

跨境派

跨境派,专注跨境行业新闻资讯、跨境电商知识分享!

当前位置:首页 > 工具系统 > 其他工具 > 图像增强的两个评价指标:峰值信噪比PSNR和结构相似度SSIM

图像增强的两个评价指标:峰值信噪比PSNR和结构相似度SSIM

时间:2024-04-14 07:05:36 来源:网络cs 作者:纳雷武 栏目:其他工具 阅读:

标签: 结构  增强  指标  评价 

两种图像增强评价指标:PSNR和SSIM

峰值信噪比PSNR结构相似度SSIMpython实现SSIM的代码PSNR的代码
图像增强的评价指标在像素层面上通常包含平均绝对误差(MAE)、均方误差法(MSE)、峰值信噪比(PSNR)以及结构相似度(SSIM)。目前在图像增强领域比较权威的客观评价标准为峰值信噪比(PSNR)和结构相似度(SSIM)。
注:这两个指标都需要由标准图做参考(不是原图),也就是全参考指标

峰值信噪比PSNR

PSNR(Peak Signal to Noise Ratio)表示为峰值信号能量与噪声平均能量之比,一般取10lg以dB(分贝)为单位。噪声的平均能量又可以表示为真实图像与含噪图像的均方误差MSE(Mean Squared Error)。PSNR的计算方法如式所示, MAXI为信号能量峰值,bits为单通道像素值位深度,M、N为图像宽高, x(i,j)和x~(i,j) 分别表示增强后的图像与原图在像素点 (i,j)处的像素值。
在这里插入图片描述

结构相似度SSIM

自然图像具有极高的结构性,表现为图像的像素间存在着很强的相关性,尤其是在空间相似的情况下。这些相关性在视觉场景中携带着关于物体结构的重要信息,通过分析结构信息是否改变可以判断图像的失真情况。大多数基于误差敏感度的图像质量评估指标,如MSE、PSNR,使用线性变换来分解图像信号,不涉及两图像之间的相关性,SSIM(Structural Similarity)给出了更直接的方法来比较失真图像和参考图像之间的结构差异,是一种衡量两幅图像相似度的指标,它从图像组合的角度将图像的结构信息定义为独立于亮度和对比度、反映场景中物体结构的属性,并将失真建模为亮度、对比度和结构三个不同因素的组合,从亮度相似性、对比度相似性和结构相似性三个方面综合评价图像质量,用均值作为亮度的估计、标准差作为对比度的估计、协方差作为结构相似程度的度量。
给定两幅图像 和 ,它们的结构相似度可以由式xx给出,其中,μ和 σ分别表示图像的均值和方差,σxy 表示图像x和图像y之间的协方差,C1和C2为常数,一般可取0。
在这里插入图片描述

SSIM取值为【-1,1】,当两幅图像完全相同时,SSIM取值为1。在实际应用中,一般采用高斯函数计算图像的均值、方差和协方差。由于图像的统计特征通常在空间中分布不均匀,通常对图像局部求取SSIM,再进行平均池化得到整幅图像的SSIM。

python实现

网上找的。

SSIM的代码

#相关操作#由于使用的高斯函数圆对称,因此相关操作和卷积操作结果相同def correlation(img,kernal):    kernal_heigh = kernal.shape[0]    kernal_width = kernal.shape[1]    cor_heigh = img.shape[0] - kernal_heigh + 1    cor_width = img.shape[1] - kernal_width + 1    result = np.zeros((cor_heigh, cor_width), dtype=np.float64)    for i in range(cor_heigh):        for j in range(cor_width):            result[i][j] = (img[i:i + kernal_heigh, j:j + kernal_width] * kernal).sum()    return result#产生二维高斯核函数#这个函数参考自:https://blog.csdn.net/qq_16013649/article/details/78784791def gaussian_2d_kernel(kernel_size=11, sigma=1.5):    kernel = np.zeros([kernel_size, kernel_size])    center = kernel_size // 2    if sigma == 0:        sigma = ((kernel_size - 1) * 0.5 - 1) * 0.3 + 0.8    s = 2 * (sigma ** 2)    sum_val = 0    for i in range(0, kernel_size):        for j in range(0, kernel_size):            x = i - center            y = j - center            kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / s)            sum_val += kernel[i, j]    sum_val = 1 / sum_val    return kernel * sum_val#ssim模型def ssim(distorted_image,original_image,window_size=11,gaussian_sigma=1.5,K1=0.01,K2=0.03,alfa=1,beta=1,gama=1):    distorted_image=np.array(distorted_image,dtype=np.float64)    original_image=np.array(original_image,dtype=np.float64)    if not distorted_image.shape == original_image.shape:        raise ValueError("Input Imagees must has the same size")    if len(distorted_image.shape) > 2:        raise ValueError("Please input the images with 1 channel")    kernal=gaussian_2d_kernel(window_size,gaussian_sigma)    #求ux uy ux*uy ux^2 uy^2 sigma_x^2 sigma_y^2 sigma_xy等中间变量    ux=correlation(distorted_image,kernal)    uy=correlation(original_image,kernal)    distorted_image_sqr=distorted_image**2    original_image_sqr=original_image**2    dis_mult_ori=distorted_image*original_image    uxx=correlation(distorted_image_sqr,kernal)    uyy=correlation(original_image_sqr,kernal)    uxy=correlation(dis_mult_ori,kernal)    ux_sqr=ux**2    uy_sqr=uy**2    uxuy=ux*uy    sx_sqr=uxx-ux_sqr    sy_sqr=uyy-uy_sqr    sxy=uxy-uxuy    C1=(K1*255)**2    C2=(K2*255)**2    #常用情况的SSIM    if(alfa==1 and beta==1 and gama==1):        ssim=(2*uxuy+C1)*(2*sxy+C2)/(ux_sqr+uy_sqr+C1)/(sx_sqr+sy_sqr+C2)        return np.mean(ssim)    #计算亮度相似性    l=(2*uxuy+C1)/(ux_sqr+uy_sqr+C1)    l=l**alfa    #计算对比度相似性    sxsy=np.sqrt(sx_sqr)*np.sqrt(sy_sqr)    c=(2*sxsy+C2)/(sx_sqr+sy_sqr+C2)    c=c**beta    #计算结构相似性    C3=0.5*C2    s=(sxy+C3)/(sxsy+C3)    s=s**gama    ssim=l*c*s    return np.mean(ssim)

PSNR的代码

提供了两种方法,网上找的。

def psnr_A(img1, img2):    mse = np.mean((img1 / 1.0 - img2 / 1.0) ** 2)    if mse < 1e-10:        return 100    psnr1 = 20 * math.log10(255 / math.sqrt(mse))    return psnr1def psnr_B(img1, img2):  # 第二种法:归一化    mse = np.mean((img1 / 255.0 - img2 / 255.0) ** 2)    if mse < 1e-10:        return 100    PIXEL_MAX = 1    psnr2 = 20 * math.log10(PIXEL_MAX / math.sqrt(mse))    return psnr2

本文链接:https://www.kjpai.cn/news/2024-04-14/158332.html,文章来源:网络cs,作者:纳雷武,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

文章评论