第一次在QGIS里打开一张Sentinel-2影像或者SRTM高程数据很多人会怀疑自己是不是下载了坏文件——屏幕上要么一团黑要么一片白偶尔还能看到一点灰乎乎的轮廓。我当年也干过这事反复下载了好几次最后发现折腾半天根本不是数据的问题而是渲染时“拉伸方式”Stretch没有选对。拉伸方式这个设置藏在图层属性—符号系统面板里看起来只是一个不起眼的下拉框但它决定了栅格数据的原始数值如何映射到屏幕颜色上。选对了山地纹理清清楚楚选错了整张图就是一块黑板或者白板。这篇内容就把这个下拉框里的门道完整讲清楚。无论你是刚入门GIS的学生、做遥感影像分析的从业者还是单纯想用QGIS出一张像样的地形图拉伸方式都是绕不开的一课。提前说明一下今天讨论的是二维显示层面的拉伸不涉及3D视图里的地形拉伸白模也不涉及矢量字段的表达式公式设置后面我会专门解释为什么这两者经常被搞混。1. 栅格显示背后的映射逻辑拉伸到底在“拉”什么1.1 像元值与颜色通道的错位栅格数据本质上是一个矩阵每个格子像元存一个数字。数字的含义随数据源而变卫星影像里是反射率或辐射亮度DEM里是海拔高程气象数据转出来的栅格可能是温度或降水量。而屏幕显示不同最普通的彩色屏幕一个像素由红绿蓝三个通道组成每个通道通常只有0到255一共256个级别。如果软件不经过任何处理直接把一个范围跨度极大的浮点型数值塞给颜色通道显然是无意义的于是就有了“从原始数值范围到显示颜色范围”的映射需求。这就是拉伸的底层逻辑确定一个原始值区间最小值与最大值把区间内的值线性或非线性地展开到0到255的灰度空间或者RGB三个通道的多波段空间。小于最小值的像元按最暗显示大于最大值的按最亮显示中间部分按所选曲线分配亮度。你可以把它理解成在给照片调对比度只不过调的不是像素亮度本身而是显示层级的映射关系。QGIS里所有与拉伸相关的选项本质都是在调整这条映射曲线。1.2 拉伸的本质改变映射曲线为了便于理解可以把“拉伸”想象成一条映射曲线。横轴是原始像元值纵轴是显示亮度。如果映射是线性的就是一条直线斜率由最小值和最大值的拉伸范围决定如果是直方图均衡化就是一条随累积频率弯曲的非线性曲线如果是标准差拉伸本质上也是线性映射只是把最小值和最大值定在均值附近的n倍标准差处。曲线不同同一组像元值显示出来的明暗分配就完全不同。这里要特别强调一个概念对比度增强。很多图像处理软件把“线性拉伸”和“直方图均衡化”归为对比度增强工具QGIS也继承了这个思路。拉伸方式下拉框里的“线性拉伸”“直方图均衡化”其实就是在选不同的映射曲线。明白这个本质之后就不会被各种叫法绕晕。你在教程里看到的“百分比拉伸”“标准差拉伸”并不神秘它们只是决定映射区间的不同策略。1.3 一个关键前提拉伸不改数据我带新人时反复强调一句话拉伸只改显示不动原始像元值。你在符号系统里怎么折腾原始栅格文件一个字节都不会变DEM高程、影像反射率依然是原值。这意味着你可以随时切换拉伸方式来回对比效果不需要担心破坏数据。也正因如此拉伸是探索数据时最安全的第一步操作——当你对一幅栅格完全不了解时切换几种拉伸方式看看通常能快速判断数据的数值分布特征。如果你后续要做定量分析比如反演地表温度或计算坡度坡向就必须基于原始数据去算而不是基于渲染后的显示值。这一点看似基础但初学阶段踩坑的人不少。我见过有人为了省事拿渲染后的截图去数字化数值结果误差大得离谱最后整个专题图推倒重做。牢记“拉伸是显示层操作”这个前提能帮你少走很多弯路。2. 几种常用拉伸方式的原理与脾气2.1 最小/最大拉伸简单直接却最怕离群值最小/最大拉伸Min/Max是最朴素的做法直接扫描整个栅格的像元最小值作为映射起点最大值作为终点然后线性映射。优点是计算快、容易理解缺点也明显——它太容易被离群值带偏。比如DEM的边缘经常有-9999这类无效值没设置成NoData或者水体区域出现异常跳变最小值被拉到-9999结果真实地形数据全部压缩在一个很窄的亮度范围里画面整体灰得不行。再比如遥感影像里个别云顶像元特别亮最大值被拉得很高其他地物就全部偏向暗部。所以我的原则是只有当我确定数据范围很干净、没有异常值的时候才直接用最小/最大拉伸。比如经过裁剪和清洗后的单波段栅格图省事可以用遇到原始DEM、未定标的多光谱数据先别急着用它。如果你发现选择了最小/最大拉伸后画面要么一片惨白、要么一团漆黑第一反应应该是检查数据里有没有异常值而不是怀疑软件出了问题。2.2 累计计数截断处理卫星影像最稳的选择累计计数截断Cumulative count cut常被称为百分比拉伸思路是先把像元值排序统计直方图然后从两端各截掉指定比例的像元剩下的最小值和最大值才作为拉伸区间。默认一般是2%和98%也就是把分布两端各2%的“极端值”排除在外用中间96%的数据决定明暗映射。它解决了最小/最大拉伸被离群值绑架的问题对大多数遥感影像和DEM都适用。实际使用时截断比例需要根据数据质量调整。干净的光学影像2%到98%通常很舒服如果云和阴影占比高可以把上端截断放到5%甚至更高来压掉过曝区。但要注意截断比例设得太大会让暗部和亮部的对比被过度增强噪点也会跟着突出。我习惯先用2%到98%快速预览再根据目标微调。QGIS里的操作也很直观在最小/最大设置里把统计方式选为“累计计数截断”旁边会出现截断数值输入框默认是2.0和98.0改完点应用图面立即刷新非常适合反复试验。2.3 标准差拉伸正态分布数据的“平均脸”标准差拉伸Standard deviations的思路是先计算栅格数据的平均值和标准差σ然后把映射区间设置为均值附近的若干倍标准差范围比如平均值±2σ或±3σ。它适合数值近似正态分布的数据比如DEM、气温、降水这类自然地理要素。拿DEM举例如果某个区域绝大部分高程集中在200米到800米只有少数山顶到1200米直接用最小/最大拉伸会看到大片区域灰蒙蒙而用均值±2σ拉伸把区间收窄到数据主体附近山谷和山脊的相对细节就会清晰很多。参数上σ倍数越大整个图面相对越亮、对比越弱倍数越小对比越强但容易过饱和。一般从2开始试效果不理想再调整到2.5或3。不过要记住标准差拉伸并不适用于偏态分布非常严重的数据。比如大部分像元都是0、只有少数像元有信号的夜光数据用标准差拉伸依然是黑乎乎一片这种场景就要考虑手动指定范围。2.4 直方图均衡化细节多了但别当“真实”直方图均衡化Histogram equalize会把直方图尽量拉平让每个亮度级别上的像元数量大致接近。这样做的好处是视觉信息量最大原本挤在一小段灰度里的细节会被放大代价是映射关系高度非线性显示结果与原始物理数值的对应关系变得很不直观。换句话说你看到的两处阴影深浅差异并不代表原始辐射值差异是同类比例。所以我对直方图均衡化的看法是它适合做视觉判读、找目标适合做展示用的背景图不适合用于依赖相对亮度关系判断数值大小的场合。如果你需要定性描述整体格局直方图均衡化没问题但如果要做阈值提取或目视解译时判断地物类型尽量用线性拉伸或累计计数截断。把几种方式放在一起看各自分工很清晰拉伸方式映射逻辑优点风险典型场景最小/最大全局线性简单快速被离群值带偏清洗后的数据快速预览累计计数截断两端截断后线性压住云和噪声截断过大细节丢失多光谱遥感、DEM标准差均值±n倍σ突出主体分布不适用偏态分布DEM、气候要素直方图均衡按累积频率弯曲细节最丰富数值关系失真目视判读、展示3. 在QGIS里一步步配置拉伸并保存样式3.1 先搞清楚三个渲染类型在QGIS的符号系统面板里拉伸方式不是单独存在的它依附于渲染类型Render type。很多人找不到拉伸选项往往是前面的渲染类型选错了。栅格图层最常用的渲染类型有三个单波段灰度、单波段伪彩色、多波段彩色。单波段灰度适用于只有一个波段的栅格比如DEM、单波段的近红外影像显示为灰度或配合色带单波段伪彩色同样针对单波段数据但通过色带赋予彩色做DEM山体分层设色时最常用多波段彩色适用于三个波段以上的影像把指定的三个波段分别放入红、绿、蓝通道合成真彩色或假彩色影像。拉伸方式的设置在三种渲染类型下都可以做只是入口深浅略有不同。我的建议是先确定你处理的是单波段还是多波段再选渲染类型最后再看拉伸。顺序反了界面里看到的内容会让你一头雾水。比如你加载了一张三波段无人机影像却在单波段灰度里找波段组合选项怎么找都找不到切到多波段彩色后红绿蓝波段下拉框才会逐一出现。3.2 拉伸设置的完整操作路径以QGIS 3.28 LTR版本为例右键点击栅格图层选择“属性”左侧切到“符号系统”。假设加载的是DEM在面板中上区域会看到“最小/最大设置”Min/Max Value Settings里面通常有最小值和最大值输入框以及一个“统计方式”下拉框常见选项包括实际、累计计数截断、最小/最大、标准差等。选好统计方式后下方会展开对应参数比如累计计数截断的百分比、标准差倍数。再往下找“拉伸”Stretch相关的下拉框常见选项包括无拉伸、线性拉伸、直方图均衡化等。这一步和上面的统计方式是配合关系统计方式决定最小值和最大值取多少拉伸则决定从最小值到最大值的映射曲线是直线还是曲线。你可以理解为“先定范围再定曲线”。设置完成后点“应用”视图里的图层就会立即更新。如果手头数据已经统计过且范围没变可以通过“重新加载”类似功能刷新直方图。实际项目中我比较喜欢先打开直方图面板看分布再决定统计方式避免盲调。直方图窗口可以从图层属性的“直方图”选项卡进入也可以用主界面菜单“视图→面板→直方图”调出拖动直方图上的两条红线可以直接调整拉伸范围效果非常直观。3.3 把好用的组合存成样式调好一版效果后最怕的是换个图层全白干。QGIS里可以直接把这个拉伸配置保存成样式文件在符号系统面板底部点“样式”Style按钮选择“另存为QML...”或“另存为SLD...”存成一个.qml文件。下次处理同类数据时右键目标图层→属性→符号系统→样式→“加载样式”或者直接把QML文件拖到QGIS窗口里就可以复用了。如果某种拉伸组合是你处理特定传感器数据的固定习惯还可以右键图层→属性→样式→“设为默认样式”之后每次加载同一类型数据QGIS都会自动套用这套配置。我一般会给Landsat、Sentinel-2、SRTM各存一套默认样式省去了大量重复操作时间。样式保存与数据无关它只保存渲染参数所以拿给同事或者迁移到别的电脑都可以直接用这也适合团队里统一出图标准。尤其当项目里有十几副相同来源的影像需要保持视觉一致时这个习惯能省下半天时间。4. 针对常见数据的拉伸推荐与参数参考4.1 高程DEM别让陡峭山峰吃掉平原细节处理DEM时最典型的失败画面是山区亮到发白平原暗到看不见整个地形像一块电镀金属。原因通常是用了最小/最大拉伸被个别极值带偏。对于SRTM、ALOS这类全球DEM我推荐用累计计数截断2%到98%或者标准差2倍。两者效果相近差异体现在细节风格上累计计数截断更忠于原始分布标准差拉伸会让中间层次更舒展。如果要制作山体阴影立体感更强的图可以把DEM复制一层一个图层用灰度拉伸表现海拔另一个图层用山体阴影Hillshade叠加把山体阴影图层放在上方并设置混合模式为正片叠底Multiply。此时拉伸方式的选择直接影响叠加前的基础明暗建议灰度层用线性拉伸避免阴影在高海拔区完全失去细节。这一套组合在制图时非常能打。如果是制作山体分层设色图就切换到单波段伪彩色渲染选择一条合适的地形色带比如青—黄—棕—白的经典组合再配合累计计数截断或标准差拉伸视觉效果会更接近传统地貌晕染图。4.2 多光谱影像RGB合成里最常见的拉伸组合对于Landsat、Sentinel-2等多光谱影像真彩色合成后通常会面临对比度不足的问题尤其是大气影响严重的场景画面像蒙了一层雾。此时别急着加锐化先检查拉伸。标准做法是选择多波段彩色渲染把相应波段放入红绿蓝通道然后把统计方式选为累计计数截断截断范围默认2到98拉伸选线性拉伸。绝大多数情况下画面立刻通透很多。如果云和薄雾面积较大可以适当把上端截断调大到5%甚至10%压掉高亮云层的影响但要注意过度调大会让陆地部分偏灰、偏淡。也有朋友喜欢用直方图均衡化来做“假通透”视觉上确实漂亮但分析时要提醒自己这不是真实的辐射亮度关系。我在做影像对比分析时通常导出一张累计计数截断的图作为标准另存一张直方图均衡化的图仅供展示。另外如果你做的是假彩色合成比如植被分析常用的近红外—红—绿组合拉伸方式和真彩色一致仍然推荐累计计数截断加线性拉伸只是波段顺序按分析需求变化。4.3 夜光、气象与扫描图按数据特征锁定范围夜光遥感数据这类栅格绝大多数像元值接近0只有城市核心区有一点点信号自动拉伸往往要么全黑要么过曝。针对这种偏态分布最有效的方法不是依赖默认统计方式而是手动在最小值/最大值输入框里锁定一个合理范围比如0到60或0到80。锁定后城市边界、亮度梯度才能肉眼可读。我的经验是这种数据一定要手动干预拉伸范围不要迷信任何自动方式。气象和气候数据温度、降水通常用单波段伪彩色渲染配合一个从蓝到红的色带。这里最容易踩的坑是最小/最大自动值范围和色带的配合问题——如果数据包含离群的异常点色带下半段就会被浪费整个图面偏向一头。建议直接输入有物理意义的下限和上限比如降水量用0毫米到500毫米温度用该区域历史极值附近范围这样地图图例也更好解读。扫描地形图这类栅格如果是未经过配准的原样展示目标就是忠实还原纸张效果用无拉伸或者线性拉伸均可。但要注意扫描件经常有底色不均匀可以用累计计数截断稍微增强一下不要过分。如果扫描图加载进来发现整体发灰多半是扫描时的Gamma问题靠拉伸只能改善无法彻底解决。5. 别把几种“拉伸”混为一谈5.1 3D视图的“高程拉伸”是几何变换在QGIS的3D Map视图中有一个功能可以把DEM按高程数值“拉伸”成三维地形也就是所谓“白模”的快速做法。这个拉伸和本文说的渲染拉伸完全是两回事一个是把二维像元的高程值转成三维Z值改变了几何形状另一个只是调整二维显示时数值到颜色的映射不改变几何。如果你在3D视图里发现地形起伏不明显那应该调的是“垂直比例”Vertical scale / Z factor而不是跑回符号系统去调渲染拉伸。这两个操作调换使用结果只会南辕北辙。制作白模的过程通常是加载DEM到QGIS在菜单中新建3D Map View在场景选项里选择DEM图层作为高程来源把垂直夸张或地形缩放设置为合适倍数如果需要纯白建筑体块模通过场景管理器添加建筑体块图层。但这一步和符号系统里的拉伸无关。如果你搜教程时搜到“qgis 建白模”看到的是3D内容别和本文的显示拉伸混在一起看。5.2 矢量表达式的公式设置是另一套体系很多刚接触QGIS的用户搜索“表达式 公式 设置”时会把矢量字段的表达式与栅格拉伸混在一起。矢量的符号系统里比如根据人口字段进行“分级符号”或“基于规则”渲染确实有非常强大的表达式函数但那是针对属性表和矢量几何的栅格拉伸则是纯显示映射。两者的共同点是都位于符号系统面板但一个在“基于值”的分类渲染里一个在“波段渲染”里。遇到问题时先确认自己操作的是栅格图层还是矢量图层能够少走很多弯路。当然在栅格计算器Raster Calculator里可以用表达式对像元值做数学运算比如计算NDVI这和拉伸完全不同会生成新的栅格数据。如果觉得拉伸满足不了分析需求应该指向栅格计算器而不是拉伸方式。一句话总结拉伸只解决“怎么显示”表达式解决“算什么值”两者的对象、目的、输出都不一样。5.3 在线图源与本地栅格的边界现在不少人喜欢添加在线地图服务作为底图常见的有天地图、哨兵影像服务等。这类在线瓦片通常已经由服务端做好渲染样式颜色、对比度、拉伸都是固定的客户端无法像本地栅格那样自由调整拉伸。如果你看到在线底图颜色发暗或者风格不对不是QGIS拉伸没设置好而是服务端样式如此可以通过“颜色渲染”里的亮度、对比度、饱和度调整做轻量补救但本质上和拉伸方式不是一回事。反过来本地下载的原始栅格比如地球资源卫星影像、DEM原始切片则保留了大量原始数值信息拉伸方式的可调空间很大。这也是我为什么建议做数据分析尽量下载原始栅格而不是截取在线服务的渲染图——后者的数值已经被人为映射过了很多信息已经丢失。关于在线地图URL的加载需求我的建议是先确认在线服务的合法性、稳定性和坐标系是否匹配再决定是否用于出图拉伸调整在这类场景里基本帮不上忙不必在上面花太多时间。我个人在实际项目里的习惯是加载任何栅格后第一步先打开直方图看数据分布第二步选累计计数截断2%到98%做快速预览第三步根据数据特征和出图目标切换到标准差或手动锁定范围。这样既能快速认清数据质量也避免被默认渲染效果误导。把这一套流程固定下来之后你会发现“拉伸方式”这个不起眼的下拉框其实是栅格可视化和制图中性价比最高的设置之一。希望这篇内容能帮你少走一些弯路。
