【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: duhj@geoscene.cn

;-

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):