影像分辨率对地表数据影响--以地形因子slope为例
影像分辨率对地表数据影响--以地形因子slope为例
遥感影像分辨率是用于记录数据的最小度量单位,一般用来描述在显示设备上所能够显示的点的数量(行、列),或在影像中一个像元点所表示的面积。随着遥感技术的不断发展,卫星影像空间分辨率越来越高,高分辨率遥感影像的分辨率已提升至亚米级。
但对于研究或者影像处理,选择合适的分辨率是及其重要,那么是不是分辨率越高越好?以地形分析中坡度为例,存在两个问题:
(1)随着分辨率的变大,地形变化区域平稳,其中的数学原理是什么?
(2)多大的分辨率是地形拟合的最优分辨率选择?
坡度的定义和计算
坡度(slope)是地表单元陡缓的程度,通常把坡面的垂直高度h和水平方向的距离的比叫做坡度(或叫做坡比)用字母i表示,即坡角的正切值。
坡度的计算方法有两种:
- 通过百分比计算坡度:计算公式为:(垂直升高 / 水平距离) × 100%。例如,如果一段斜坡垂直升高10米,水平距离100米,那么坡度为10%。
- 通过角度计算坡度:可以使用反正切函数(arctan)来计算坡度的角度。计算公式为:arctan(垂直升高 / 水平距离)。计算结果以度为单位。
在ArcGIS中,坡度是基于算子来计算得到的?(计算公式比较奇怪,还没搞懂)
解决方案
上述问题可以等价转化为在一个剖面线上,等分定义域后相邻两点的斜率变化和数值分布情况,由此,我们假设一条曲线,y=sin x,迭代等分并计算相邻两点的斜率值。上述在Python环境中,可以实现,代码见附录。进行9次迭代;平分点即相当于采样间距,函数图像相当于地球表面,结果如下图所示。
可知,当分辨率趋于无穷大时,坡度值趋于0;当分辨率(迭代次数变大),坡度值的变化趋于y=cos(x+@)。即分辨率越高,对地形的表达越准确,反之地形概化越严重。
对坡度值绘制箱型图,可以发现所有的坡度值(tan值)集中于[-1,1],且随着迭代次数的提高,坡度值越密集,呈堆状分布;在函数的边界坡度值易形成数据堆积。
坡度计算的相关理论支撑
(1)边缘效应
使用 3 像元 x 3 像元的邻域(移动窗口)来执行平面和测地线计算。对于每个邻域,如果处理(中心)像元为 NoData,则输出也为 NoData。计算还要求至少 7 个与处理像元相邻的像元具有有效值。如果有效像元少于 7 个,则不执行计算,并且该处理像元处的输出将为 NoData。输出栅格最外侧行列的像元为 NoData。这是因为沿着输入数据集边界,这些像元没有足够的有效相邻像元。
(2)坡度的不确定性
附录
代码:
import numpy as np
import matplotlib.pyplot as plt
# 定义绘制正弦函数并计算斜率的函数
def plot_sine_and_calculate_slopes(x_min, x_max, total_iterations):
# 初始等分数
divisions = 1
for iteration in range(total_iterations):
print(f"--- 第 {iteration + 1} 次迭代 ---") # 用于区分每次迭代的开始
# 生成 x 值
x = np.linspace(x_min, x_max, divisions)
# 计算 y 值(正弦函数)
y = np.sin(x)
# 绘制正弦函数
plt.figure(figsize=(10, 5))
plt.plot(x, y, label='Sine Function')
# 计算并打印斜率
for i in range(1, len(x)):
slope = (y[i] - y[i - 1]) / (x[i] - x[i - 1])
#print(f' 斜率: 在 x={x[i - 1]:.2f} 和 x={x[i]:.2f} 之间为: {slope:.4f}') # 增加缩进以区分
print(slope) # 增加缩进以区分
# 绘制等分点
plt.scatter(x, y, color='red')
# 更新等分数,下一次迭代是上一次的两倍
divisions *= 2
plt.legend()
plt.grid(True)
plt.show()
# 调用函数,绘制正弦函数并计算斜率
plot_sine_and_calculate_slopes(-10, 10, 9) # 进行 9次迭代