LearningENVI&IDL分享 http://blog.sciencenet.cn/u/dongyanqing Learning ENVI&IDL

博文

IDL下实现ENVI的波段运算表达式语句合理性检测

已有 8118 次阅读 2011-10-21 13:08 |个人分类:IDL技术|系统分类:科研笔记| 检测, 表达式

        ENVI的波段运算功能很强大,若输入表达式中有错误则无法add。这个检测是怎么实现的呢?如果在IDL下进行ENVI二次开发的时候,如何实现这个功能。

首先启动ENVI+IDL,进行波段运算,输入b1*a,然后点击Add


IDL的控制台上会输出如下信息:

% Variable is undefined: A.

ENVI>

由此,联想到ENVI是否进行了一个测试调用,根据调用的返回值来判断该表达式是否合法。在IDL下进行测试:

ENVI> str1 ='b1*a'

ENVI> varname = Var_Extract(str1)

ENVI> isWrite = Execute(varName+"=indgen(5,5)")

ENVI> print,isWrite

       1

ENVI> isWrite = Execute(varName+"=" + Str1)

% Variable is undefined: A.

ENVI> print,isWrite

       0

该错误提示与ENVI的波段运算错误提示是对应的。应该就是用的这个Execute返回值来判断表达式是否正确。

 

其中调用到的函数来自YangHS,如下:

Function VarFind,Str

  Compile_opt strictarr

 

  Len = StrLen(Str)

  RetValue = 'b'

  RefArr = Strtrim(Indgen(10),2)

  if Len eq 1 then Return,RetValue

  for i=1,Len-1 do begin

    Char = StrMid(Str,i,1)

    if (Where(RefArr eq Char))[0] eq -1 then break

    RetValue = RetValue+Char

  endfor

  ;

  Return,RetValue

End

Function Var_Extract,ExpStr

  Compile_opt strictarr

 

  ExpStr = STRLOWCASE(ExpStr)

  StrArray = StrSplit(ExpStr,'b',/extract)

  StrArray = 'b'+StrArray

  ;

  for i=0,N_Elements(StrArray)-1 do begin

    StrArray[i] = VarFind(StrArray[i])

  endfor

  ;

  LenArr = StrLen(StrArray)

  index = Where(LenArr ne 1,count)

  if count gt 0 then RetArr=StrArray[index] else RetArr=''

  ;

  uniqIndex = Uniq(RetArr)

  RetArr = RetArr[uniqIndex]

  Return,RetArr

End

 

那么继续探讨下表达式变量的初值设置,编写一简单的波段运算函数test_bandmathVar

function test_bandmathVar,inVar

  help,inVar,out = outD

  print,outD

  print,inVar

  return,inVar

end

编译后在波段运算中输入test_bandmathVar(b1)


控制台输出如下:

INVAR           FLOAT     = Array[5, 5]

      36.0000      33.0000      53.0000      2.00000      119.000

      100.000      17.0000      20.0000      168.000      125.000

      97.0000      126.000      248.000      17.0000      2.00000

      224.000      76.0000      81.0000      237.000      38.0000

      217.000      140.000      196.000      19.0000      109.000

INVAR           FLOAT     = Array[5, 5]

      144.000      192.000      86.0000      30.0000      235.000

      65.0000      32.0000      131.000      210.000      201.000

      186.000      120.000      19.0000      80.0000      170.000

      147.000      139.000      170.000      112.000      81.0000

      141.000      105.000      175.000      247.000      34.0000

INVAR           FLOAT     = Array[5, 5]

      143.000      41.0000      121.000      125.000      51.0000

      45.0000      12.0000      114.000      139.000      197.000

      147.000      102.000      212.000      241.000      225.000

      141.000      152.000      50.0000      51.0000      34.0000

      176.000      223.000      151.000      131.000      247.000

INVAR           FLOAT     = Array[5, 5]

      61.0000      164.000      64.0000      246.000      82.0000

      255.000      29.0000      114.000      47.0000      113.000

      85.0000      142.000      94.0000      229.000      144.000

      250.000      30.0000      93.0000      190.000      100.000

      163.000      50.0000      139.000      253.000      144.000

由上面的输出看来ENVI下初步给定的是5*5的浮点型随机数组,随机变量构建代码如下:

ENVI> s = float(fix(randomu(aa,5,5)*255))

ENVI> print,s

      188.000      146.000      175.000      95.0000      116.000

      233.000      227.000      152.000      159.000      110.000

      58.0000      188.000      180.000      230.000      160.000

      152.000      254.000      31.0000      41.0000      18.0000

      127.000      198.000      11.0000      66.0000      195.000

ENVI> s = float(fix(randomu(aa,5,5)*255))

ENVI> print,s

      181.000      27.0000      4.00000      238.000      205.000

      34.0000      191.000      167.000      60.0000      161.000

      233.000      90.0000      112.000      81.0000      149.000

      210.000      236.000      66.0000      13.0000      188.000

      65.0000      63.0000      135.000      16.0000      129.000

ENVI> s = float(fix(randomu(aa,5,5)*255))

ENVI> print,s

      22.0000      198.000      172.000      66.0000     0.000000

      206.000      210.000      101.000      53.0000      86.0000

      65.0000      31.0000      117.000      167.000      50.0000

      65.0000      175.000      17.0000      192.000      41.0000

      36.0000      67.0000      97.0000      196.000      88.0000

ENVI>

 



https://wap.sciencenet.cn/blog-344887-499415.html

上一篇:IDL8.0培训教程(Esri培训班2011年8月北京站培训班)与培训视频
下一篇:IDL中数据处理时遇到了NAN怎么办
收藏 IP: 124.205.245.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-20 22:41

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部