IDL考试前复习笔记(二) 自定义颜色矩阵显示,利用矩阵绘制legend标签

前言
  明天晚上坐火车回学校了,电脑可能就收起来了,只好白天写了,争取写博客的时候教学性更强一点让人更加容易看懂,毕竟这几篇文章可能对复习IDL考试有一些帮助,主要是有客户群体,开玩笑,哈哈!不过程序是应用导向的,写程序还是应该明白自己要干什么再写,要不然写起来很费时费劲,更别说考试的时候写了,背?头给你拧下来你也背不出来。

需求分析

Created with Raphaël 2.2.0 开始 读入二进制文件 创建颜色索引表并显示 创建标签并显示 结束

  所以开始按照需求部分来按块写代码,里面的内容尽量也写详细一些。

1.分配内存,读入二进制文件,并进行预处理

    file = 'C:\Users\黄\Desktop\classimage.dat'
    data = make_array(5963, 5988,type = 1)	  
    openr,lun,file,/get_lun
    readu,lun,data
    free_lun,lun
    data = congrid(data,596,599)

第一行是文件名没啥毛病,然后make_array创建一个大小为5963列,5988行的矩阵,注意IDL和另外语言的索引不一样,它先列再按行索引,所以有点奇葩。type为1是一种字节类型的数据
在这里插入图片描述
  openr,lun,file,/get_lun,lun
在这里插入图片描述
后面进行读文件操作,首先把文件读出来,再将值赋值给所需要的变量。
读取文件的过程openr,lun,filename,/get_lun,openr为只读模式不进行操作。
读取数据,lun可以理解成一种驱动号,或者读取文件的标识,也可以理解成为一个指针,/get_lun是自动获取lun;lun自动从100开始

  readu,lun,data
根据驱动号去读数据,由于是dat文件,普通记事本打开显示的时候照理应该是乱码,不过没啥影响,这些语言基本都有现成的方法可以读出来,二进制用readu读,然后lun是驱动号,将读出来的数据赋值给data这个变量,那么data就有数据了,就完成了读入数据的操作。

  free_lun,lun
完成后记得释放这个指针,要不然占内存,浪费空间。

  data = congrid(data,596,599)
congrid函数将数组的大小缩小或扩展任意数量。CONGRID与REBIN类似,它可以调整一维、二维或三维数组的大小,
但是如果REBIN要求新数组大小必须是原始大小的整数倍,CONGRID会将数组大小调整为任意大小。
(REBIN稍微快一些)当收缩一个数组时,REBIN平均多个点,而CONGRID只对数组重新采样。]
相当于将图缩小到原来的1/10,以便后面的tv显示。

2.创建窗体和索引矩阵和标签条,并且按照颜色显示

    window,1,xsize = 800,ysize = 700
    DEVICE, decomposed = 0
    lookup = [255, 255, 255, 90, 178, 115, 233, 255, 190, 240, 240, 240, 151, 219, 242, 214, 133, 137]
    lookup = reform(lookup,3,6)
    tvlct,lookup[0,*], lookup[1,*], lookup[2,*]
    ERASE, 0
    TV, data, 70,70,order = 1
    colbar = rebin(INDGEN(1, 6), 40, 240)
    TV, colbar, 650, 50
    LOADCT,0
    shadowdata = BYTARR(3,240)+180
    TV, shadowdata, 690, 50
    bottomshad = BYTARR(40,3)+180
    TV, bottomshad, 653,47
    classnames = ['background', 'forest', 'agriculture', 'city', 'water', 'other']
    xpos = 705+intarr(6)
    ypos = 60+indgen(6)*40
    xyouts,xpos,ypos,classnames, color=0,/device

  window,1,xsize = 800,ysize = 700
创建一个窗体,代号为1,窗体的横方向大小为800,纵方向为700。

  DEVICE, decomposed = 0
设备过程提供对当前图形设备的设备相关的控制(由set_PLOT例程设置)。IDL图形程序和功能与设备无关。
也就是说,IDL为用户提供了一个与所有设备一致的接口。但是,大多数设备都有一些额外的功能,
这些功能不能通过这个接口直接使用。设备用于访问和控制这些能力。它通过指定不同设备的不同关键字来使用。
设置此关键字可控制在使用分解颜色的显示器(TrueColor或DirectColor视觉效果)时如何解释颜色值。
此关键字对索引颜色设备没有影响,索引颜色设备通常使用每像素8位指定颜色。
这些是IDL帮助的翻译,其实理解下就是提供一种索引机制了

  lookup = [255, 255, 255, 90, 178, 115, 233, 255, 190, 240, 240, 240, 151, 219, 242, 214, 133, 137]
   lookup = reform(lookup,3,6)
   tvlct,lookup[0, *], lookup[1,*], lookup[2,*]

