融合质量无参考指标 (QNR) 详细介绍
QNR(Quality with No Reference)指标是一种用于评估图像融合效果的无参考质量评价方法。它主要应用于全色图像(PAN)和多光谱图像(MS)融合任务中,用来衡量融合后图像的质量。QNR综合考虑了光谱失真和空间失真,能够在没有参考图像的情况下评估融合效果。
QNR 指标的组成部分
QNR 指标由两个主要成分组成:光谱失真指数(Spectral Distortion Index, D λ D_\lambda Dλ)和空间失真指数(Spatial Distortion Index, D s D_s Ds)。QNR 的计算公式如下:
Q N R = ( 1 − D λ ) α ⋅ ( 1 − D s ) β QNR = (1 - D_\lambda)^\alpha \cdot (1 - D_s)^\beta QNR=(1−Dλ)α⋅(1−Ds)β
其中:
- D λ D_\lambda Dλ:光谱失真指数,衡量融合图像相对于原始多光谱图像的光谱失真。
- D s D_s Ds:空间失真指数,衡量融合图像相对于原始全色图像的空间失真。
- α \alpha α 和 β \beta β:用于调整光谱和空间失真对整体质量的影响。
QNR 计算步骤
-
读取影像数据:首先读取原始全色图像(PAN)和多光谱图像(MS)以及融合图像的数据。
-
计算光谱失真指数 D λ D_\lambda Dλ:
- 获取多光谱图像和融合图像中的每个波段。
- 对每个波段对,计算融合图像和多光谱图像之间的UQI(Universal Quality Index)值。
- 计算所有波段对之间的UQI差异,得到光谱失真指数。
-
计算空间失真指数 D s D_s Ds:
- 将高分辨率全色图像进行均值滤波和降采样,得到与低分辨率多光谱图像相同分辨率的降质全色图像。
- 对每个波段,计算融合图像和高分辨率全色图像之间的UQI值,以及低分辨率多光谱图像和降质全色图像之间的UQI值。
- 计算所有波段的UQI差异,得到空间失真指数。
-
计算 QNR 值:使用公式 Q N R = ( 1 − D λ ) α ⋅ ( 1 − D s ) β QNR = (1 - D_\lambda)^\alpha \cdot (1 - D_s)^\beta QNR=(1−Dλ)α⋅(1−Ds)β 计算 QNR 值。
代码示例
以下是计算 QNR 的 Python 代码示例:
def d_lambda(ms, fused, p=1):
"""计算光谱失真指数(D_lambda)。
:param ms: 低分辨率多光谱图像。
:param fused: 高分辨率融合图像。
:param p: 用于强调较大光谱差异的参数(默认值为1)。
:returns: float -- D_lambda。
"""
L = ms.shape[2]
M1 = np.zeros((L, L))
M2 = np.zeros((L, L))
for l in range
代码实现
d_lambda
函数
def d_lambda(ms, fused, p=1):
"""计算光谱失真指数(D_lambda)。
:param ms: 低分辨率多光谱图像。
:param fused: 高分辨率融合图像。
:param p: 用于强调较大光谱差异的参数(默认值为1)。
:returns: float -- D_lambda。
"""
L = ms.shape[2]
M1 = np.zeros((L, L))
M2 = np.zeros((L, L))
for l in range(L):
for r in range(l, L):
M1[l, r] = M1[r, l] = uqi(fused[:, :, l], fused[:, :, r])
M2[l, r] = M2[r, l] = uqi(ms[:, :, l], ms[:, :, r])
diff = np.abs(M1 - M2) ** p
return (1. / (L * (L - 1)) * np.sum(diff)) ** (1. / p)
- 目的:计算光谱失真指数(
D_lambda
),用于量化融合图像相对于多光谱图像的光谱失真。 - 参数:
ms
:低分辨率多光谱图像(3D数组)。fused
:高分辨率融合图像(3D数组)。p
:用于强调较大光谱差异的参数(默认为1)。
- 过程:
L = ms.shape[2]
:获取光谱波段的数量。- 初始化两个矩阵
M1
和M2
用于存储UQI值。 - 双重循环计算融合图像和多光谱图像中每对波段的UQI。
diff
存储M1
和M2
之间的绝对差值并将其提升至p
次方。- 返回光谱失真指数。
d_s
函数
def d_s(pan, ms, fused, q=1, r=4, ws=7):
"""计算空间失真指数(D_S)。
:param pan: 高分辨率全色图像。
:param ms: 低分辨率多光谱图像。
:param fused: 高分辨率融合图像。
:param q: 用于强调较大空间差异的参数(默认值为1)。
:param r: 高分辨率与低分辨率的比例(默认值为4)。
:param ws: 滑动窗口大小(默认值为7)。
:returns: float -- D_S。
"""
pan = pan.astype(np.float64)
fused = fused.astype(np.float64)
pan_degraded = uniform_filter(pan.astype(np.float64), size=ws) / (ws ** 2)
pan_degraded = imresize(pan_degraded, (pan.shape[0] // r, pan.shape[1] // r))
L = ms.shape[2]
M1 = np.zeros(L)
M2 = np.zeros(L)
for l in range(L):
M1[l] = uqi(fused[:, :, l], pan)
M2[l] = uqi(ms[:, :, l], pan_degraded)
diff = np.abs(M1 - M2) ** q
return ((1. / L) * (np.sum(diff))) ** (1. / q)
- 目的:计算空间失真指数(
D_S
),用于量化融合图像相对于全色图像的空间失真。 - 参数:
pan
:高分辨率全色图像。ms
:低分辨率多光谱图像。fused
:高分辨率融合图像。q
:用于强调较大空间差异的参数(默认为1)。r
:高分辨率与低分辨率的比例(默认为4)。ws
:滑动窗口大小(默认为7)。
- 过程:
- 将
pan
和fused
转换为浮点型。 - 使用均值滤波器对全色图像进行降质处理,并缩放到低分辨率。
- 获取多光谱图像的波段数量。
- 初始化两个数组
M1
和M2
用于存储UQI值。 - 循环计算每个波段的融合图像与全色图像、低分辨率多光谱图像与降质全色图像的UQI值。
diff
存储M1
和M2
之间的绝对差值并将其提升至q
次方。- 返回空间失真指数。
- 将
qnr
函数
def qnr(pan, ms, fused, alpha=1, beta=1, p=1, q=1, r=4, ws=7):
"""计算无参考质量指标(QNR)。
:param pan: 高分辨率全色图像。
:param ms: 低分辨率多光谱图像。
:param fused: 高分辨率融合图像。
:param alpha: 强调光谱失真对整体的影响。
:param beta: 强调空间失真对整体的影响。
:param p: 用于强调较大光谱差异的参数(默认值为1)。
:param q: 用于强调较大空间差异的参数(默认值为1)。
:param r: 高分辨率与低分辨率的比例(默认值为4)。
:param ws: 滑动窗口大小(默认值为7)。
:returns: float -- QNR。
"""
a = (1 - d_lambda(ms, fused, p=p)) ** alpha
b = (1 - d_s(pan, ms, fused, q=q, ws=ws, r=r)) ** beta
return a * b
- 目的:计算无参考质量指标(
QNR
),用于量化融合图像的整体质量。 - 参数:
pan
:高分辨率全色图像。ms
:低分辨率多光谱图像。fused
:高分辨率融合图像。alpha
:强调光谱失真对整体的影响。beta
:强调空间失真对整体的影响。p
:用于强调较大光谱差异的参数(默认为1)。q
:用于强调较大空间差异的参数(默认为1)。r
:高分辨率与低分辨率的比例(默认为4)。ws
:滑动窗口大小(默认为7)。
- 过程:
- 计算光谱失真指数
D_lambda
并进行调整。 - 计算空间失真指数
D_S
并进行调整。 - 返回
QNR
值,通过光谱和空间失真指数的调整值相乘得到。
- 计算光谱失真指数