原理:参考博客http://blog.sina.com.cn/s/blog_764b1e9d0100pwby.html

可直接利用的工具:http://blog.sina.com.cn/s/blog_764b1e9d0102y3b6.html

IDL矩阵运算参考:http://blog.sciencenet.cn/home.php?mod=space&uid=346157&do=blog&quickforward=1&id=886512

矩阵运算:http://homepages.see.leeds.ac.uk/~lecjm/Teaching/IDL_course/Notes/notes/node22.html

既然都已经有了工具,为什么还要写这篇博文呢?当然是想要批量批量批量!假设已有伪不变目标(.roi格式),使用该roi,以时刻T1为参考影像,其余多个时序为待校正时序,难到要一个一个的操作吗?哈哈哈哈哈哈哈哈哈!当然也是可以的,如果有代码,岂不是更好呢。本着一贯折磨自己的原则,踏上了代码的不归路。。。

主要的一元线性回归方程 y=ax+b的系数计算如下:

源代码如下:

pro zy3relativenormpif
;2019/2/15 采用PIF相对辐射校正方法,批量操作
;数据:1.伪不变目标(地物): ROI格式 2.参考影像 3.待校正影像(与前者的地理位置应该相同,否则ROI找不到位置
;方法:参考博文 http://blog.sina.com.cn/s/blog_764b1e9d0100pwby.html
;主要步骤:1.分别导出各影像的roi为坐标点 2.计算回归系数 3.波段运算校正系数
  COMPILE_OPT idl2
  e=envi()
  DIRPATH='待校正的影像路径'
  ROIPATH='不变特征roi路径'
  RESPATH='输出路径'
  filelist=FILE_SEARCH(DIRPATH,'*.hdr',count=countall)
  refername='参考时序的影像名称'
  referpath=FILEPATH(refername,ROOT_DIR=DIRPATH)
  rroispath=FILEPATH('referroi.csv',ROOT_DIR=RESPATH);the filename extensions must be .csv or .txt
  ;Open reference raster and pifs

  • rois=e.OpenROI(ROIPATH)

;Export ROIS from the reference file
  referraster=e.OpenRaster(referpath,DATA_IGNORE_VALUE=0)
  ;rpixelvale=referraster.GetData(ROI=rois,ERROR=err);NO THIS FUNCTION OF THIS VERSION
  ;Read ROIS from the reference file
  IF FILE_TEST(rroispath) EQ 0 THEN BEGIN
    referraster.ExportRois,rroispath,rois,'CSV'
  ENDIF
  rroifile=READ_CSV(rroispath,N_TABLE_HEADER=9)
  rdata=rroifile.FIELD7
  rmean=mean(rdata)
  ;Loops over all files to adjust
  FOR i=0,N_ELEMENTS(filelist)-1 DO BEGIN
    fname=FILE_BASENAME(filelist[i])
    IF (fname.CONTAINS('nad') EQ 0) AND (fname.CONTAINS('navp') EQ 0) THEN CONTINUE
    basename=STRMID(fname,0,STRLEN(fname)-4);'.hdr'
    pifresname=FILEPATH(basename+'_pif',ROOT_DIR=RESPATH)
    IF FILE_TEST(pifresname) THEN CONTINUE
    IF fname.CONTAINS(refername) THEN CONTINUE 
    ;Export ROIS from the adjust file
    ajustraster=e.OpenRaster(filelist[i],DATA_IGNORE_VALUE=0)
    aroispath=FILEPATH(basename+'adjustroi.csv',ROOT_DIR=RESPATH)
    IF FILE_TEST(aroispath) EQ 0 THEN BEGIN
      ajustraster.ExportRois,aroispath,rois,'CSV'
    ENDIF
    ;Read csv
    aroifile=READ_CSV(aroispath,N_TABLE_HEADER=9)
    adata=aroifile.FIELD7
    ;Calculate regression coefficients
    amean=mean(adata)
    coeff_a=total((rdata-rmean)*(adata-amean))*1.0/total((adata-amean)^2)
    coeff_b=rmean-coeff_a*amean
    ;Adjusting the image
    ;expr = 'coeff_a * b1 + coeff_b'
    ;bandMathRaster = ENVIPIXELWISEBANDMATHRASTER(ajustraster, expr,ERROR=err)
    ;one solution
    ;忽略某个值,只是不显示而已,该值仍然存在,现在需要的是不处理该部分
;    ajustrasterdata=ajustraster.GetData()
;    newdata=uint(coeff_a*ajustrasterdata+coeff_b)
;    ;Save the adjusted raster
;    raster=ENVIRaster(newdata,URI=pifresname,INHERITS_FROM=ajustraster,DATA_IGNORE_VALUE=uint(coeff_b))
;    raster.Save
     ;second solution
;     Task = ENVITask('ApplyGainOffset')
;     Task.GAIN =[coeff_a]
;     Task.OFFSET =[coeff_b]
;     Task.INPUT_RASTER =ajustraster
;     Task.OUTPUT_RASTER_URI =pifresname
;     Task.Execute
      ;third solution:
;      GainOffsetImage = ENVIGainOffsetRaster(ajustraster, [coeff_a], [coeff_b])
;      resdata=GainOffsetImage.GETDATA()
;      resdata=UINT(resdata)
;      raster=ENVIRaster(newdata,URI=pifresname,INHERITS_FROM=ajustraster,DATA_IGNORE_VALUE=uint(coeff_b))
;      raster.Save
      ;the fourth solution:refer to http://www.harrisgeospatial.com/docs/enviradiometriccalibrationtask.html
      Metadata=ajustraster.Metadata
      Metadata.AddItem,'data gain values', [coeff_a]
      Metadata.AddItem,'data offset values', [coeff_b]
      Task = ENVITask('RadiometricCalibration')
      Task.INPUT_RASTER = ajustraster
      Task.OUTPUT_DATA_TYPE = 'uint'
      Task.OUTPUT_RASTER_URI =pifresname
      Task.Execute 
      Metadata.RemoveItem,'data gain values'
      Metadata.RemoveItem,'data offset values'   
      ENDFOR     
      ;release files in memory:释放了硬盘上的文件,但是没有释放in memory
      fids = ENVI_GET_FILE_IDS()
      size = SIZE(fids)  ;dimensions,respective length,data type, num_of_elements total
      length = size[1]
      FOR i = 0L, length-1 DO BEGIN
        ENVI_FILE_MNG,id = fids[i],/remove
      ENDFOR
end

效果对比:经本人测试,上述代码的结果与使用http://blog.sina.com.cn/s/blog_764b1e9d0102y3b6.html提供的结果相同

此外,如何应用辐射增益和偏移量,到原始影像上,本文提供了四种计算思路:(这几种思路主要受制于ENVI/IDL版本问题,ENVI5.5的解决方法更简洁,但本实验采用的是5.3的版本,因此,函数的部分keyword无法使用)

即上述代码的最后部分:

  • ;the first solution

;忽略某个值,只是不显示而已,该值仍然存在,现在需要的是不处理该部分
;    ajustrasterdata=ajustraster.GetData()
;    newdata=uint(coeff_a*ajustrasterdata+coeff_b)
;    ;Save the adjusted raster
;    raster=ENVIRaster(newdata,URI=pifresname,INHERITS_FROM=ajustraster,DATA_IGNORE_VALUE=uint(coeff_b))
;    raster.Save

  • ;the second solution

;     Task = ENVITask('ApplyGainOffset')
;     Task.GAIN =[coeff_a]
;     Task.OFFSET =[coeff_b]
;     Task.INPUT_RASTER =ajustraster
;     Task.OUTPUT_RASTER_URI =pifresname
;     Task.Execute

  • ;the third solution:

;      GainOffsetImage = ENVIGainOffsetRaster(ajustraster, [coeff_a], [coeff_b])
;      resdata=GainOffsetImage.GETDATA()
;      resdata=UINT(resdata)
;      raster=ENVIRaster(newdata,URI=pifresname,INHERITS_FROM=ajustraster,DATA_IGNORE_VALUE=uint(coeff_b))
;      raster.Save

  • ;the fourth solution:refer to http://www.harrisgeospatial.com/docs/enviradiometriccalibrationtask.html

Metadata=ajustraster.Metadata
      Metadata.AddItem,'data gain values', [coeff_a]
      Metadata.AddItem,'data offset values', [coeff_b]
      Task = ENVITask('RadiometricCalibration')
      Task.INPUT_RASTER = ajustraster
      Task.OUTPUT_DATA_TYPE = 'uint'
      Task.OUTPUT_RASTER_URI =pifresname
      Task.Execute 
      Metadata.RemoveItem,'data gain values'
      Metadata.RemoveItem,'data offset values'

ENVI/IDL编程:批量使用伪不变目标法进行相对辐射校正相关推荐

  1. ENVI/IDL 编程:批量裁剪同一地区的多幅影像

    问题描述:通常的批量裁剪方法是使用相同的矢量文件或者roi区域,分别对每景影像裁剪.可采用subset via rois等等方法,但由于多幅影像间(在坐标系相同,分辨率相同的情况下),并非完美配准,因 ...

  2. IDL(ENVI/IDL) 简(jian)明(lou)教程:二、ENVI/IDL批处理入门(以投影转换为例)

    二.ENVI/IDL批处理入门 ENVI/IDL集成了ENVI软件的高级功能,比如打开文件直接使用envi_open_file, File ,r_fid=fid即可,不用考虑什么格式等,再比如做文件投 ...

  3. 2014年ENVI/IDL遥感应用与开发培训班-11月重庆站 開始报名了

    主办单位: 中国遥感应用协会 Esri中国信息技术有限公司 内容简单介绍: 依据中国遥感应用协会栾恩杰理事长推动国内遥感技术和应用的指示精神,2014年中国遥感应用协会组织培训交流部与Esri中国信息 ...

  4. ENVI+IDL使用

    在面对大批量遥感影像数据重复操作的时候,我们会想到批处理的方式.尽管遥感软件提供了一些批处理的方式,就小部分需求而言,单一的批处理方式往往是不够的,这时候程序化处理就派上用场了. (当然,也可以使用建 ...

  5. 软件介绍|ENVI/IDL软件及二次开发介绍

    ENVI是美国Exelis Visual Information Solutions公司的旗舰产品,它是由遥感领域的科学家采用交互式数据语言IDL(Interactive Data Language) ...

  6. ENVI IDL 实现 高分6号(GF-6)WFV 影像辐射定标

    参考以下帖子 https://download.csdn.net/download/qq_33356563/10573253 https://www.harrisgeospatial.com/docs ...

  7. 【ENVI IDL技术殿堂使用不了的解决办法】

    最近遇到点问题 大家好,我是学地理的小胖砸,最近两个月以来,新浪微博的常用技术博客(ENVI-IDL技术殿堂的官方博客存在打不开的问题),然后好多博文就看不成了,在这里经过一些相关的咨询和探索,发现一 ...

  8. 英文伪原创工具-免费批量英文伪原创软件

    英文伪原创工具,今天给大家分享一款免费批量英文伪原创软件,怎么批量伪原创英语文章,这里我教大家一个方法,我们只需要把英语文章翻译成中文在翻译成英文,你细心观察文章已经被伪原创了.通过这种方式可以达到批 ...

  9. 基于ENVI/IDL 的一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图

    ENVI/IDL (5.3版本)一键化实现LST-NDVI的干湿边方程拟合,并得到TVDI计算结果图 0 原理介绍 利用IDL将NDVI异常值进行剔除,NDVI取值范围为0.2~1(植被覆盖区),对反 ...

最新文章

  1. 两个程序员的泰国普吉岛之行
  2. 接收对象数组_示例: Bit数组
  3. python可选参数位置_每个位置参数的可选参数
  4. 【小白学习C++ 教程】七、在C++指针声明和指针相关概念
  5. 解决tfs工作区绑定问题
  6. 2021-07-29动态规划自学笔记
  7. cgcs2000高斯平面直角坐标_多元微积分——环量、旋度与格林、斯托克斯公式,通量、散度与高斯公式...
  8. 命令netstat和DHCP
  9. 计算机科学概论教学,《计算机科学概论》理论教学大纲
  10. 研发体系核心代码和文档安全保护方案
  11. 自媒体如何一步步变成臭要饭的(其二)
  12. 小米4 android6.01的开发者模式开启方法
  13. python的def什么意思_「Python基础」def是什么?如何自定义函数def
  14. zip压缩大于4g文件linux,linux下解压大于4G文件提示error: Zip file too big错误的解决办法...
  15. java中如何ping一个ip地址
  16. html网页页尾,终于认识网页页尾设计注意技巧
  17. 直播视频转换为文稿,分分钟就可以实现的方法来了
  18. BZOJ1193 马步距离 (贪心)
  19. 大厂面试爱问的HashMap死锁问题,看这一篇就够了
  20. 国外.net开源程序

热门文章

  1. linux dd命令制作软盘,【Linux】dd命令操作磁盘与镜像
  2. 尚学堂python培训的前景
  3. 博学谷前端 CSS字体样式属性
  4. 03环信好友管理 - 获取好友列表
  5. 8家最大的WooCommerce在线商店
  6. AD使用技巧——如何向AD里面导入图片(PCB打印图片、二维码)教程适用各个版本(17版及以前、18及以后、19、20、21版)(内附脚本文件下载)
  7. 域控管理员账号登录Windows Server 2016服务器,鼠标点击声音、图标等设置报错 rundll32.exe Windows无法访问指定设备、路径或文件。
  8. 华兴资本首日破发 包凡:对短期股价波动我们不太在意
  9. 超全的2022届数字IC面经汇总来了~
  10. Makemusic Finale for Mac(乐谱制作软件)破解教程