【IDL】实现ENVI默认显示效果(线性拉伸算法)

ENVI下无论打开任何一种图像,默认效果都特别的漂亮,而用IDL写代码直接显示的图像,在色彩、亮度方面都不如ENVI好看。而关于ENVI的2%裁剪算法,也没有详细的文档说明,具体原理是什么?应该怎么用IDL实现呢。

据个人字面理解,2%裁剪拉伸是基于直方图分布,对图像DN值分布在2%和98%之间的做线性拉伸。即拉伸时去除小于2%和大于98%的值,这样绝大多数的异常值会在拉伸时舍掉,显示出漂亮直观的效果。

存在一个问题,万一没有正好处于2%和98%的时候怎么办?

找了个影像仔细看下,默认[Scroll] Linear2%的拉伸情况下看直方图,发现下面特点



拉伸起点值为4,直方图统计分布在1.82%,下一个值5所在位置为2.79%;



拉伸终点为34,直方图统计分布在98.14%,前一个值33所在位置为97.63%;




故可认定ENVI的2%线性裁剪拉伸是按照2%和98%为界限,选取最临近分布的值分别作为拉伸数据范围。

编写IDL的测试代码如下:

FUNCTION LINEAR2, inImage,inPer

  COMPILE_OPT idl2

  ;

  IF N_ELEMENTS(inPer) EQ 0 THEN inPer = 0.02

 

  sz = SIZE(inImage)

  ;图像太大的话统计太慢,模仿ENVI,仅对Scroll窗口进行统计,默认大小是256*256

  IF sz[0] EQ 2 THEN BEGIN

   image = CONGRID(inImage, 256, 256)

  ENDIF ELSE BEGIN

   image = CONGRID(inImage, sz[1], 256, 256)

  ENDELSE

  ;图像基本信息

  sz = SIZE(image)

  IF sz[0] EQ 2 THEN BEGIN

   nPlanes = 1

    x = sz[1]

    y = sz[2]

  ENDIF ELSE BEGIN

   nPlanes = 3

    x = sz[2]

    y = sz[3]

  ENDELSE

 

  outImage = inImage

 

  FOR i=0, nPlanes-1 DO BEGIN

   IF nPlanes EQ 3 THEN img = REFORM(image[i,*,*]) ELSE img=image

   ;直方图统计

   array = HISTOGRAM(img,oMax = maxV,oMin = minV)

   arrnumb= N_ELEMENTS(array)

   ;

   percent = TOTAL(array,/CUMULATIVE)/TOTAL(array)

   idx1 = WHERE(percent LE inPer)

   idx2 = WHERE(percent GE inPer)

   number = N_ELEMENTS(idx1)

   ;计算当前inpert对应的数值 (2%)

   ;两个索引,取临近索引

   curIdx = (ABS(percent[idx1[number-1]]-inPer) LE ABS(percent[idx2[0]]-inPer))? idx1[number-1]:idx2[0]

   minvalue = minV +(maxV-minV)*curIdx/(arrnumb-1)

   ;1-inper对应数值 (98%)

   idx1 = WHERE(percent LE (1-inPer))

   idx2 = WHERE(percent GE (1-inPer))

   number = N_ELEMENTS(idx1)

   ;两个索引,取临近索引

   curIdx = (ABS(percent[idx1[number-1]]-1+inPer) LE ABS(percent[idx2[0]]-1+inPer))? idx1[number-1]:idx2[0]

   maxvalue = minV +(maxV-minV)*curIdx/(arrnumb-1)

   ;单波段还是多波段

   IF nPlanes EQ 3 THEN $

     outImage[i,*,*] = BYTSCL(outImage[i,*,*], max=maxvalue, min=minvalue) $

   ELSE outImage = BYTSCL(outImage, max=maxvalue, min=minvalue)

  ENDFOR

 

  IF nPlanes EQ 1 THEN outImage = REFORM(outImage)

 

  RETURN, outImage

END

 

posted @   地理遥感生态网平台  阅读(190)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示