先创建一个矩阵,即按照RGB来显示,每3个列成一种颜色,一开始是个18个元素的行矩阵,reform将它重新改变大小为 3列6行的矩阵,然后tvlct,lookup[0,*]即按照每一列来显示,*代表全访问,即RGB分别为一、二、三列。

  ERASE, 0
  TV, data, 70,70,order = 1
由于创建后的界面是黑色的,通过erase,0将背景改成白色的,然后就是显示图像了,order必须加上否则图像会被倒过来。完成后应该是酱的。
在这里插入图片描述

截图没截好,尴尬,这时候已经完成了按照索引矩阵显示颜色的操作,后面继续进行标签的制作,

  colbar = rebin(INDGEN(1, 6), 40, 240)
  TV, colbar, 650, 50
创建colorbar,其实所谓的标签就只是一个矩阵而已,先创建一个0-5的矩阵,然后重采样为40列240行的矩阵,其实可以理解成宽和高,然后tv,colorbar就是显示了,由于之前已经设置了显示颜色的模式,即之前的tvlct,所以自动按照合适的颜色显示了。在这里插入图片描述

这里开始是创建标签条和阴影了!
  LOADCT,0
  shadowdata = BYTARR(3,240)+180
  TV, shadowdata, 690, 50
  bottomshad = BYTARR(40,3)+180
  TV, bottomshad, 653,47
这里必须重新加载显示颜色的方式,locadct,0
loadct过程加载一个预定义的IDL颜色表。除非指定了file关键字,否则这些颜色表在colors1.tbl文件中定义,
该文件位于主IDL目录的\resource\colors子目录中。
选定的颜色表将作为“当前”和“原始”颜色表加载到颜色公用块中。如果当前设备的颜色少于256种,颜色表数据将被插值以覆盖设备中的颜色数。
上面一段是IDL的帮助文档。

然后是老师自己加的阴影部分,创建一个数据类型为字节的矩阵即shadowdata,3列240行,其实就是右边的阴影即bottomshad,下面创建一个40列,3行的矩阵,就是下面阴影,
然后tv就是让他们显示在应该有的位置

  classnames = [‘background’, ‘forest’, ‘agriculture’, ‘city’, ‘water’, ‘other’]
  xpos = 705+intarr(6)
  ypos = 60+indgen(6)*40
  XYOUTS,xpos,ypos,classnames, color=0,/device

这里就是定义标签的名称,然后控制他们的位置,x方向是应该是一样的,intarr(6)是6个0,加上705就是6个705,然后y方向生成一个等差数列,从0开始到200,然后再加60,控制y方向的高度,可以显示在合适的位置。最后利用xyouts,x,y,var,color=0,/device来显示字体。整个程序就完成了。

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IDL中,BSQ(Band SeQuential)矩阵是一种用于存储多波段(多频谱)遥感影像数据的数据结构。它将每个像素的每个波段的值按照波段顺序存储起来,形成一个三维数组。BSQ矩阵的维度通常为[bands, rows, columns],其中bands表示波段数量,rows表示行数,columns表示列数。 BIL(Band InterLeaved by Line)矩阵也用于存储多波段遥感影像数据,但与BSQ矩阵不同的是,BIL矩阵将每个像素的所有波段的值按照像素顺序交错存储,形成一个维数组。BIL矩阵的维度通常为[rows, columns * bands]。 BIP(Band InterLeaved by Pixel)矩阵也用于存储多波段遥感影像数据,与BSQ和BIL矩阵不同的是,BIP矩阵将每个波段的所有像素的值按照波段顺序交错存储,形成一个维数组。BIP矩阵的维度通常为[rows * columns, bands]。 这三种矩阵的格式在存储遥感影像数据时各有优缺点。BSQ矩阵在处理一些基于波段的统计分析和算法时较为高效,因为它在内存中保持了每个波段的连续性。BIL矩阵在进行像素级的遥感影像处理时更为方便。BIP矩阵则更适用于像素级和波段级操作相结合的影像处理任务。 IDL提供了一系列用于读取、写入和处理这些矩阵格式的函数和命令,使用户能够方便地处理和分析遥感影像数据。可以根据具体的需求选择适合的矩阵格式,并利用IDL提供的工具进行相关的数据处理和分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值