☰
从DN值到地表反射率:Landsat 8遥感影像处理与变化监测全链路
2026/11/4 16:38:51 网站建设 项目流程

简介:面向地理信息科学与遥感专业学习者的一份ENVI软件实习报告,围绕Landsat8多光谱影像的完整处理流程展开,可作为课程实验、软件操作练习与报告撰写时的对照范本。文档依次记录波段组合、图像裁剪、辐射定标与反射率求算、大气校正及效果比较、Brovey与HSV及主成分变换的图像融合、水体提取与植被覆盖度估算、温度反演等环节,并配有监督与非监督分类、定性目视解译与定量指标对比、温度反演结果图及土地利用变化分析,末尾附实习心得体会。压缩包内仅含1个docx文件,约7.92MB,图文并排呈现操作步骤与成像结果,篇幅完整、条理清晰,适合按目录逐节复现实验或直接对照检查自己的处理流程。已有1246人学习下载,对初次接触ENVI、需要理清辐射定标与大气校正思路的读者尤为实用。

1. 从 DN 值到反射率:一张 Landsat 影像到底要过几道手

很多人第一次做遥感影像处理,都会有一个下意识的动作:把影像一打开,看到绿油油的山、灰白的建筑,就以为数据已经可以用了。真正反直觉的地方在这里——屏幕上那些 0 到 65535 的整数,跟你想要的“地表反射率”之间隔着整整四五道工序,任何一步不做或者做错,后面算出来的 NDVI、温度、分类图,看起来依旧是张漂亮的图,但数值全是假的。

这份遥感地信实习报告记录的就是这条完整链路:两期 Landsat 8 影像,从裁剪、波段堆叠、辐射定标、FLAASH 大气校正,一路做到融合、水体与植被覆盖度提取、温度反演、监督与非监督分类,最后落到土地利用变化监测。它之所以值得逐段拆开看,不在于步骤多,而在于每一步都在回答同一个问题:这一层运算把“数字”变成了什么“物理量”,又把什么误差引了进来。搞清这条链,比记住 ENVI 里点哪个按钮有用得多。

2. 辐射定标与大气校正:FLAASH 到底在解哪个方程

2.1 DN 值不是物理量:增益和偏置在做的是什么

传感器记录下来的原始值叫 DN(Digital Number),它只表示“这个探测器在这个时刻输出了多大的电压,被量化成了整数”。同一块地,今天和三个月后拍出来的 DN 值可以差很多,因为太阳高度角变了、大气浑浊度变了、探测器增益档位也可能变了。所以 DN 值本身不具备跨影像可比性,更不能直接代进物理公式。

辐射定标就是把 DN 拉回物理量的第一步,用的是线性模型:

# Landsat 8 OLI 辐射定标:DN -> 辐亮度 # RADIANCE_MULT_BAND_x / RADIANCE_ADD_BAND_x 来自影像自带的 MTL 元数据文件 # 注意:不同波段有不同的 MULT 和 ADD,不能共用一套系数 import numpy as np def dn_to_radiance(dn, mult, add): """ dn : 原始数字量化值(uint16 数组) mult : 各波段的 RADIANCE_MULT,单位 W/(m2*sr*um) add : 各波段的 RADIANCE_ADD,单位同上 返回 : 辐亮度数组,浮点型 """ dn = dn.astype(np.float32) # 先乘后加,顺序不能反;系数由元数据给出,逐波段对应 radiance = dn * mult + add # 定标后必须检查有效范围,负值通常是噪声或填充值 radiance[dn <= 0] = np.nan return radiance def radiance_to_reflectance(radiance, sun_elev_deg, mult, add): """ 辐亮度 -> 大气顶层反射率(TOA reflectance) sun_elev_deg : 太阳高度角,取自 MTL 中的 SUN_ELEVATION """ sun_zenith = np.deg2rad(90.0 - sun_elev_deg) # 高度角转天顶角 toa = (radiance * mult + add) / np.sin(sun_zenith) return toa

第一段代码里两个参数的含义必须分清:mult和add是辐亮度定标系数,而反射率那一步用的mult、add是反射率定标系数,两套系数都写在 MTL 文件里,不能混用。这是新手最常见的错误之一。第二个坑是波段顺序和中心波长:ENVI 里Layer Stacking把 1 到 8 波段按顺序拼起来后,头文件里并没有自动带上每个波段的中心波长,必须手动Edit Header填进去,单位要选 Micrometers。中心波长填错的后果不会立刻显示——图像看着一切正常,但一旦进 FLAASH,波段响应函数对不上,输出的反射率曲线会整体漂移,甚至出现负值。

