问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

影像分辨率对地表数据影响--以地形因子slope为例

创作时间:
作者:
@小白创作中心

影像分辨率对地表数据影响--以地形因子slope为例

引用
1
来源
1.
https://www.bilibili.com/opus/955853243855929350

遥感影像分辨率是用于记录数据的最小度量单位,一般用来描述在显示设备上所能够显示的点的数量(行、列),或在影像中一个像元点所表示的面积。随着遥感技术的不断发展,卫星影像空间分辨率越来越高,高分辨率遥感影像的分辨率已提升至亚米级。

但对于研究或者影像处理,选择合适的分辨率是及其重要,那么是不是分辨率越高越好?以地形分析中坡度为例,存在两个问题:

(1)随着分辨率的变大,地形变化区域平稳,其中的数学原理是什么?
(2)多大的分辨率是地形拟合的最优分辨率选择?

坡度的定义和计算

坡度(slope)是地表单元陡缓的程度,通常把坡面的垂直高度h和水平方向的距离的比叫做坡度(或叫做坡比)用字母i表示,即坡角的正切值。

坡度的计算方法有两种:

  1. 通过百分比计算坡度:计算公式为:(垂直升高 / 水平距离) × 100%。例如,如果一段斜坡垂直升高10米,水平距离100米,那么坡度为10%。
  2. 通过角度计算坡度:可以使用反正切函数(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次迭代
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号