融合图像的各种评价指标及代码实现

融合图像的各种评价指标及代码实现

该篇文章主要用于梳理有关图像融合的各种评价指标及如何使用Python代码实现



前言

对于研究方向为多模态图像融合的研究学者可以参考该篇文章,主要记录了各种各样的融合图像和不同源图像之间的评价指标。


提示:以下是本篇文章正文内容,下面案例可供参考

一、融合评价指标

首先下面代码是判断输入的图像是否符合要求。

@classmethod
    def check(cls, Fusion_img, ir=None, vi=None):
        if ir is None or vi is None:
            assert type(Fusion_img) == np.ndarray, 'Fusion_img should be a numpy array'
            assert len(Fusion_img.shape) == 2, 'Fusion_img dimensions should be 2 dimensional'
        else:
            assert type(Fusion_img) == type(ir) == type(vi) == np.ndarray, 'Fusion_img and ir and vi should be the same type'
            assert Fusion_img.shape == ir.shape == vi.shape, 'Fusion_img and ir and vi should be the same shape'
            assert len(Fusion_img.shape) == 2, 'Fusion dimensions should be 2 dimensional'

下面是读取图像代码,用于将融合图像、红外图像或可见光图像转换成为灰度图像,也可以不使用该代码,前处理转换一下就可以,方便大家直接使用,我将代码放在了下面。

def image_read_cv2(path, mode='RGB'):
    img_BGR = cv2.imread(path).astype('float32')
    assert mode == 'RGB' or mode == 'GRAY' or mode == 'YCrCb', 'mode error'
    if mode == 'RGB':
        img = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
    elif mode == 'GRAY':
        img = np.round(cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY))
    elif mode == 'YCrCb':
        img = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
    return img

1.1信息熵EN(Entropy)

信息熵EN主要是用来度量融合之后的图像或者不同源图像包含信息量多少的一个客观评价指标,其中 x i x_{i} xi表示灰度值, P ( x i ) P(x_{i}) P(xi)表示灰度概率分布:
H ( X ) = − ∑ i = 1 n P ( x i ) l o g 2 ( P ( x i ) ) H(X) = -\sum_{i=1}^{n} P(x_{i})log_{2}(P(x_{i})) H(X)=i=1nP(xi)log2(P(xi))
该指标是度量图像包含信息量多少的一个客观评价指标,值越大表示图像包含的信息越丰富,使用的时候主要是用于评估融合之后的图像的信息熵。

@classmethod
    def EN(cls, img):
        cls.check(img)
        a = np.uint8(np.round(img)).flatten()
        h = np.bincount(a)/a.shape[0]
        return -sum(h * np.log2(h + (h==0)))

EN计算示例,如何结合上面前处理代码和EN方法使用,其中下面所有评价指标方法类似,只是输入的图像个数不同,有的方法只需要输入融合之后的图像,有的方法需要输入融合图像、红外图像或可见光图像。(其中红外图像或可见光是来自不同源的图像),示例如下:

if __name__ == '__main__':
	'''
		首先读取融合图像和不同源图像,然后调用EN方法,返回值即为单张图像的信息熵
		注意:如果是论文当中的EN评判指标数值,不是计算单张图像的信息熵大小,
		而是计算验证集当中所有图像的EN值,并求其平均。
	'''
    Fusion_img = image_read_cv2("../Fusion_img.png" ,'GRAY')
    IR = image_read_cv2("../ir.png", "GRAY")
    VI = image_read_cv2("../vi.png", "GRAY")
    EN = Valuation.EN(Fusion_img)

1.2互信息MI(Mutual Information)

互信息MI主要是一种用于评估两个变量之间的共享信息的统计量,在图像处理领域,尤其是在图像融合中,MI被广泛用作评价融合图像和源图像之间信息保持程度的指标。

融合图像与源图像之间的像素强度分布,它们之间的互信息MI定义为:
M I ( X , Y ) = ∑ x ∈ X ∑ y ∈ Y p ( x , y ) l o g ( p ( x , y ) p ( x ) p ( y ) ) MI(X,Y) = \sum_{x \in X}\sum_{y \in Y}p(x,y)log(\frac{p(x , y)}{p(x)p(y)}) MI(X,Y)=xXyYp(x,y)log(p(x)p(y)p(x,y))
主要作用:
1.量化信息保持:$MI能够量化融合图像从源图像中保留了多少信息。较高的MI值意味着融合图像在保留源图像信息方面做的很好。
2.评价融合质量:通过比较不同融合方法得到的融合图像的MI值,可以评估不同融合算法的性能。MI值越高,通常认为融合图像的质量越好。
3.指导融合算法设计“在设计新的图像融合算法时,MI可以作为优化目标之一,通过最大化融合图像与源图像之间的MI值来改进算法。
4.多源信息融合评估:融合多个源图像时,MI可以帮助图像是否有效地结合了所有源图像中地有用信息。

计算不同源图像与融合图像的互信息MI代码:

    def MI(cls, Fusion_img, ir, vi):
        cls.check(Fusion_img, ir, vi)
        F = Fusion_img.flatten()
        IR = ir.flatten()
        VI = vi.flatten()
        F_IR = mutual_info_score(F, IR)
        F_VI = mutual_info_score(F, VI)
        return F_IR + F_VI

1.3均方误差(MSE)

MSE(Mean Squared Error)是一个常用的统计度量,主要用于评估模型或估计方法的精确性,主要通过计算预测值与实际值之间的差值的平方均值来衡量误差。
图像融合当中,MSE反映了融合图像与参考图像之间的差异,是一种基于像素误差的图像质量的客观评价指标,MSE越小,表示融合图像质量越好。其中计算公式如下所示:
M S E = 1 n ∑ i = 1 n ( y i − y i ^ ) 2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_{i} - \hat{y_{i}})^{2} MSE=n1i=1n(yiyi^)2
同时均方根误差(Root Mean Square Error)是一个翻译空间细节信息的评价指标,公式如下所示:
R M S E ( I F , I v i ) = M S E ( I F , I v i ) RMSE(I_{F},I_{vi}) = \sqrt{MSE(I_{F},I_{vi})} RMSE(IF,Ivi)=MSE(IF,Ivi)
代码如下所示:

   @classmethod
    def MSE(cls, Fusion_img, ir, vi):
        cls.check(Fusion_img, ir, vi)
        result1 = np.mean((ir - Fusion_img)**2)
        result2 = np.mean((vi - Fusion_img)**2)
        return (result1 + result2) / 2

1.4 结构相似性(Structural Similarity Index, SSIM)

SSIM是一种用于衡量两幅图像相似度的指标,它考虑了图像的亮度、对比度和结构信息。在图像融合领域,SSIM常被用做评价图像质量的一个标准,因为它能够较好的反应融合图像在保留原图像重要结构信息方面的能力。

SSIM的计算公式通常基于三个比较维度:亮度(luminance)、对比度(contrast)和结构(structure)。对于两个图像块x和y(通常是从两幅图像中对应位置提取的局部窗口),SSIM的计算公式可以表示为:
S S I M ( x , y ) = [ l ( x , y ) ] α ∗ [ c ( x , y ) ] β ∗ [ s ( x , y ) ] γ SSIM(x,y) = [l(x,y)]^{\alpha}*[c(x,y)]^{\beta}*[s(x,y)]^{\gamma} SSIM(x,y)=[l(x,y)]α[c(x,y)]β[s(x,y)]γ
其中,


l ( x , y ) l(x,y) lx,y是亮度比较函数,通常定义为:
l ( x , y ) = 2 μ x μ y + C 1 μ x 2 + μ y 2 + C 1 l(x,y) = \frac{2\mu_{x}\mu_{y}+C_{1}}{\mu_{x}^{2}+\mu_{y}^{2}+C_{1}} l(x,y)=μx2+μy2+C12μxμy+C1

其中 μ x \mu_{x} μx μ y \mu_{y} μy分别是图像块x和y的均值, C 1 C_{1} C1是一个小的常熟,用于避免分母为零的情况。


c ( x , y ) c(x,y) c(x,y)是对比度比较函数,定义为:
c ( x , y ) = 2 σ x σ y + C 2 σ x 2 + σ y 2 + C 2 c(x,y) = \frac{2\sigma_{x}\sigma_{y}+C_{2}}{\sigma_{x}^{2}+\sigma_{y}^{2}+C_{2}} c(x,y)=σx2+σy2+C22σxσy+C2
其中, σ x \sigma_{x} σx σ y \sigma_{y} σy分别是图像块x和y的方差, C 2 C_{2} C2是另一个小的常数。


s ( x , y ) s(x,y) s(x,y)是结构比较函数,定义为:
s ( x , y ) = σ x y + C 3 σ x σ y + C 3 s(x,y) = \frac{\sigma_{xy}+C_{3}}{\sigma_{x}\sigma_{y}+C_{3}} s(x,y)=σxσy+C3σxy+C3
其中, σ x y \sigma_{xy} σxy是图像块x和y的协方差, C 3 C_{3} C3又是一个小的常数。通常,为了简化计算,会设 C 3 = C 2 2 C_{3} = \frac{C_{2}}{2} C3=2C2


在实际应用中,为了得到整幅图像的SSIM值,通常会将图像分割成多个小块,计算每对对应块的SSIM值,然后对这些值进行平均或加权平均。
总结SSIM,对于图像融合评价,通常会计算融合图像与参考图像(源图像)之间的SSIM值,以评估融合图像在保留源图像重要结构信息方面的能力。SSIM的值越接近1,表示两幅图像越相似,融合效果越好。
代码如下所示:

  @classmethod
    def SSIM(cls, image_F, ir, vi):
        '''
        :param data_range is the range difference of your pixel values
        '''
        data_range = 255.0
        cls.check(image_F, ir, vi)
        return ssim(image_F, ir, data_range = data_range) + ssim(image_F, vi ,data_range = data_range)

1.5标准差(Standard Deviation SD)

SD在图像融合评价中也是一个重要的指标,它反映了融合图像中像素值的离散程度,即图像细节的丰富成都。具体来说SD越大,意味着图像中的灰度级越分散,图像的反差越大,从而包含的信息量也就越多,图像质量越高,也就更清晰。
SD的计算公式如下所示:
S D = 1 M N ∑ i = 1 M ∑ j = 1 N ( I ( i , j ) − μ ) 2 SD = \sqrt{\frac{1}{MN}\sum_{i=1}^{M}\sum_{j=1}^{N}(I(i,j)-\mu)^{2}} SD=MN1i=1Mj=1N(I(i,j)μ)2
其中,M和N分别是图像的宽度和高度, I ( i , j ) I(i,j) I(i,j)试图向在位置 ( i , j ) (i,j) (i,j)处的像素值, μ \mu μ是图像的均值。
代码如下所示:

 @classmethod
    def SD(cls, img):
        cls.check(img)
        return np.std(img)

1.6空间频率(Spatial Frequency SF)

SF也是图像融合任务中的一个重要的客观评价指标,用于衡量融合图像的质量。其中空间频率反映了图像灰度的变化率,其值越大,表示图像越清晰,融合图像的质量也就越好。

空间频率的计算通常涉及图像的行频率(RF)和列频率(CF)的计算,然后取二者的平方和的平方根。具体的计算公式如下所示:
S F = R F 2 + C F 2 SF = \sqrt{RF^{2} + CF^{2}} SF=RF2+CF2
其中行频率RF和列频率CF的计算公式分别为:
R F = 1 M N ∑ i − 1 M ∑ j − 1 N − 1 ( I ( i , j + 1 ) − I ( i , j ) ) 2 RF = \sqrt{\frac{1}{MN}\sum_{i-1}^{M}\sum_{j-1}^{N-1}(I(i,j+1)-I(i,j))^{2}} RF=MN1i1Mj1N1(I(i,j+1)I(i,j))2
C F = 1 M N ∑ i − 1 M − 1 ∑ j − 1 N ( I ( i + 1 , j ) − I ( i , j ) ) 2 CF = \sqrt{\frac{1}{MN}\sum_{i-1}^{M-1}\sum_{j-1}^{N}(I(i+1,j)-I(i,j))^{2}} CF=MN1i1M1j1N(I(i+1,j)I(i,j))2
其中, I ( i , j ) I(i,j) I(i,j)表示图像在坐标 ( i , j ) (i,j) (i,j)处的灰度值, M M M N N N分别表示图像的行数和列数。
代码如下所示:

    @classmethod
    def SF(cls, img):
        cls.check(img)
        RF = np.sqrt(np.mean((img[1:,:]-img[:-1,:])**2))
        CF = np.sqrt(np.mean((img[:,1:]-img[:,:-1])**2))
        return np.sqrt(RF**2+CF**2)

总结

