野外定点工作,常常需要和影像数据相匹配,就是以野外采样数据与影像的DN值两者之间进行比较、分析。那么,野外的样点坐标信息是已知的,剩下的就是依照样地地理坐标提取影像上的对应DN值。
有两种方法可以实现提取DN值的目的,ENVI手动获取和ENVI+IDL编程提取。下面,分别介绍这两种方法的步骤和特点:
ENVI手动方法
打开影像,Load Band一下,在主图像窗口双击打开CursorLocation/Value窗口,动态显示鼠标在图像上游艺的位置。接下来,还是在主图像窗口右键打开Pixel Locator,如图 1设置经度、纬度,注意图 1中的Sample表示列,Line表示行,均从1开始计算。
图 1
设置好后单击左下角Apply,查看之前打开的CursorLocation/Value窗口,Data显示0.152500即为图 1对应经纬度像元的DN值。
图 2
ENVI手动方法比较简单,容易上手。但是对于多组坐标和多幅图像,这个方法就太吃力了。
ENVI+IDL提取DN值
提取思路:将经纬度坐标转换为图像上对应的行列号,最后提取之。
代码运行的准确性,以方法1中的坐标检验代码提取的DN与ENVI是否相同?
如图 3,红框中的数值与方法1提取结果一致,其他坐标也是一样,证明这个方法还是有效的。
图 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | ;;Created by LI Xu ;;15 April, 2014 ;;Version 1.0 ;;Extraction based on the known GeoInformation(Lat&Long) ;;Description: csv, a fullpath of an .csv ;; inImage, a fullpath of an image ;; otDN, returned DNs ;;Reference Website: http://www.gisall.com/wordpress/?p=8319 ;;Modification Record ;;22 October, 2014 ;;Version 1.1 Add output the No(Column, Row)=Value in the Console Column and Row start from 0 pro ExtratDN, csv, inImage, otDN ;;Debug Block ;;csv='F:\Test\Practice\DNVI\h27v06.csv' ;;inImage='F:\Test\Practice\DNVI\MOD13A3.2008.h27v06.tif' csv='F:\Test\Practice\Exercise\GeoInfo.csv' inImage='F:\Test\Practice\Exercise\MOD_2011_EVI.tif' ;;Retrieve long&lat from .csv txt=Read_Csv(csv, header=header) no=txt.field1 lon=txt.field2 ;;Longtitude lat=txt.field3 ;;Latitude ;;Convert to the Projection as same as the Imput Image ;1. Retrieve the Pojection Info from Input Image ENVI_OPEN_FILE, inImage, r_fid=fid ProjInfo=ENVI_GET_PROJECTION(fid=fid) ;2. Original projection of Lon/Lat OriProj=ENVI_PROJ_CREATE(/geographic) ;3. Process of Convert ENVI_CONVERT_PROJECTION_COORDINATES, $ lon, lat, OriProj, $ otX, otY, ProjInfo ;;Extract the Col & Row for the input Geoinfo ;1. Geolocation of Upper Left Point (0, 0) of the Input Image mapinfo=ENVI_GET_MAP_INFO(fid=fid) ULlon=mapinfo.mc(2) ULlat=mapinfo.mc(3) ;2. X/Y Size of the Input Image Xsize=mapinfo.PS(0) Ysize=mapinfo.PS(1) ;3. Calculate the Number of Col & Row Coll=(otX-ULlon)/Xsize Row=(otY-ULlat)/Ysize Row=fix(abs(Row)) ;;Subscript directly from 0 Coll=fix(abs(coll)) ;;Extraction of DN ;1. Number of DNs N_DN=N_Elements(Row) otDN=fltarr(N_DN) ;2. Retrieve the DN one by one tiff=Read_Tiff(inImage, GeoTIFF=GeoVar) for ii=0, N_DN-1 do begin otDN(ii)=tiff(Coll(ii), Row(ii)) print, strtrim(string(no(ii)),2)+'('+ strtrim(string(Coll(ii)), 2)+','+strtrim(string(Row(ii)), 2)+'):='+strtrim(string(otDN(ii)), 2) endfor end |
No comments:
Post a Comment