【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
本文来自地理遥感生态网平台www.gisrs.cn,作者:地理遥感生态网平台,转载请注明原文链接:https://www.cnblogs.com/gisrs365/p/18273123

浙公网安备 33010602011771号