1. 程式人生 > 其它 >【IDL程式碼庫】IDL中實現bwareaopen功能(過濾斑塊)

【IDL程式碼庫】IDL中實現bwareaopen功能(過濾斑塊)

Matlab中的bwareaopen函式功能可檢視百度百科:

http://baike.baidu.com/link?url=zvIOHl35oJmAcA6pSIQh1INKyfppE8IkidfVEw_p0y2JtgFz1_WKfCB1B59ZU2_3GemYozbfzNUVAL2bLVaJNq

主要是為了刪除小面積物件,在遙感中來說一般用在分類後處理中,具備相同功能的ENVI工具叫做Sieve Classes。

在IDL中,可以呼叫ENVI API實現,如ENVIClassificationSievingTask、CLASS_CS_DOIT等。

如果不想呼叫ENVI API,可以藉助IDL的LABEL_REGION函式進行實現。程式碼如下:

原始碼與資料檔案下載地址:http://pan.baidu.com/s/1dDtrE5F

;+

; :Description:

  實現與 Matlab 的 bwareaopen 相同的功能

  將 bindata.sav  bwareaopen.pro 放在同一路徑下即可執行

;

; :Author: [email protected]

;-

PRO bwareaopen

 COMPILE_OPT idl2

 ;讀取二值影象

  binFile = FILE_DIRNAME(ROUTINE_FILEPATH('bwareaopen'))+$

   PATH_SEP()+'bindata.sav'

 RESTORE, binFile

 

 ;顯示原始二值影象

 i=image(BYTSCL(bin), DIMENSIONS=[1200,400], LAYOUT=[3,1,1], $

   TITLE='原始二值影象', WINDOW_TITLE='bwareaopen', /ORDER)

 

 ;進行分塊標註

  region = LABEL_REGION(bin, /ULONG, /ALL_NEIGHBORS)

 ;對標註進行直方圖統計

  hist = HISTOGRAM(region, BINSIZE=1, LOCATIONS=locs, min=1)

 

 ;找到最大的塊,並顯示(這裡沒有考慮有多個最大塊的情況)

  result = region EQ ((WHERE(hist EQ MAX(hist)))[0]+1)

 i=image(BYTSCL(result), /CURRENT, LAYOUT=[3,1,2], $

   TITLE='最大的塊', /ORDER)

 

 ;找到像元數大於1000的塊,並顯示

  label = locs[WHERE(hist GE 1000)]

  sz = SIZE(bin, /DIMENSIONS)

  result = BYTARR(sz[0], sz[1])

 FOR i=0,N_ELEMENTS(label)-1 DO BEGIN

   result = result OR (region EQ label[i])

 ENDFOR

 i=image(BYTSCL(result), /CURRENT, LAYOUT=[3,1,3],$

   TITLE='大於1000的塊', /ORDER)

END

  

IDL實現效果如下:

 

ENVI中利用Sieve Classes工具實現的效果(左:原始,右:大於1000):