融合图像的各种评价指标及代码实现
该篇文章主要用于梳理有关图像融合的各种评价指标及如何使用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=1∑nP(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)=x∈X∑y∈Y∑p(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=1∑n(yi−yi^)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)
l(x,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=1∑Mj=1∑N(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=MN1i−1∑Mj−1∑N−1(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=MN1i−1∑M−1j−1∑N(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)
总结
如果有不懂或者不理解的地方,哪里可以改进的地方,欢迎各位学者们评论,我会一一回复大家《持续更新》。