这份报告里还有一个细节值得注意:定标完成后把波段数从 8 改成 7,也就是把第 8 波段(全色)单独摘出去。原因是全色波段的光谱响应范围覆盖了可见光到近红外一大片,它不是“一个窄波段”,塞进多光谱立方体里做大气校正没有物理意义。它后面只服务于图像融合,和反射率计算是两条线。

2.2 为什么 FLAASH 死磕 BIL 格式,而 ENVI 默认给你 BSQ

文件格式这件事最容易被当成玄学。ENVI 默认的存储顺序是 BSQ(Band Sequential),也就是先存完第 1 波段所有像元,再存第 2 波段。而 FLAASH 这类基于逐像元光谱曲线的算法,需要的恰恰是同一个像元在各波段上的连续取值,也就是 BIL(Band Interleaved by Line)。算法每走一个像元就要把整条光谱曲线一次性读进来,用 BSQ 的话中间隔着一整个波段的数据量,缓存命中率极低。

所以流程里“先把 BSQ 转成 BIL”不是为了兼容,是性能与访存模型决定的。常见的实现思路是,ENVI 在内部会按行块读取,BIL 让同一条光谱在物理存储上相邻,能一次性喂进 FLAASH 的求解器。这一步不做,FLAASH 要么直接拒绝,要么读进去之后波段错位,出来一张光谱完全错乱的图——而且它不会报错,只是结果不对,这种不报错的失败最麻烦。

FLAASH 求解的核心是大气辐射传输方程:

L = (A·ρ) / (1 − ρ_e·S) + (B·ρ_e) / (1 − ρ_e·S) + L_a

其中 L 是传感器收到的辐亮度,ρ 是地表反射率,ρ_e 是像元与背景的平均反射率,S 是大气球面反照率,L_a 是大气程辐射,A、B 是由大气状态决定的系数。这个式子之所以写成这样,是因为它要处理“邻近效应”:一个像元接收到的光,有一部分来自周边地物经大气散射后折回来的光,而不是从正下方反射上去的。所以 FLAASH 解的不是一个简单的减法,而是对每个像元做一次反卷积式的迭代。

2.3 三个参数决定成败:高程、大气模型、气溶胶

FLAASH 的参数面板看着密密麻麻,真正能改变结果量级的是三个。

高程决定大气柱的总量。研究区平均海拔约 970 m,如果按默认的 0 填,大气纠正会“多纠正”一截,整幅图反射率系统性偏低。这个数字必须去查真实地形数据,不能用影像中心点附近随便估。

大气模型选的是中纬度夏季(MLS),它背后是一张按纬度和季节组织的大气廓线表,规定了水汽、臭氧、温度随高度的分布。选错季节,近红外波段的水汽吸收校正就会偏,植被指数随之整体漂移。

气溶胶模型选 urban,这个选择影响的是气溶胶光学厚度的反演先验。城市型气溶胶的粒径分布和散射相函数与乡村型、海洋型不同,选错直接表现为蓝波段校正过度或不足——蓝波段恰恰是对气溶胶最敏感的那个通道。

还有一个被反复强调但总有人犯的错:时间参数要填影像成像时间,不是文件生成时间。Landsat 8 从成像到产品生成常常隔几天,甚至处理延迟更久。太阳几何位置在这几天里会变化,太阳天顶角一错,FLAASH 内部计算的辐照度就错,反射率整体偏。原报告里专门点名了这一点,是踩过坑之后的血泪经验。

2.4 怎么验证校正成功:Z-Profile 剖线对比

校正完不能只看“图变清楚了”。判断依据应该是光谱曲线是否符合地物物理特性:植被在近红外强反射、红波段强吸收,校正后这条“红边”要明显;水体在近红外趋近于零;裸土在可见光到短波红外单调上升。

原报告的做法是把原图、辐射定标后、大气校正后三幅图的同一位置剖线叠在一起比较,看 Z-Profile 曲线的相对关系。校正后植被的近红外反射率应该明显抬升,水体应该被压到接近 0,而原始 DN 曲线往往整条是平的或者乱跳。如果校正后出现大面积负反射率,基本可以断定是气溶胶模型或能见度估错,需要回退重跑,而不是“截断成 0 继续往下做”。

