文章目录
- 1 前言
- 2 融合评价指标介绍
- 2.1 平均梯度 AG
- 2.2 空间频率 SF
- 2.3 标准差 STD
- 2.4 互信息 MI
- 2.5 标准化互信息 NMI
- 3 代码实现
- 3.1 平均梯度AG python实现
- 3.2 空间频率SF python实现
- 3.3 标准差STD 利用cv2库
- 3.4 互信息MIpython实现
- 4 总结
1 前言
上次介绍了5种可以直接调用skimage库就可以实现的融合图像评估方法,这次介绍需要自己实现的5种指标,本文的代码均是基于python实现的。上一篇文章详见图像融合质量评价方法SSIM、PSNR、EN、MSE与NRMSE(一),后续更新图像融合质量评价方法MSSIM、MS-SSIM、FS、Qmi、Qabf与VIFF(三) 和图像融合质量评价方法FMI(四)
2 融合评价指标介绍
2.1 平均梯度 AG
平均梯度(Average Gradient)可以用于衡量融合图像的清晰程度,可以认为平均梯度越大,图像清晰度越好,融合质量越好。计算公式如下:其中H表示融合图像,M与N分别表示图像的高和宽。
2.2 空间频率 SF
空间频率(Spatial Frequency)反映图像灰度的变化率,空间频率越大表示图像越清晰,融合图像质量越好。其计算公式如下:其中
2.3 标准差 STD
计算标准差的公式如下:其中表示均值(Mean),也可以用于评估融合图像:标准差是度量图像信息丰富程度的一个客观评价指标,该值越大,则图像的灰度级分布就越分散,图像携带的信息量就越多,融合图像质量就越好。而均值衡量是一个反映亮度信息的指标,均值适中,则融合图像质量越好。
2.4 互信息 MI
互信息(Mutual Information),可度量两幅图像之间的相似程度,即融合图像获取了原图像信息量的多少。互信息越大,表示融合图像保留更多源图像信息,质量越好。互信息是根据图像的信息熵H(A)和联合信息熵H(A,B):
2.5 标准化互信息 NMI
标准化互信息(Normalized mutual information)是度量图片相似的一种方式,NMI的值越大,表示融合图像保留更多源图像的信息,效果更好。关于细节可以看Comments on 'Information measure for performance of image fusion这篇文章
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))
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))
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)
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
4 总结
这次介绍了5种也是比较常见的融合图像评价方法,下次应该会出现一些比较少见的…