【IDL代码库】置信区间计算和百分比线性拉伸

本程序实现初衷是为了计算植被覆盖度(根据置信区间计算NDVImin和NDVImax,从而计算植被覆盖度)。

而置信区间计算出来正好可以用在百分比线性拉伸中。卫星图像的数据类型一般为无符号整型(UINT),所以在显示时都需要进行拉伸(拉伸到0~255 字节型范围)。

ENVI中常用的拉伸方法为Linear 2%(2%线性拉伸),即通过直方图统计,获取累计像元个数所占百分比位于2%和98%的DN值(与置信区间计算相同)作为最小和最大值进行线性拉伸。

注:如果仅仅是为了图像拉伸,可以调用一系列虚拟栅格或ENVITask,如 ENVILinearPercentStretchRaster、ENVILinearPercentStretchRasterTask。

 

废话不多说,上源码。

源码下载地址:http://pan.baidu.com/s/1gfhpJGJ

 

;+

; :Description:

  自动统计置信区间(如5%)对应的DN值

  可用于百分比线性拉伸、植被覆盖度NDVImin和NDVImax的计算等

  注1:用于调用了ENVIRasterStatistics,此代码最低支持ENVI52/IDL84版本

  注2:本程序实现初衷是为了计算植被覆盖度,如果仅仅是为了图像拉伸,

      可以调用一系列虚拟栅格或ENVITask,如 ENVILinearPercentStretchRaster

;

; :Author: duhj@geoscene.cn

;

; :Date: 2016-8-10 11:48:30

;-

 

;拉伸函数,输入raster只能是单波段或三波段栅格

;percent输入百分比,默认为0.02

;返回值为拉伸后数组

FUNCTION LinearPercentStretch, raster, percent=percent

 COMPILE_OPT idl2

 

 ;percent默认为0.02

 IF ~N_ELEMENTS(percent) THEN percent=0.02

 

 ;获取波段数,如果不为1或3,则返回空

  nb = raster.NBANDS

 IF nb NE 1 AND nb NE 3 THEN RETURN!NULL

 

 ;初始化字节型数组,用于存储拉伸后结果

  result = BYTARR(raster.NCOLUMNS, raster.NROWS, nb)

 

 ;循环获取每个波段拉伸结果,存储在result中

 FOR i=0,nb-1 DO BEGIN

 

   subRaster = ENVISubsetRaster(raster, BANDS=[i])

 

   ;根据置信区间统计 minValue和maxValue,

   ;可用于植被覆盖度计算(对应NDVImin和NDVImax)

   ;当统计结果不理想时,说明异常值较多,

   ;可以设置HISTOGRAM_NBINS=1000,或更大的值

   ;这里使用了ENVI接口进行直方图统计,

   ;也可以换成IDL的HISTOGRAM函数,用法查看帮助

   stats = ENVIRasterStatistics(subRaster, /HISTOGRAMS, $

     HISTOGRAM_NBINS=256)

   ;统计直方图,获取累计像元个数

   hist = stats.HISTOGRAMS[0]

   totalCounts = TOTAL(hist['counts'], /CUMULATIVE)

   ;获取累积百分比

   totalPercents = totalCounts/totalCounts[-1]

 

   ;获取置信区间的索引

   tmp = MIN(totalPercents-percent, beginIndex, /ABSOLUTE)

   tmp = MIN(totalPercents-(1.0-percent), endIndex, /ABSOLUTE)

 

   ;根据索引计算置信区间最小和最大值

   minValue = hist['min']+beginIndex*hist['binsize']

   maxValue = hist['min']+endIndex*hist['binsize']

 

   data = subRaster.GetData()

   data = BYTSCL(data, MIN=minValue, MAX=maxValue)

   result[*,*,i] = data

 ENDFOR

 ;返回结果

 RETURN, result

END

 

;主程序

PRO test_Confidence

 

 COMPILE_OPT idl2

 e=envi(/headless)

 

 ;使用ENVI自带数据

  file = FILEPATH('qb_boulder_msi', ROOT_DIR=e.ROOT_DIR, $

   SUBDIRECTORY=['data'])

  raster = e.OpenRaster(file)

 

 ;获取RGB真彩色栅格

  rgbRaster = ENVISubsetRaster(raster, BANDS=[2,1,0])

 

 ;获取2%线性拉伸结果

  result = LinearPercentStretch(rgbRaster, percent=0.02)

 

 ;显示使用BYTSCL拉伸效果(即线性拉伸)

  i = IMAGE(BYTSCL(rgbRaster.GetData()), LAYOUT=[2,1,1], $

   DIMENSIONS=[800,400],/ORDER, TITLE='线性拉伸结果')

 

 ;获取百分比线性拉伸结果(如2%线性拉伸)

  i = IMAGE(result, LAYOUT=[2,1,2] ,/ORDER, $

   TITLE='2%线性拉伸结果', /CURRENT)

END

 

图:运行效果

posted @ 2022-05-27 17:50  ENVI-IDL技术殿堂  阅读(1077)  评论(0编辑  收藏  举报