IDL을 이용한 Band math 문의드립니다.

게시판 IDL Q&A IDL을 이용한 Band math 문의드립니다.

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2916 Reply
      angel7379
      회원

      안녕하세요. 성균관대 조경학과 박사과정 임중빈입니다.

      다름이 아니라 IDL로 ENVI band math 기능을 반복적으로 활용하는 방법에 대해 문의드리고 싶습니다.

      제가 인터넷에서 검색을 해 봤으나 해결하지 못해서 이렇게 문의드립니다. 죄송합니다.

      제가 가지고 있는 영상이 0~255 DN 값을 갖는 영상입니다.

      그래서 ((x*0.0078125)-1) 수식을 적용하여 -1부터 1까지의 DN 값을 갖는 영상으로 변환하고 싶습니다.

      파일명들은 JAPAN831221-30_NDVI.tif, JAPNA831211-20_NDVI.tif, JAPAN831201-10_NDVI.tif, etc. 로

      JAPAN**(년도)****(날짜)-**(10,20,30 일 합성)_NDVI.tif 의 규칙으로 반복이 됩니다.

      이 때 IDL 명령어를 어떻게 작성해야 할까요?

      제가 인터넷 찾아보고 작성해본 명령어는 아래와 같습니다.

      e=envi()
      cd, ‘C:\downloads\AVHRR\AVHRR_NDVI\AVHRR_NDVI\1983’

      files1983=file_search(‘JAPAN83*NDVI.tif’, count=ct1983)
      for i = 0, ct1983-1 do $
      Raster=e.openraster(Files1983[i])
      OUTFILE = Files1983[i]+’R.tif’
      fid = ENVIRasterToFID(raster)
      ENVI_File_Query, fid, DIMS=dims
      ENVI_Doit, ‘Math_Doit’, $
      FID = [fid, fid], $
      DIMS = dims, $
      POS = [0], $
      EXP = ‘(b1*float(0.0078125))-float(1)’, $
      OUT,NAME = OutFile

      envi_batch_exit

      end

      오류가 발생하고 진행이 되지를 않았습니다. 어떻게 수정해야 할까요?

      그리고 년도별 영상의 평균 영상을 제작하고 싶은데요

      file_search와 같이 자동으로 년도를 검색하고, 그 파일들의 평균 파일을 구하는 명령어가 있을까요?

      제 질문을 요약하면 다음과 같습니다.

      Q1. JAPAN******-**_NDVI.tif 의 이름을 갖는 모든 영상의 DN값 변환

      Q2. 년도별 NDVI 평균값 계산 반복

      저도 계속 찾아보겠습니다. 감사합니다.

      • 이 게시글은 angel7379에 의해 7 years, 8 months 전에 수정됐습니다.
      • 이 게시글은 angel7379에 의해 7 years, 8 months 전에 수정됐습니다.
    • #2920 Reply
      jhlee
      Keymaster

      안녕하세요, 이제 온라인에서도 뵙게되었네요 ㅎㅎ 반갑습니다.
      위 내용과 관련하여 에러 메시지도 알려주셨으면 어떤 문제인지 더 정확히 파악할 수 있을 것 같은데요, 우선은 알려주신 코드로 실행해본 후 몇가지 문제에 대해 말씀드립니다.

      – 먼저 for 문 이후 begin 이 실행되지 않았습니다. i 가 순차적으로 증가할 때마다 outfile까지 처리가 되어야 할 것 같은데요, 위 경우라면 e.openraster가 한번에 처리되고 이후, outfile 지정하는 부분으로 넘어가는데 문제가 생깁니다.

      – out,name은 단순 오타인지, 정말로 저렇게 사용하신 것인지 모르겠습니다. out_name으로 쓰셔야 합니다.

      – 각 영상을 호출하고 단일 영상에서 각 픽셀에 대한 값을 변경하는 것이므로 fid는 1개이면 됩니다.

      심각한 문제는 아니지만 조금 더 말씀드리면,
      – outfile 이름도 저 상태로라면 다소 이상하게 저장됩니다. files1983[i]에서 이미 .tif가 들어가 있기 때문에 “원본.tifR.tif”가 될 것 같습니다.
      – 0.0078125는 이미 실수형이기 때문에 float으로 감싸지 않으셔도 됩니다.

      위 내용으로 수정한 예시 코드를 추가합니다.
      compile_opt idl2
      e=envi()

      files1983=file_search(‘JAPAN83*NDVI.tif’, count=ct1983)

      for i = 0, ct1983-1 do begin
      Raster=e.openraster(Files1983[i])
      temp_name = strmid(files1983[i], 0, 19)
      OUTFILE = temp_name+’_R’

      fid = ENVIRasterToFID(raster)
      ENVI_File_Query, fid, DIMS=dims
      ENVI_Doit, ‘Math_Doit’, FID = [fid], DIMS = dims, POS = [0], EXP = ‘b1*0.0078125-1.’, OUT_NAME = OutFile
      endfor

      • #2923 Reply
        angel7379
        회원

        안녕하세요! 답변 감사합니다. 수정해주신 코드로 한번 시도해보겠습니다.
        그리고 한가지 질문이 있는데요 아래 답변해주신 방법에서 평균값이 아닌 최대값을 구하는 명령어도 있나요?

      • #2926 Reply
        jhlee
        Keymaster

        물론 가능합니다. max 함수를 쓰시면 됩니다(참고로 평균은 mean 함수입니다).
        다만, 각 밴드를 open 할때마다 비교를 하여 max를 찾는 방법은 처리 시간으로 보면 비효율적일 것 같습니다.
        메모리 문제가 없다면 임시의 2차원 배열을 생성하는 것이 아니라 3차원 배열(동일 규격의 x size * y size * 영상개수)을 만들어 한번에 읽고 비교 및 처리를 하는 것이 좋을 것 같습니다.

    • #2921 Reply
      jhlee
      Keymaster

      년도별 평균값에 대해서는, 모든 영상의 사이즈가 동일하다면 해당 크기만큼의 빈 배열을 만들어놓고 i, j에 대한 2개의 for문을 통해 각 픽셀에 대한 평균값을 입력하는 방식이면 되리라 생각합니다.
      년도별 데이터 개수와 각 영상의 사이즈에 따라 메모리 문제가 발생할 수도 있으나 열흘 간격의 약 36~37개 파일이라면 무리는 되지 않을 것으로 예상합니다.

2 답변 글타래를 보이고 있습니다
'IDL을 이용한 Band math 문의드립니다.'에 답변달기
글쓴이 정보: