当前位置:   article > 正文

图像融合质量评价方法AG、SF、STD、MI与NMI(二)_nmi图像

nmi图像

1 前言

上次介绍了5种可以直接调用skimage库就可以实现的融合图像评估方法,这次介绍需要自己实现的5种指标,本文的代码均是基于python实现的。上一篇文章详见图像融合质量评价方法SSIM、PSNR、EN、MSE与NRMSE(一),后续更新图像融合质量评价方法MSSIM、MS-SSIM、FS、Qmi、Qabf与VIFF(三)图像融合质量评价方法FMI(四)

2 融合评价指标介绍

2.1 平均梯度 AG

平均梯度(Average Gradient)可以用于衡量融合图像的清晰程度,可以认为平均梯度越大,图像清晰度越好,融合质量越好。计算公式如下: A G    =    1 ( M − 1 ) ( N − 1 ) ∑ i = 1 M − 1 ∑ i = 1 N − 1 ( H ( i + 1 , j ) − H ( i , j ) ) 2 + ( H ( i , j + 1 ) − H ( i , j ) ) 2 2 AG\;=\;\frac1{(M-1)(N-1)}\sum_{i=1}^{M-1}\sum_{i=1}^{N-1}\sqrt{\frac{(H(i+1,j)-H{(i,j))}^2+(H(i,j+1)-H{(i,j))}^2}2} AG=(M1)(N1)1i=1M1i=1N12(H(i+1,j)H(i,j))2+(H(i,j+1)H(i,j))2 其中H表示融合图像,M与N分别表示图像的高和宽。

2.2 空间频率 SF

空间频率(Spatial Frequency)反映图像灰度的变化率,空间频率越大表示图像越清晰,融合图像质量越好。其计算公式如下: S F    =    R F 2 + C F 2 SF\;=\;\sqrt{RF^2+CF^2} SF=RF2+CF2 其中 R F    =    1 M N ∑ i = 1 M ∑ j = 1 N ∣ H ( i , j ) − H ( i , j − 1 ) ∣ 2 RF\;=\;\sqrt{\frac1{MN}\sum_{i=1}^M\sum_{j=1}^N\left|H(i,j)-H(i,j-1)\right|^2} RF=MN1i=1Mj=1NH(i,j)H(i,j1)2 C F    =    1 M N ∑ i = 1 M ∑ j = 1 N ∣ H ( i , j ) − H ( i − 1 , j ) ∣ 2 CF\;=\;\sqrt{\frac1{MN}\sum_{i=1}^M\sum_{j=1}^N\left|H(i,j)-H(i-1,j)\right|^2} CF=MN1i=1Mj=1NH(i,j)H(i1,j)2

2.3 标准差 STD

计算标准差的公式如下: S T D    =    1 M N ∑ i = 1 M ∑ j = 1 N [ H ( i , j ) − H ‾ ] 2 STD\;=\;\sqrt{\frac1{MN}\sum_{i=1}^M\sum_{j=1}^N\left[H(i,j)-\overline H\right]^2} STD=MN1i=1Mj=1N[H(i,j)H]2 其中 H ‾ \overline H H表示均值(Mean),也可以用于评估融合图像: H ‾    =    1 M N ∑ i = 1 M ∑ j = 1 N H ( i , j ) \overline H\;=\;\frac1{MN}\sum_{i=1}^M\sum_{j=1}^NH(i,j) H=MN1i=1Mj=1NH(i,j)标准差是度量图像信息丰富程度的一个客观评价指标,该值越大,则图像的灰度级分布就越分散,图像携带的信息量就越多,融合图像质量就越好。而均值衡量是一个反映亮度信息的指标,均值适中,则融合图像质量越好。

2.4 互信息 MI

互信息(Mutual Information),可度量两幅图像之间的相似程度,即融合图像获取了原图像信息量的多少。互信息越大,表示融合图像保留更多源图像信息,质量越好。互信息是根据图像的信息熵H(A)和联合信息熵H(A,B): M I ( A , B )    =    H ( A ) + H ( B ) − H ( A , B ) MI(A,B)\;=\;H(A)+H(B)-H(A,B) MI(A,B)=H(A)+H(B)H(A,B)

2.5 标准化互信息 NMI

标准化互信息(Normalized mutual information)是度量图片相似的一种方式,NMI的值越大,表示融合图像保留更多源图像的信息,效果更好。关于细节可以看Comments on 'Information measure for performance of image fusion这篇文章 N M I ( A , B )    =    I ( A , B ) M a x ( H ( A ) , H ( B ) ) NMI(A,B)\;=\;\frac{I(A,B)}{Max(H(A),H(B))} NMI(A,B)=Max(H(A),H(B))I(A,B)

3 代码实现

3.1 平均梯度AG python实现

根据上面的公式,可以得到代码如下:

import cv2
import numpy as np
import math


def avgGradient(image):
    width = image.shape[1]
    width = width - 1
    heigt = image.shape[0]
    heigt = heigt - 1
    tmp = 0.0

    for i in range(width):
	    for j in range(heigt):
		    dx = float(image[i,j+1])-float(image[i,j])
		    dy = float(image[i+1,j])-float(image[i,j])
		    ds = math.sqrt((dx*dx+dy*dy)/2)
		    tmp += ds
    
    imageAG = tmp/(width*heigt)
    return imageAG

if __name__ == '__main__':
	image = cv2.imread('1.png',0)
	print(avgGradient(image))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3.2 空间频率SF python实现

在网上找不到空间频率的代码,python代码是根据上面的公式推出的:

#计算空间频率
#根据公式推断出来的,不一定正确
import cv2
import numpy as np
import math

def spatialF(image):
	M = image.shape[0]
	N = image.shape[1]
	
	cf = 0
	rf = 0


	for i in range(1,M-1):
		for j in range(1,N-1):
			dx = float(image[i,j-1])-float(image[i,j])
			rf += dx**2
			dy = float(image[i-1,j])-float(image[i,j])
			cf += dy**2

	RF = math.sqrt(rf/(M*N))
	CF = math.sqrt(cf/(M*N))
	SF = math.sqrt(RF**2+CF**2)

	return SF


if __name__ == '__main__':
	# 这样读取后已经是灰度图
    image = cv2.imread('1.png',0)
    print(spatialF(image))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

3.3 标准差STD 利用cv2库

想要得到标准差和均值,利用cv2.meanStdDev()函数即可:

import cv2
import numpy as np

# 这样读取后已经是灰度图
image = cv2.imread('1.png',0)

(mean,stddv) = cv2.meanStdDev(image)

# 输出平均值
print(mean)

# 输出标准差
print(stddv)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.4 互信息MIpython实现

MI的python代码参考了另一版本的matlab代码:

import numpy as np
import cv2
import math

def getMI(im1,im2):

    #im1 = im1.astype('float')
    #im2 = im2.astype('float')

    hang, lie = im1.shape
    count = hang*lie
    N = 256

    h = np.zeros((N,N))

    for i in range(hang):
        for j in range(lie):
            h[im1[i,j],im2[i,j]] = h[im1[i,j],im2[i,j]]+1

    h = h/np.sum(h)

    im1_marg = np.sum(h,axis=0)
    im2_marg = np.sum(h, axis=1)

    H_x = 0
    H_y = 0

    for i in range(N):
        if(im1_marg[i]!=0):
            H_x = H_x + im1_marg[i]*math.log2(im1_marg[i])

    for i in range(N):
        if(im2_marg[i]!=0):
            H_x = H_x + im2_marg[i]*math.log2(im2_marg[i])

    H_xy = 0

    for i in range(N):
        for j in range(N):
            if(h[i,j]!=0):
                H_xy = H_xy + h[i,j]*math.log2(h[i,j])

    MI = H_xy-H_x-H_y

    return MI

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

4 总结

这次介绍了5种也是比较常见的融合图像评价方法,下次应该会出现一些比较少见的…

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/239043
推荐阅读
相关标签
  

闽ICP备14008679号