图像融合质量评价方法SSIM、PSNR、EN、MSE与NRMSE(一)

1 前言

最近开始学习和研究医疗图像融合这一方向,在做实验时因为缺少评估融合图像的指标以及代码非常苦恼。在经过一段时间的收集之后,得到了不少指标,所以希望可以记录一下。本文主要记录怎么使用这些指标,对于这些指标的公式和原理并不会过多介绍。后续更新图像融合质量评价方法AG、SF、STD、MI与NMI(二)图像融合质量评价方法MSSIM、MS-SSIM、FS、Qmi、Qabf与VIFF(三)图像融合质量评价方法FMI(四)

2 融合评价指标介绍

2.1 结构相似性 SSIM

SSIM是Structural Similarity的缩写,表示结构相似性,取值范围为[-1,1],越接近1,代表相似度越高,融合质量越好。
关于详细的公式和原理解释可以看Image Quality Assessment: From Error Visibility to Structural Similarity

2.2 峰值信噪比 PSNR

Peak signal to noise ration缩写PSNR,峰值信噪比,用于衡量图像有效信息与噪声之间的比率,能够反映图像是否失真。
P S N R = 10 log ⁡ z 2 M S E PSNR=10\log\frac{z^2}{MSE} PSNR=10logMSEz2Z表示理想参考图像灰度最大值与最小值之差,通常为255。PSNR的值越大,表示融合图像的质量越好。

2.3 信息熵 Entropy

信息熵主要是度量图像包含信息量多少的一个客观评价指标,a表示灰度值,P(a)表示灰度概率分布:
H ( A )    =    − ∑ a P A ( a ) l o g p A ( a ) H(A)\;=\;-\sum_aP_A(a)l\mathrm{og}p_A(a) H(A)=aPA(a)logpA(a)信息熵越高表示融合图像的信息量越丰富,质量越好

2.4 均方误差 MSE

均方误差(Mean Square Error)反映的是变量间的差异程度,是一种基于像素误差的图像质量客观评价指标,用于衡量融合图像和理想参考图像之间的差异,MSE越小,表示融合图像质量越好。
均方根误差(Root Mean Square Error)是一个翻译空间细节信息的评价指标,公式如下: R M S E ( I F , I W )    =    M S E ( I F , I W )    RMSE(I_F,I_W)\;=\;\sqrt{MSE(I_F,I_W)\;} RMSE(IF,IW)=MSE(IF,IW)

2.5 归一化均方根误差 NRMSE

归一化均方根误差(normalized root mean square error)就是将RMSE的值变成(0,1)之间。

3 代码实现

3.1 使用skimage库

为什么要一次性介绍这5个指标?因为这5个指标都只需要调用skimage库就可以使用了。skimage库是用于图像处理的 Python 包,使用原生的 NumPy 数组作为图像对象。
其中skimage.measure中包括以上所以指标的函数,详见Scikit image 中文开发手册。废话不多说,下面之间给出使用这些函数的例子:

import cv2
import numpy as np
import math

import skimage.measure 

# 参数0表示读入即为灰度图
img = cv2.imread('1.png',0)
img_fu = cv2.imread('2.png',0)

# 结构相似性
ssim = skimage.measure.compare_ssim(img, img_fu, data_range=255)

# 峰值信噪比
psnr = skimage.measure.compare_psnr(img, img_fu, data_range=255)

# 均方误差
mse = skimage.measure.compare_mse(img, img_fu)

# 均方根误差
rmse = math.sqrt(mse)

# 归一化均方根误差
nrmse = skimage.measure.compare_nrmse(img, img_fu, norm_type='Euclidean')

# 信息熵
entropy = skimage.measure.shannon_entropy(img_fu, base=2)

3.2 信息熵Entropy python实现

其实信息熵的实现并不难,根据上面的公式就可以写出(代码参考图像信息熵):

import cv2
import numpy as np
import math

import skimage.measure 


def imageEn(image):
    tmp = []
    for i in range(256):
        tmp.append(0)
    val = 0
    k = 0
    res = 0
    img = np.array(image)
    for i in range(len(img)):
        for j in range(len(img[i])):
            val = img[i][j]
            tmp[val] = float(tmp[val] + 1)
            k = float(k + 1)
    for i in range(len(tmp)):
        tmp[i] = float(tmp[i] / k)
    for i in range(len(tmp)):
        if(tmp[i] == 0):
            res = res
        else:
            res = float(res - tmp[i] * (math.log(tmp[i]) / math.log(2.0)))

    return res

