1. 引言
做遥感超分辨率重建有一段时间了,其中重要一环就是评价重建质量。对于遥感影像的重建来说,一般有RMSE
,ERGAS
,SAM
,SRE
等。对于数学解释,本文不做介绍。
2.Python实现
2.1 RMSE(均方根误差)
注意fake_hr为我的重建影像,real_hr为真实label影像。
def rmse(fake_hr, real_hr):
if len(fake_hr.shape) == 3:
channels = fake_hr.shape[2]
else:
channels = 1
fake_hr = np.reshape(fake_hr, (fake_hr.shape[0], fake_hr.shape[1], 1))
real_hr = np.reshape(real_hr, (real_hr.shape[0], real_hr.shape[1], 1))
fake_hr = fake_hr.astype(np.float32)
real_hr = real_hr.astype(np.float32)
def single_rmse(img1, img2):
diff = img1 - img2
mse = np.mean(np.square(diff))
return np.sqrt(mse)
rmse_sum = 0
for band in range(channels):
fake_band_img = fake_hr[:, :, band]
real_band_img = real_hr[:, :, band]
rmse_sum += single_rmse(fake_band_img, real_band_img)
rmse = round(rmse_sum, 2)
return rmse
2.2 ERGAS
ERGAS的计算是在RMSE的基础之上的。
def ERGAS(hr_mul, label, lr_mul):
"""
calc ergas.
"""
h = 30 #高分辨率影像分辨率
l = 120 #低分辨率影像分辨率
# 此处也可通过列数计算,此处只是完全按照定义来看
channels = hr_mul.shape[2]
inner_sum = 0
for channel in range(channels):
band_img1 = hr_mul[:, :, channel]
band_img2 = label[:, :, channel]
band_img3 = lr_mul[:, :, channel]
rmse_value = rmse(band_img1, band_img2)
m = np.mean(band_img3)
inner_sum += np.power((rmse_value/m), 2)
mean_sum = inner_sum/channels
ergas = 100*(h/l)*np.sqrt(mean_sum)
return ergas
2.3 SAM(波谱角)
这段代码完全是PSGAN论文计算的代码,下面给出论文名称:
PSGAN: A Generative Adversarial Network for Remote Sensing Image Pan-sharpening
值得注意的是,这段代码计算出来是弧度制,一般的论文对比时还要转换成角度制。
def SAM(x_true, x_pred):
"calculate method in PSGAN code"
assert x_true.ndim ==3 and x_true.shape == x_pred.shape
dot_sum = np.sum(x_true*x_pred,axis=2)
norm_true = np.linalg.norm(x_true, axis=2)
norm_pred = np.linalg.norm(x_pred, axis=2)
res = np.arccos(dot_sum/norm_pred/norm_true)
is_nan = np.nonzero(np.isnan(res))
for (x,y) in zip(is_nan[0], is_nan[1]):
res[x,y]=0
sam = np.mean(res)
return sam
2.4 SRE(信号与重构误差比)
def sre(pred_img, org_img):
org_img = org_img.astype(np.float32)
sre_final = []
for i in range(org_img.shape[2]):
numerator = np.square(np.mean(org_img[:, :, i]))
denominator = (np.linalg.norm(org_img[:, :, i] - pred_img[:, :, i])) /\
(org_img.shape[0] * org_img.shape[1])
sre_final.append(numerator/denominator)
return 10 * np.log10(np.mean(sre_final))