3. 图像融合:Brovey、HSV、PCA 三种变换的光谱失真从哪来

3.1 融合的共同骨架:空间信息注入的三种姿势

多光谱波段的空间分辨率低于全色波段,这是传感器的物理限制:分辨率越高,单个像元接收的光越少,为了保住信噪比只能放宽光谱带宽。全色波段用一整段宽光谱换来了高空间分辨率,多光谱用窄波段换来了光谱可分性。融合要做的,就是把全色波段里的空间细节注入到多光谱波段里。

所有像素级融合方法共享同一个骨架:先设法把多光谱中的“空间分量”和“光谱分量”分离,再用全色替换掉空间分量,最后逆变换回去。区别只在于怎么定义“空间分量”。Brovey 用亮度比,HSV 用明度,PCA 用第一主成分,Gram-Schmidt 用正交化后的第一个分量。谁定义得越接近真实的“亮度”,光谱失真就越小。

这里有一个前提常被忽略:全色波段的动态范围和反射率量纲必须先拉伸到和多光谱一致。原报告里专门拿一节做这件事,因为第 8 波段经过定标后反射率落在 0 到 1 之间,不拉伸就直接参与运算,融合结果会整体偏暗或偏灰。这种“量纲不统一”造成的偏差,靠肉眼很难判断是融合方法的问题还是数据的问题。

3.2 Brovey 变换:比值法的亮度塌陷从哪来

Brovey 的数学形式很朴素,每个多光谱波段乘上“全色 / 多波段之和”的比值:

import numpy as np def brovey_pan_sharpen(ms, pan, eps=1e-8): """ ms : 多光谱数组,形状 (bands, rows, cols),需已重采样到全色分辨率 pan : 全色数组,形状 (rows, cols) eps : 防止分母为 0 返回: 融合后的多光谱数组 """ # 逐像元求和,得到该像元的“亮度”近似 intensity = ms.sum(axis=0) + eps # 关键一步:全色的动态范围必须与 intensity 同量纲 ratio = pan / intensity fused = ms * ratio[None, :, :] return fused

看代码就明白了:比值法假设“所有波段之和”正比于全色亮度。这个假设在地物均匀时成立得不错,但在高对比区域会崩——比如水体旁边紧挨着建筑,水体波段和很小,比值就变得很大,融合后水体附近的建筑会出现明显的亮斑伪影。

这解释了原报告定量结果里那个很怪的数字:Brovey 融合后的均值从融合前的 10 到 16 量级掉到了 0.1 到 0.2 量级。这不是数据出错,是量纲没对齐导致的整体压暗。做定量比较时,均值这种绝对量指标必须先把融合结果归一化到同一量纲,否则比较本身没有意义。信息熵和平均梯度是相对量,受影响小一些,这也正是原报告最终主要靠这两个指标下结论的原因。

3.3 HSV 与 PCA:替换分量的代价

HSV 的做法是把 RGB 转成色相、饱和度、明度三个通道,用全色直接替换明度,再反变换回 RGB。问题在于明度通道是三个波段的加权和,而全色波段覆盖的光谱范围比 RGB 三个通道宽得多,替换之后色彩平衡被打破,饱和度被重采样放大,结果是“看着更清楚但颜色更艳”。

原报告目视对比里说 HSV 融合后居住区边界更清晰,但同时光谱畸变也更大,这两个现象是同一个原因的两面:明度替换把高频细节拉满,也把色彩关系打乱了。适合做目视判读和制图底图,不适合拿去做定量反演。

PCA 的路线相反,先对多光谱做主成分变换,把信息集中到第一主成分,再用全色替换第一主成分后反变换。理论上如果第一主成分恰好等于全色波段所代表的亮度,光谱失真应该最小。但实际数据里第一主成分是统计意义上的方差最大方向,不一定等于物理亮度,两者一错位,替换就引入了系统性偏差。原报告的定性结论说 PCA“反而更模糊、颜色更鲜明”,正是这个错位的外在表现——空间细节进去了,但没进对地方。