if __name__ == '__main__':
    image = cv2.imread('1.png',0)
    print(imageEn(image))
    print(skimage.measure.shannon_entropy(image, base=2))

可以看到对同一图片,上面所示代码和skimage库中的shannon_entropy()函数计算结果相差不大
在这里插入图片描述

3.3 峰值信噪比PSNR python实现

代码来源PSNR实现

import cv2
import numpy as np
import math

import skimage.measure 

 
def psnr1(img1, img2):
   mse = np.mean((img1/1.0 - img2/1.0) ** 2 )
   if mse < 1.0e-10:
      return 100
   return 10 * math.log10(255.0**2/mse)
 
def psnr2(img1, img2):
   mse = np.mean( (img1/255. - img2/255.) ** 2 )
   if mse < 1.0e-10:
      return 100
   PIXEL_MAX = 1
   return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))

if __name__ == '__main__':
    image = cv2.imread('1.png',0)
    img_fu = cv2.imread('2.png',0)
    print(psnr1(image,img_fu))
    print(psnr2(image,img_fu))
    print(skimage.measure.compare_psnr(image, img_fu, data_range=255))

对同一图片进行测试,得到结果如下:
在这里插入图片描述

3.4 结构相似性SSIM python实现

在研究使用python实现MS-SSIM(多层级结构相似性)时,考虑从SSIM代码上面进行改进,发现【超分辨率】基于结构相似性的图像质量评价SSIM及其python实现这篇文章的代码误差相对而言较小:

import numpy as np
from PIL import Image 
from scipy.signal import convolve2d
import cv2

import skimage.measure 

def matlab_style_gauss2D(shape=(3,3),sigma=0.5):
    """
    2D gaussian mask - should give the same result as MATLAB's
    fspecial('gaussian',[shape],[sigma])
    """
    m,n = [(ss-1.)/2. for ss in shape]
    y,x = np.ogrid[-m:m+1,-n:n+1]
    h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )
    h[ h < np.finfo(h.dtype).eps*h.max() ] = 0
    sumh = h.sum()
    if sumh != 0:
        h /= sumh
    return h

def filter2(x, kernel, mode='same'):
    return convolve2d(x, np.rot90(kernel, 2), mode=mode)

def compute_ssim(im1, im2, k1=0.01, k2=0.03, win_size=11, L=255):

    if not im1.shape == im2.shape:
        raise ValueError("Input Imagees must have the same dimensions")
    if len(im1.shape) > 2:
        raise ValueError("Please input the images with 1 channel")

    M, N = im1.shape
    C1 = (k1*L)**2
    C2 = (k2*L)**2
    window = matlab_style_gauss2D(shape=(win_size,win_size), sigma=1.5)
    window = window/np.sum(np.sum(window))

    if im1.dtype == np.uint8:
        im1 = np.double(im1)
    if im2.dtype == np.uint8:
        im2 = np.double(im2)

    mu1 = filter2(im1, window, 'valid')
    mu2 = filter2(im2, window, 'valid')
    mu1_sq = mu1 * mu1
    mu2_sq = mu2 * mu2
    mu1_mu2 = mu1 * mu2
    sigma1_sq = filter2(im1*im1, window, 'valid') - mu1_sq
    sigma2_sq = filter2(im2*im2, window, 'valid') - mu2_sq
    sigmal2 = filter2(im1*im2, window, 'valid') - mu1_mu2

    ssim_map = ((2*mu1_mu2+C1) * (2*sigmal2+C2)) / ((mu1_sq+mu2_sq+C1) * (sigma1_sq+sigma2_sq+C2))

    return np.mean(np.mean(ssim_map))


if __name__ == "__main__":
    im1 = cv2.imread('1.png',0)
    im2 = cv2.imread('2.png',0)

    print(compute_ssim(np.array(im1),np.array(im2)))
    ssim = skimage.measure.compare_ssim(im1, im2, data_range=255)
    print(ssim)

可以看到使用上面的代码与skimage库计算SSIM误差存在但是相对而言较小
在这里插入图片描述

4 总结

