|||
据个人字面理解,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 |
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-8 01:27
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社