1. 程式人生 > 其它 >【IDL程式碼庫】IDL中顯示分類影象的方法

【IDL程式碼庫】IDL中顯示分類影象的方法

IDL作為第四代視覺化語言,具有強大的視覺化能力。根據方法的不同,可以分為四類視覺化手段,分別為快速視覺化(IDL 8.0版本開始提供)、直接圖形法、物件圖形法和智慧化程式設計工具。

這裡以顯示分類結果影象為例,展示IDL的視覺化能力。大體思路是獲取分類資料(二維陣列)、獲取顏色表(lookup),然後利用IDL提供的視覺化函式進行展示。

注:分類結果為ENVI標準格式。

快速視覺化中,用到了如下兩個函式:

  • Image —— 顯示影象
  • Colorbar —— 顯示顏色條

直接圖形法中,用到的函式或過程較多,如下:

  • Window —— 過程,新建繪圖視窗
  • Loadct —— 載入顏色表
  • Modifyct —— 自定義顏色表
  • TV —— 繪製圖像
  • Xyouts —— 標註類名

物件圖形法中,用到了如下物件:

  • IDLgrWindow —— 繪圖視窗
  • IDLgrView —— 檢視物件,用來載入影象和顏色條
  • IDLgrModel —— 容器
  • IDLgrImage —— 影象物件,顯示分類結果
  • IDLgrColorbar —— 顏色條物件
  • IDLgrPalette —— 顏色表物件
  • IDLgrFont —— 字型物件,修改顏色表標註字型

從上述說明中,也可看出,在實現相同視覺化效果的前提下,快速視覺化是最簡單、最快捷的方法。

下面欣賞視覺化效果。

 

圖:快速視覺化

 

圖:直接圖形法

 

圖:物件圖形法

附原始碼如下,可直接執行,在彈出的對話方塊中選擇分類結果影象即可。

;+

; :DESCRIPTION:

 Display Classification Image in IDL

 Three Methods:Quick Graphics/Direct Graphics/Object Graphics

;

; :AUTHOR: [email protected]

;

; :Date: 2014-7-10

;-

PRO DisplayClassificationImage

 ;啟動ENVI批處理

 COMPILE_OPT idl2

 ENVI, /RESTORE_BASE_SAVE_FILES

 ENVI_BATCH_INIT

 ;選擇檔案,如果不存在則返回

  file = ENVI_PICKFILE

(TITLE='Select the classification image')

 IF ~FILE_TEST(file) THEN RETURN

 ;開啟檔案,判斷如果不是分類結果,則返回

 ENVI_OPEN_FILE, file, r_fid=fid

 ENVI_FILE_QUERY, fid, nb=nb, ns=ns, nl=nl,$

   dims=dims, file_type=ft, lookup=lookup, $

   class_names = classNames, NUM_CLASSES = n_classes

 IF fid[0EQ -1 THEN RETURN

 

 ;如果不是分類影象,則返回

 IF ft NE 3 THEN RETURN

 ;獲取資料

  data = ENVI_GET_DATA(fid=fid, dims=dims, pos=0)

 

 ;判斷如果IDL版本是否低於8.0,如果低於8.0則只用直接圖形法

 IF !version.RELEASE LT 8.0 THEN GOTO, jump

 ;******************快速視覺化*************************************

 ;顯示影象

 IF n_classes EQ 3 THEN rgb_table=TRANSPOSE(lookup,[1,0]) $

 ELSE rgb_table = lookup

  i = image(data, /order, rgb_table=lookup, $

   MARGIN=[.1,.1,.3,.1], window_title = 'Quick Graphics')

  iPos = (i.POSITION)[1]

  c = colorbar(target=i, tickname=classNames,      $

   font_name='Microsoft Yahei', font_size=12    $

   position = [.75,iPos,.80,iPos+.065*n_classes], $

   ORIENTATION=1                                $

   TEXTPOS=1, RGB_TABLE=RGB_TABLE)

 

 jump:

 ;******************直接圖形法*************************************

 ;直接圖形法需要修改顏色表

 DEVICE, DECOMPOSED=0

 

 ;將影象重取樣至400列

  new_ns = 400

  new_nl = nl*400/ns

 window,0,XSIZE=new_ns+300, YSIZE=new_nl+100, $

   title = 'Direct Graphics'

 ;背景色為白色

 loadct0

 ERASE,255

 ;自定義顏色表

 loadct, get_names=TableNames

 n_ColorTable = N_ELEMENTS(TableNames)

 MODIFYCT74, 'New ColorTable', $

   lookup[0,*],lookup[1,*],lookup[2,*]

 loadct74

 ;載入顯示影象

 TVcongrid(data,new_ns,new_nl), 50,50, /ORDER

 ;繪製顏色條

 colorbarData = REBIN(INDGEN(1,n_classes),30,30*n_classes)

 TV, colorbarData, new_ns+10050

 loadct0

 ;繪製顏色條陰影

  tmpData = REBIN(INTARR(1,n_classes)+180,2,30*n_classes)

 TV, tmpData, new_ns+13050

 ;繪製類名

 !p.FONT = 0

 DEVICE, SET_FONT='Microsoft Yahei*22'

  LabelX = INTARR(n_classes)+new_ns+140

  LabelY = 58+INDGEN(n_classes)*30

 XYOUTS,LabelX, LabelY, classNames, color=0, $

   /device

 

 ;******************物件圖形法*************************************

 ;視窗

  new_nl = 400

  new_ns = ns*new_nl/nl

 ;物件圖形法視窗

  oWin = IDLGRWINDOW(DIMENSIONS=[new_ns+250,new_nl+100], $

   RETAIN=2, TITLE='Object Graphics')

 ;影象和顏色條的IDLgrView

 oViewImage = IDLGRVIEW(DIMENSIONS=[new_ns,new_nl],     $

   VIEWPLANE_RECT=[0,0,ns,nl], LOCATION=[50,50])

 ;容器IDLgrModel

  oModel = IDLGRMODEL()

 ;影象物件IDLgrImage

  oImage = IDLGRIMAGE(ROTATE(data, 7))

 ;顏色表

  oPalette = IDLGRPALETTE(lookup[0,*],lookup[1,*],lookup[2,*])

 oImage.SetProperty, PALETTE=oPalette

 ;顯示影象

 oViewImage.Add, oModel

 oModel.Add, oImage

 oWin.Erase

 ;初始化顏色條

  oColorbar = IDLgrColorbar(lookup[0,*],lookup[1,*],lookup[2,*], $

   MAJOR=6, SHOW_AXIS=2, TICKLEN=0, $

   TICKVALUES=INDGEN(n_classes)+0.5)

 ;字型

  oFont = IDLGRFONT('Microsoft Yahei', SIZE=12)

  ticktext = IDLGRTEXT(classNames, FONT=oFont)

 oColorbar.SetProperty, ticktext = ticktext, $

   DIMENSIONS=[30,30*n_classes], $

   show_outline = 1

 

 ;顏色條容器 IDLgrView

 oViewColorbar = IDLGRVIEW(LOCATION=[new_ns+100,50], $

   DIMENSIONS=[200,new_nl], VIEWPLANE_RECT=[0,0,200,new_nl])

 oModelColorbar = IDLGRMODEL()

 oViewColorbar.Add, oModelColorbar

 oModelColorbar.Add, oColorbar

 ;顯示影象和顏色條

  oScene = IDLGRSCENE()

 oScene.Add, oViewImage

 oScene.Add, oViewColorbar

 ;繪製圖像和顏色條

 oWin.Draw, oScene

 END