遥感影像重建评价指标及其python代码实现

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))
  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值