还有一条容易被忽略:重采样方式。三种融合都用了最邻近法,原报告的解释是“效果最清晰”。更本质的原因是双线性或三次卷积会在高分辨率网格上做插值平滑,把全色的高频细节磨掉一部分;最邻近法虽然会产生块状边缘,但保住了原始像元值,对后续定量计算更友好。这是一个典型的取舍:要视觉平滑还是要数值保真。

3.4 四个定量指标分别测的是什么

指标统计含义数值变化的物理解读
均值波段像元平均值反映整体亮度水平,受量纲影响极大
标准差像元值离散程度反映对比度,值越大细节反差越强
信息熵灰度分布的信息量反映细节丰富度,与噪声也正相关
平均梯度相邻像元梯度均值反映边缘锐度,直接对应空间细节注入量

原报告的对比表里,融合前 R 波段均值 10.93、标准差 4.65、信息熵 4.12、平均梯度 0.158;HSV 融合后均值 63.12、标准差 13.85、信息熵 5.34、平均梯度 0.207。标准差和平均梯度都显著上升,说明细节确实注入了;信息熵上升说明灰度分布更分散。但均值从 10.93 跳到 63.12,这个量级变化提醒你:这些数字之间不能直接横向比,必须同量纲才有意义。

真正能用来判断“光谱保真度”的指标应该是融合前后对应波段的相关系数,或者相对无量纲全局误差。原报告因为缺少理想高分辨率参考影像,只能退而用无参考指标,这是数据条件限制下的合理妥协,但在写结论时就要相应地把话说小一点——无参考指标只能说明“细节变多了”,不能说明“光谱保住了”。

4. 阈值、温度与类别:从连续栅格到离散结论的那一刀

4.1 归一化差值指数:为什么用差除以和

NDVI 和 NDWI 的形式几乎一样,都是两波段之差除以两波段之和。这个形式不是随手写的,它有两个性质:一是把乘性误差约掉,云影、地形阴影造成的整体缩放会在分子分母里同时出现而被抵消;二是把结果压到 −1 到 1 之间,让阈值具有跨影像的可迁移性。

import numpy as np def normalized_difference(a, b, eps=1e-8): """ a : 高反射波段(NDVI 用近红外,NDWI 用绿波段) b : 低反射波段(NDVI 用红波段,NDWI 用近红外) eps : 防止分母为零 返回: 归一化差值指数,范围约 [-1, 1] """ a = a.astype(np.float32) b = b.astype(np.float32) # 分子分母同时计算,乘性误差自然抵消 nd = (a - b) / (a + b + eps) # 无效像元(填充值、云)单独标记 nd[(a <= 0) & (b <= 0)] = np.nan return nd def ndvi_to_fvc(ndvi, ndvi_soil=0.05, ndvi_veg=0.85): """ 像元二分模型:植被覆盖度 = (NDVI - NDVI_soil) / (NDVI_veg - NDVI_soil) ndvi_soil : 纯裸土端元,通常取影像累积分布的 5% 分位数 ndvi_veg : 纯植被端元,通常取 95% 分位数 """ fvc = (ndvi - ndvi_soil) / (ndvi_veg - ndvi_soil) return np.clip(fvc, 0.0, 1.0) # 截断到物理有效区间

第二个函数说明了植被覆盖度估算的正确姿势:端元值不能拍脑袋填 0 和 1,而要从影像自身的 NDVI 累积分布里取分位数。如果整幅影像里最绿的地方也只有 0.6,你按 0.85 当纯植被端元,算出来的覆盖度会整体偏低。这也是为什么同一套公式在不同区域跑出来差别巨大——不是公式的问题,是端元的问题。

4.2 密度分割定阈值:0.2256 这个数从哪来

归一化指数输出的是连续灰度图,要变成“水体 / 非水体”这样的二值图,必须切一刀。这一刀的位置决定了结果。

ENVI 里Density Slice的作用就是把连续灰度按区间着色,让人直观看到“如果阈值设在这里,会圈出哪些像元”。正确用法是反复拖动分界点,同时对照原始真彩色影像看:阈值调高,水体范围收缩但误判减少;阈值调低,水体范围扩大但阴影、深色建筑屋顶会被一起圈进来。原报告里最终取 0.2256,就是在这个反复试的过程中定下来的。

