ENVI二次开发时的波段运算表达式语句合理性检测方法与ENVI检测方法探讨

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>

 

 

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