如果有不懂或者不理解的地方,哪里可以改进的地方,欢迎各位学者们评论,我会一一回复大家《持续更新》。

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 图像融合评价指标是用来评估融合图像质量的方法,常用的评价指标有结构相似性(SSIM)、峰值信噪比(PSNR)、空间频谱特征相似度(SFFS)等。 其中,结构相似性指数(SSIM)是衡量两幅图像相似度的常用指标之一,其计算公式为: SSIM(x, y) = (2μxμy + c1)(2σxy + c2) / (μx² + μy² + c1)(σx² + σy² + c2) 其中,x和y分别表示待评价的融合图像和原始图像,μ和σ分别表示图像均值和标准差,σxy表示协方差,c1和c2是常量,用来避免被0分母除。 峰值信噪比(PSNR)是另一种常用的评价指标,其计算公式为: PSNR(x, y) = 10 * log10(MAX² / MSE) 其中,x和y同样表示待评价的图像,MAX表示像素值的最大范围(一般为255),MSE表示均方误差。 空间频谱特征相似度(SFFS)是一种基于频域的评价指标,其计算过程包括将图像转换到频域,计算频率响应差异,以及对差异进行加权等。 为了实现图像融合评价指标的计算,可以使用Python编程语言编写GUI代码。其中,GUI界面可以包括上传待评价和原始图像的按钮,计算评价指标的按钮,以及显示评价结果的区域。在计算评价指标的功能函数中,可以根据公式来进行计算,并将结果显示在GUI界面的评价结果区域中。 需要注意的是,图像融合评价指标的计算需要依赖一些图像处理库,如OpenCV和NumPy等,可以通过安装相应的库来实现所需的功能。 以上是关于图像融合评价指标GUI代码的简要介绍,具体实现还需要根据具体需求进行编写。 ### 回答2: 图像融合评价指标是用来衡量图像融合结果质量的方法。常见的评价指标有结构相似度(SSIM)、峰值信噪比(PSNR)等。 下面是一个用Python编写的图像融合评价指标的GUI代码示例: ```python import tkinter as tk from tkinter import filedialog import cv2 import numpy as np from skimage.metrics import structural_similarity as compare_ssim def load_image(): filename = filedialog.askopenfilename(initialdir="/", title="Select an Image", filetypes=(("Image files", "*.jpg *.jpeg *.png"), ("All files", "*.*"))) image = cv2.imread(filename) cv2.imshow("Image", image) return image def calculate_metrics(): img1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) img2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) ssim = compare_ssim(img1, img2) psnr = cv2.PSNR(img1, img2) ssim_label.config(text="SSIM: {:.4f}".format(ssim)) psnr_label.config(text="PSNR: {:.4f}".format(psnr)) root = tk.Tk() root.title("图像融合评价指标计算器") button1 = tk.Button(root, text="选择图像1", command=lambda: load_image()) button1.pack() button2 = tk.Button(root, text="选择图像2", command=lambda: load_image()) button2.pack() calculate_button = tk.Button(root, text="计算评价指标", command=lambda: calculate_metrics()) calculate_button.pack() ssim_label = tk.Label(root, text="SSIM: ") ssim_label.pack() psnr_label = tk.Label(root, text="PSNR: ") psnr_label.pack() root.mainloop() ``` 这个代码实现了一个简单的图像融合评价指标计算器的GUI界面。用户可以通过点击按钮选择两个图像文件,然后点击计算评价指标按钮,程序会对两个图像进行评估,计算出SSIM和PSNR,并在界面上显示出来。 ### 回答3: 图像融合评价指标是用来评价图像融合算法效果的一种指标。常用的图像融合评价指标有:均方误差(MSE)、峰值信噪比(PSNR)、结构相似性(SSIM)等。 下面是一个简单的图像融合评价指标的GUI代码示例: ```python import cv2 from tkinter import * from tkinter import filedialog import numpy as np from skimage import metrics def open_image(): filename = filedialog.askopenfilename(initialdir="/", title="Select file", filetypes=(("jpeg files", "*.jpg"), ("all files", "*.*"))) image = cv2.imread(filename) return image def calculate_metrics(image1, image2): mse = np.mean((image1 - image2)**2) psnr = metrics.peak_signal_noise_ratio(image1, image2) ssim = metrics.structural_similarity(image1, image2, multichannel=True) return mse, psnr, ssim def display_metrics(): image1 = open_image() image2 = open_image() mse, psnr, ssim = calculate_metrics(image1, image2) print("MSE:", mse) print("PSNR:", psnr) print("SSIM:", ssim) # 在GUI界面中显示评价指标 mse_label.config(text="MSE: " + str(mse)) psnr_label.config(text="PSNR: " + str(psnr)) ssim_label.config(text="SSIM: " + str(ssim)) # 创建GUI界面 root = Tk() root.title("图像融合评价指标") root.geometry("400x200") # 创建按钮和标签 open_button1 = Button(root, text="打开图像1", command=open_image) open_button1.pack() open_button2 = Button(root, text="打开图像2", command=open_image) open_button2.pack() metrics_button = Button(root, text="计算评价指标", command=display_metrics) metrics_button.pack() mse_label = Label(root, text="") mse_label.pack() psnr_label = Label(root, text="") psnr_label.pack() ssim_label = Label(root, text="") ssim_label.pack() root.mainloop() ``` 这段代码中,我们使用了OpenCV库和scikit-image库来处理图像和计算评价指标。通过GUI界面,可以选择两个图像,并计算评价指标,并将结果显示在界面上。当用户点击打开图像按钮时,会调用open_image函数打开图像文件,并返回图像的矩阵。然后,通过calculate_metrics函数计算图像融合评价指标,并将结果打印出来。最后,使用Tkinter库创建GUI界面,包括打开图像按钮、计算评价指标按钮和显示评价指标的标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值