这个数字有一个重要性质:它是针对这一幅影像、这一个季节、这一套预处理参数定出来的。换个年份、换个季节,同一片水体的指数值会变,因为水深、含沙量、太阳高度角都变了。直接套用别人的阈值是遥感信息提取里翻车率最高的操作之一。

定完阈值后用Apply Mask生成掩膜,再做后续统计。这里有个细节:掩膜的黑白是相对的,ENVI 里要明确指定“掩膜值 = 1 的区域被保留还是被剔除”,选错了得到的正好是反相结果,而图上看起来只是黑白颠倒,很容易被当成“水体就是这个形状”而忽略。

4.3 温度反演的两条路:大气校正法与单窗算法

地表温度反演是从热红外波段反推地表物理温度,难点在于传感器收到的热辐射里混了大气上行辐射、下行辐射和地表比辐射率的影响。

大气校正法的思路是把辐射传输方程逐项拆开,用大气廓线数据算出上行、下行辐射,从总辐射里减掉,再用地表比辐射率修正后代入普朗克函数反解温度。它的好处是物理过程清晰,坏处是对大气廓线精度极度依赖,廓线错了结果就系统性偏。

单窗算法的思路更工程化,它把大气影响压缩成三个参数:大气透过率、大气平均作用温度、地表比辐射率,用一组经验关系直接求解。这三个参数都可以从影像本身和少量辅助数据估出来,不依赖外部廓线,所以在只有单幅影像、缺少同步大气观测的条件下更实用。代价是经验系数带着区域性偏差,换个气候区需要重新标定。

地表比辐射率这两条路都要用,常见做法是基于 NDVI 阈值法分段估算:高植被覆盖区按植被比辐射率取值,低覆盖区按裸土取值,中间过渡区按植被覆盖度加权。这一步和 4.1 的像元二分模型是同一套逻辑的下游应用,所以前面 FVC 算得准不准,会直接传导到温度结果上。

4.4 分类器与变化监测:ISODATA、最大似然与分类后比较

非监督分类 ISODATA 的机制是迭代聚类:先按初始类别数随机撒种子,每轮把像元归到最近的类中心,重算类中心,然后检查两类之间距离过近就合并、某类内方差过大就分裂,直到收敛或达到最大迭代次数。它不需要样本,但“类”不等于“地类”——聚类结果是一堆光谱上分得开的组,最终还得人工给每组贴标签。类别数设多少直接决定结果,设多了碎成一地,设少了把水田和旱地混在一起。

监督分类走的是另一条路:先选样本 ROI,再用分类器把像元判给概率最大的类。最大似然假设每个类在特征空间里服从多元正态分布,用样本估出均值向量和协方差矩阵,然后算每个像元的类条件概率。它对样本质量极度敏感,样本里混进几个错标的像元,协方差矩阵就被带偏,整类像元的判决边界都会移动。神经网络分类器不假设分布形式,能拟合非线性边界,但需要更多样本、训练更慢,而且可解释性差——出了问题很难定位是哪个环节的锅。

变化监测用的是分类后比较法:两期影像各自分类,然后逐像元比较类别标签,统计转移矩阵。这个方法直观、易解释,但误差会累积——两期分类各自的精度如果是 85%,变化检测的精度会掉到 70% 出头,因为一处误分类在两期里都会被算成“变化”。所以做变化监测时,单期分类精度必须做到比平时更高,样本要更细,边界像元要单独处理。

5. 排查清单:这条处理链上最容易翻车的五个地方

5.1 中心波长没填或波段顺序错位

现象:FLAASH 能跑完,但输出的反射率曲线整体平移,植被近红外峰值位置偏移,部分波段出现负值。

原因:Layer Stacking拼完波段后,头文件里没有自动写入每个波段的中心波长和半波宽,FLAASH 靠这些信息匹配大气透过率查找表。填错或漏填,匹配到的波段响应函数就不是真实的那一个。

解决:从 MTL 元数据里逐波段抄WAVELENGTH值,Edit Header里单位选 Micrometers,填完打开头文件核对一遍顺序是否与影像波段一一对应,再往下走。这一步花五分钟,能省后面两小时的返工。

5.2 BSQ 没转 BIL 就喂给 FLAASH

现象:FLAASH 报文件格式错误,或者跑完之后图像出现条带状错位,相邻行的光谱明显不连续。

