默认情况下,用ArcGIS和QGIS打开同一幅影像数据时,ArcGIS中渲染的效果更加鲜艳明亮一些,对比QGIS整体颜色偏暗,原因是QGIS中用影像原彩色值进行渲染,而ArcGIS采用了拉伸算法对图像效果进行增强处理。虽然QGIS影像效果更真实,但是ArcGIS效果更符合用户习惯,本文将介绍如何将ArcGIS中影像样式转换成SLD样式。
ArcGIS渲染效果
QGIS渲染效果
ArcGIS加载栅格数据时默认使用百分比截断拉伸方式,首先我们了解百分比截断拉伸算法工作原理,然后通过QGIS和ArcGIS缓存信息来配置出和ArcGIS一样的影像渲染样式。
01 百分比截断拉伸算法原理
说明:影像百分比截断拉伸是在指定的最小和最大百分比像素值之间应用线性拉伸。将超过指定百分比范围外的像素推到最大或最小输出像素值。
效果图:
用法:
-
影像的像元值实际范围在[30,200]之间,也就是说影像的实际像元值在[0-30]和[200-255]之间的像元个数很少,可能连影像总个数的4%都不到。这时就涉及到两个百分比,第一个是下限百分比:[0-30]的像元个数占影像总像元个数的x1%;第二个是上限百分比:[200-255]的像元个数占影像总像元个数的x2%。此时所谓的百分比截断就是将值在[0-30]范围内的像元值修改为0,将值[30-50]范围内的像元值修改为255。这就是截断。
-
默认输出区间为[0,255]。
-
支持指定输出文件的数据类型、默认为8位无符号整型。
工作原理:
1、 获取栅格数据的像元值信息,并统计每个像元值的个数。按照从小到大进行依次排序。
2、 计算截断百分比所对应的像元个数
-
起始截断像元个数 = 像元总数 * 百分比。
-
末尾截断像元个数 = 像元总数 * (1 - 百分比)。
-
从小到大累计像元值个数,找到对应的最小截断像元值和最大截断像元值,形成截断区间。区间外的值赋值为极值。截断区域内的值按照给定的值域区间进行线性拉伸。
02 计算拉伸极值方式
1、使用QGIS进行计算
存在的问题:该出图效果可能与ArcGIS不一致,原因是ArcGIS在加载栅格时,会读取一些缓存的基础元数据信息来进行快速的渲染,该缓存的基础元数据信息可能存在错误,如ArcGIS计算每个波段像元值个数(频率)不准确,该数据第一个波段实际是有0/1/2的值,但是ArcGIS没有统计出来,导致与ArcGIS的出图效果有偏差。
2、使用ArcGIS直方图文件计算
在ArcGIS属性面板中导出直方图,通过查看导出的xml文件可以看出,在标签XmlRasterFunctionTemplate/Arguments/Values/AnyType/Value/StretchStats下有每个波段中每个像素值占像元总数的百分比。
计算每个波段对应的截断值:
-
依次累加每个像元的占比值,当大于0.05时,该像元值就是起始截断值,当大于9.95时,该像元值就是终止截断值。
-
计算Gamma拉伸值,在dem样式中,使用倒数进行计算,如改Gamma值为1.4118800557658375,该波段的拉伸值为1/1.4118800557658375得到0.7082754628597513
-
最后将这些计算出的值补充到对应样式中,可使用该样式进行渲染,结果和ArcGIS展示效果一致。
样式示例:
<sld:RedChannel>
<sld:SourceChannelName>1</sld:SourceChannelName>
<sld:ContrastEnhancement>
<sld:Normalize>
<sld:VendorOption name="algorithm">StretchToMinimumMaximum</sld:VendorOption>
<sld:VendorOption name="minValue">12</sld:VendorOption>
<sld:VendorOption name="maxValue">201</sld:VendorOption>
</sld:Normalize>
<sld:GammaValue>0.7082754628597513</sld:GammaValue>
</sld:ContrastEnhancement>
</sld:RedChannel>
<sld:GreenChannel>
<sld:SourceChannelName>2</sld:SourceChannelName>
<sld:ContrastEnhancement>
<sld:Normalize>
<sld:VendorOption name="algorithm">StretchToMinimumMaximum</sld:VendorOption>
<sld:VendorOption name="minValue">16</sld:VendorOption>
<sld:VendorOption name="maxValue">197</sld:VendorOption>
</sld:Normalize>
<sld:GammaValue>0.7082754628597513</sld:GammaValue>
</sld:ContrastEnhancement>
</sld:GreenChannel>
<sld:BlueChannel>
<sld:SourceChannelName>3</sld:SourceChannelName>
<sld:ContrastEnhancement>
<sld:Normalize>
<sld:VendorOption name="algorithm">StretchToMinimumMaximum</sld:VendorOption>
<sld:VendorOption name="minValue">19</sld:VendorOption>
<sld:VendorOption name="maxValue">194</sld:VendorOption>
</sld:Normalize>
<sld:GammaValue>0.7082754628597513</sld:GammaValue>
</sld:ContrastEnhancement>
</sld:BlueChannel>
最后:通过计算转换后得到的SLD文件,可以结合GeoServer等服务端系统将影像数据带样式发布,提供应用系统进行二次开发。
更多原创技术文章,请关注我的公众号【GIS极客】,或者加微信【eryeiscool】进技术交流群!