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> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)