原因:FLAASH 按像元读取完整光谱曲线,BSQ 存储下同一条光谱在物理上分散在各个波段块里,读取模型和存储模型不匹配。

解决:Basic Tools → Convert Data里把 BSQ 转成 BIL,输出文件继承头文件信息,再从转换后的文件进 FLAASH。转换后文件体积会变大一些,这是正常的。

5.3 时间参数填成文件生成时间

现象:大气校正结果整体偏亮或偏暗,不同年份的两期影像校正后亮度关系对不上,做变化监测时出现大面积伪变化。

原因:MTL 文件里同时有成像时间和产品生成时间两个字段,后者往往晚几天到几十天。太阳几何位置在这段时间里已经变了,太阳天顶角一错,FLAASH 计算的入射辐照度就错。

解决:只认成像时间字段,填之前和影像文件名里的日期段对一遍。两期影像尤其要分别核对,不能图省事复制上一期的参数。

5.4 全色波段没拉伸直接参与融合

现象:融合结果整体发灰或过曝,直方图挤在两端,目视对比时误以为是融合方法本身不行。

原因:全色波段经过定标后反射率落在 0 到 1 区间,而多光谱波段在融合前可能还处在另一套量纲里。两者量纲不一致,比值或替换运算就被整体缩放。

解决:融合前先把全色波段线性拉伸到与多光谱波段相同的数值区间,拉伸前后各看一次直方图,确认分布范围对得上。这一步做完再选融合方法,方法之间的差异才看得出来。

5.5 阈值跨区域、跨时相直接套用

现象:水体提取要么只圈出一小块,要么把山体阴影、深色屋顶全算了进去,反复调阈值也调不出合理结果。

原因:归一化指数的绝对值受季节、太阳高度角、大气校正精度、水体含沙量共同影响。在一个区域、一个季节定出来的阈值,换到另一个场景下分布中心就移了。

解决:每换一幅影像都重新做一次密度分割,对照真彩色影像拖动分界点确认。如果一定要复用,先比对新旧两幅影像指数的累积分布曲线,看分布形状是否可比,不可比就重新定。

6. 取舍:为什么“看起来最清晰”往往不是最好的结果

整条链路走下来,最值得琢磨的不是哪个算法更先进,而是每一处都在做取舍。

融合方法的选择最典型。HSV 融合在原报告的目视对比里表现最好,居住区边界清晰,纹理特征明显;但它的定量指标显示标准差和信息熵都大幅抬升,光谱畸变也最大。如果这张图的用途是给规划部门做底图,HSV 是对的;如果用途是拿去做 NDVI 时序分析或者分类,Brovey 或者 Gram-Schmidt 更稳妥,因为它们对波段间比例关系的破坏小一些。同一个“融合”,评价标准完全取决于下游要什么。

分类器的选择也是同样的逻辑。ISODATA 不需要样本,跑一遍就能出图,但它给出的是一堆光谱簇,语义标签要人来贴;最大似然需要高质量样本,样本错了结果就系统性偏,但它的判决边界有明确的概率解释,出问题能定位。神经网络在这两者之间,拟合能力强、可解释性差。选哪个不取决于哪个“更准”,取决于你能不能承担它的失败模式。

验证方法上,这份报告的做法值得借鉴:在没有理想参考影像的条件下,用均值、标准差、信息熵、平均梯度四个无参考指标做横向比较,同时明确说明这些指标只能证明“细节变多了”,不能证明“光谱保住了”。这种把结论边界说清楚的写法,比硬凑一个“精度 95%”要诚实得多。

我自己的习惯是,每做完一条完整处理链,都回头把中间产物逐个打开看一眼——定标后的辐亮度是否落在合理区间、校正后的光谱曲线是否符合地物特性、融合前后的相关系数有没有掉太多、掩膜的边缘是不是被裁掉了。原报告里提到河流在县域边缘与背景同色被一起掩掉,就是这种回头看才能发现的问题:算法没错,是研究区边界和掩膜逻辑撞在了一起。

从那以后我每次跑完一条影像处理链,都强制把每个中间结果单独出图核对一遍,哪怕它看起来“应该没问题”。这份带完整步骤图、对比图和结果分类图的实习报告,价值也在这里——它记录的不只是操作顺序,还有每一步做完之后该长什么样、不该长什么样。正在做同类课程实习的话,把它当作比对基准,能少走不少弯路。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询