这5个指标的实现比较容易,但是融合图像评价方法还有很多,继续慢慢总结…

  • 42
    点赞
  • 352
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: PSNR(峰值信噪比)和SSIM(结构相似性)是图像质量评价的两个重要指标。 PSNR是一种用于度量图像质量的指标,通过计算原始图像与经过压缩或处理后的图像之间的峰值信噪比来评估图像的失真程度。峰值信噪比是指信号的最大可能功率与表示这个信号的系统的噪声功率之比。PSNR的计算公式为: PSNR = 10 * log10((最大可能像素值)² / MSE) 其中最大可能像素值是指原始图像中像素的最大值,MSE是均方差,用于度量两个图像之间的差异程度。 SSIM是一种统计方法,用于比较两个图像的结构相似性。它不仅考虑图像的亮度信息,还考虑图像的对比度和结构信息。SSIM计算过程中引入了三个关键的组成部分:亮度相似性、对比度相似性和结构相似性。SSIM的计算公式为: SSIM(x, y) =(2μxμy + C1)(2σxy + C2)/(μx² + μy² + C1)(σx² + σy² + C2) 其中,x和y分别代表两个图像,μx和μy分别代表x和y的平均值,σx²和σy²分别代表x和y的方差,σxy代表x和y的协方差,C1和C2是常数用来稳定计算。 PSNRSSIM是常用的图像质量评价指标。PSNR主要用于比较两个图像之间的失真程度,数值越大表示失真越小;而SSIM主要用于比较两个图像之间的结构相似性,数值越接近1表示结构相似性越高。综合应用这两个指标可以更全面地评价图像质量。 ### 回答2: PSNR(Peak Signal-to-Noise Ratio)是一种用于评估图像质量的指标,它通过比较原始图像与经过压缩或失真处理后的图像之间的均方误差,来衡量图像的失真程度。PSNR的计算公式为: PSNR = 10 * log10 (MAX^2 / MSE) 其中 MAX 表示像素数据的最大可能取值,MSE 表示均方误差,即原始图像与失真图像之间每个像素值差的平方的均值。PSNR的值通常以分贝(dB)为单位,数值越大表示图像质量越好。 而 SSIM(Structural Similarity Index)是一种比较图像结构相似性的指标,它主要关注图像的亮度、对比度和结构等方面。SSIM的计算公式为: SSIM = (2 * μx * μy + C1) * (2 * σxy + C2) / (μx^2 + μy^2 + C1) * (σx^2 + σy^2 + C2) 其中 μx 和 μy 表示原始图像和失真图像的亮度平均值,σx 和 σy 表示原始图像和失真图像的方差,σxy 表示原始图像和失真图像的协方差,C1 和 C2 是常数,用于避免分母为零。SSIM的取值范围为[-1, 1],值越接近1表示图像质量越好。 PSNRSSIM是两种常用的图像质量评价指标。PSNR主要关注图像的失真程度,适用于需要精确度和灵敏度的场景;而SSIM则关注图像的结构相似性,适用于需要保留图像细节和结构的场景。综合使用PSNRSSIM可以更全面地评价图像的质量。 ### 回答3: 图像质量评价指标是衡量图像质量好坏的方法,其中PSNRSSIM是两个常用的评价指标。 PSNR(Peak Signal-to-Noise Ratio)是一种用于测量图像失真程度的指标。它计算图像与原始图像之间的峰值信噪比,即原始图像中最大像素值与重建图像与原始图像之间的均方误差的比值。PSNR值越高,表示失真越小,图像质量越好。常用PSNR评价图像压缩算法的效果,如JPEG压缩等。 SSIM(Structural Similarity Index)是一种用于测量图像结构相似性的指标。它考虑了亮度、对比度和结构三个因素间的差异,并综合这些因素计算相似性指数。SSIM值越接近1,表示两幅图像越相似,图像质量越好。SSIM主要用于评价图像处理算法的效果,如去噪、增强等。 PSNRSSIM都是客观评价指标,对失真图像与原始图像之间的差异进行量化。它们都有各自的使用范围和场景,没有绝对优劣之分。在评价图像质量时,可以综合考虑PSNRSSIM,以及其他评价指标,综合评估图像的视觉感知质量。 需要注意的是,PSNRSSIM仅能从一定程度上反映图像质量,对于某些特殊场景或者人眼难以察觉的差异可能会存在局限性。因此,在实际应用中,还需要结合人眼主观评价、其他更多的评价指标以及具体的应用需求来全面评价图像的质量

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值