IDL/Image Processing

제임스웹 우주망원경(JWST) 데이터의 입수 및 표출

이상우_idl 2022. 7. 29. 15:01
728x90
반응형

제임스웹 우주망원경(JWST)에 관해서는 이미 언론 기사 등을 통하여 많이 보셨을 것 같습니다. JWST(James Webb Space Telescope)는 현존하는 최대 크기의 우주망원경으로서 얼마전(712) 첫번째 관측 이미지를 공개하면서 많은 화제와 관심을 불러일으키고 있습니다. 그리고 초기 관측 데이터들이 관련 웹페이지를 통하여 제공되고 있는데요. 오늘은 이 데이터 파일을 수신하고 IDL에서 간단하게 처리 및 표출해보는 예제를 소개하고자 합니다.

 

현재 JWST 데이터는 MAST(Mikulski Archive for Space Telescopes)라는 포탈 웹사이트를 통하여 제공되고 있습니다. 이 웹페이지에서는 계정 등록이나 로그인 절차 없이도 데이터의 조회 및 다운로드가 가능하게 되어 있습니다. 물론 각종 알림 및 좀 더 깊이있는 서비스를 받기 위해서는 해당 웹페이지에서 따로 계정 등록을 할 수도 있습니다. 어쨌든 MAST 웹사이트에서 상단을 보면 유저 인터페이스가 보입니다. 여기서 Select a collection에 대해서는 JWST Instrument Keywords를 선택하고 Instrument에 대해서는 MIRI를 선택한 후 Advanced Search 버튼을 누릅니다. 참고로 MIRIMid-Infrared Instrument라는 탑재 장비 이름의 약자입니다.

 

 

Advanced Search 버튼을 누르면 새로운 팝업창이 뜨는데 여기서 하단부에 있는 각종 필터 옵션들 중 targname이라는 항목(Target Name이라는 의미)의 리스트로 가서 Show More 버튼을 누르고 관심 대상을 선택합니다. 여기서는 다음과 같이 NGC 628을 선택하였습니다.

 

 

다음에는 웹페이지의 상단에 있는 Search 버튼(망원경 아이콘)을 누릅니다.

 

 

그러면 다음과 같이 해당 데이터 파일들의 목록을 볼 수 있게 됩니다. 여기서는 일단 왼편의 각종 필터 옵션들 중에서 productLevel3으로 선택하여 여러 종류의 초벌 처리 과정들(radiometric correction, coregistering, bad pixels correction 등)가 된 데이터 파일들만 추려내봅시다.

 

 

그러면 위와 같이 총 184개 중 24개의 파일들로 목록이 구성됨을 볼 수 있습니다. 이제 이 파일 목록에서 원하는 것들을 고르면 되는데 여기서는 다음과 같은 세 개의 파일들을 골라보았습니다.

 

jw02107-o039_t018_miri_f1000w_i2d.fits

jw02107-o039_t018_miri_f1130w_i2d.fits

jw02107-o039_t018_miri_f2100w_i2d.fits

 

이 웹페이지에서는 파일을 선택할 때마다 그 데이터가 공간상으로 어느 부분을 본 것인지를 우측의 이미지 및 영역 표시를 통하여 확인할 수 있습니다. 따라서 우리가 선택한 데이터 파일들이 은하 중심부에 해당됨을 확인할 수 있습니다. 파일들의 선택이 끝난 후에는 장바구니 버튼을 눌러서 파일들을 담고 다운로드 버튼을 눌러서 ZIP 파일로 된 파일 묶음을 받으면 됩니다. 아니면 각 파일에 대하여 다운로드 버튼(디스켓 모양 아이콘)을 눌러서 개별 다운로드를 해도 됩니다.

 

 

다운로드가 끝난 후에는 ZIP 파일을 풀어서 데이터 파일들을 PC의 적당한 폴더에 담아두어야 합니다. 다만 여기서는 데이터 파일의 형식이 FITS라는 것에 주목해야 합니다. FITS 형식의 파일은 IDL에서 기본적으로 지원되지는 않습니다. 그 대신 IDL Astro 라이브러리를 별도로 설치해야 IDL에서 FITS 형식의 파일을 처리할 수 있게 됩니다. 아마도 천문학 및 우주과학 분야의 IDL 사용자들은 이 라이브러리를 설치해서 사용중인 경우가 많은 것으로 알고 있습니다. 그리고 꼭 그 분야가 아니더라도 READCOL 명령을 사용하기 위하여 이 IDL Astro 라이브러리를 설치하여 사용하는 경우도 많습니다. 어쨌든 IDL Astro 라이브러리의 다운로드 및 설치 방법에 관해서는 제가 예전에 관련 게시물을 통하여 소개한 바 있으므로 이 내용을 참조하시기 바랍니다.

 

이제 앞서 다운로드해놓은 FITS 파일들 중 하나를 읽어봅시다. 그 과정은 다음과 같습니다.

 

file = 'jw02107-o039_t018_miri_f1000w_i2d.fits'

FITS_READ, file, data

HELP, data

PRINT, MIN(data), MAX(data)

 

이와 같이 FIST_READ 명령을 사용하여 FITS 파일에 수록된 이미지 데이터를 data라는 배열로 추출하였는데, HELP PRINT에 의하여 출력된 내용을 보면 다음과 같습니다.

 

DATA     FLOAT = Array[2379, 1178]

      0.00000      424.202

 

여기서 이미지 데이터의 모습을 보기 위하여 표출 과정으로 넘어가야 하는데, 그 과정은 다음과 같습니다.

 

sz = SIZE(data, /DIM)

win = WINDOW(DIMENSIONS=sz, /NO_TOOLBAR)

i = IMAGE(data>25<45, MARGIN=0, /CURRENT)

 

이와 같이 이미지와 동일한 크기의 그래픽창을 띄우고 IMAGE 함수를 사용하여 표출합니다. 다만 이 데이터의 경우 화소값들의 분포를 고려하여 위와 같이 25~45 범위로 클리핑(Clipping) 처리를 하여 표출하는 것이 좋을 것 같습니다. 표출된 모습은 다음과 같습니다.

 

 

모습을 보면 주로 가장자리 부근의 일부 영역들(특히 맨 왼쪽 부분)은 아예 잘라내는 것이 더 나을 것 같습니다. 이를 위하여 FITS_READ로 데이터를 읽은 직후에 다음과 같이 부분 영역을 추출하기 위한 배열 인덱싱 과정을 추가해봅시다.

 

file = 'jw02107-o039_t018_miri_f1000w_i2d.fits'

FITS_READ, file, data

data = data[401:2200, 41:1120]

HELP, data

PRINT, MIN(data), MAX(data)

 

그러면 data1800x1080 크기의 이미지 배열이 됩니다.

 

DATA      FLOAT = Array[1800, 1080]

      0.00000      424.202

 

나머지 표출 과정은 동일합니다. 다시 표출해본 모습은 다음과 같습니다.

 

 

이 이미지 데이터에 관한 자세한 스펙 정보는 헤더를 통하여 확인할 수 있는데, 이를 위하여 다음과 같이 HEADFITS 함수를 사용하여 헤더 정보를 추출하면 됩니다.

 

header = HEADFITS(file)

HELP, header

 

이와 같이 헤더 정보를 header라는 배열로 추출해보면 다음과 같이 350종의 정보들로 구성되어 있음을 확인할 수 있습니다.

 

HEADER          STRING    = Array[350]

 

그리고 이 header를 PRINT 명령으로 출력해보면 그 내용을 자세히 확인할  수 있습니다. 다음은 그 중 일부 내용입니다.

 

DATE-OBS= '2022-07-17'         / [yyyy-mm-dd] UTC date at start of exposure     
TIME-OBS= '11:18:14.345000'    / [hh:mm:ss.sss] UTC time at start of exposure   
DATE-BEG= '2022-07-17T11:18:14.345' / Date-time start of exposure               
DATE-END= '2022-07-17T13:04:37.055' / Date-time end of exposure                 
OBS_ID  = 'V02107039001P0000000002103' / Programmatic observation identifier    
VISIT_ID= '02107039001'        / Visit identifier                               
PROGRAM = '02107   '           / Program number                                 
OBSERVTN= '039     '           / Observation number                             
VISIT   = '001     '           / Visit number                                   
VISITGRP= '02      '           / Visit group identifier                         
SEQ_ID  = '1       '           / Parallel sequence identifier                   
ACT_ID  = '03      '           / Activity identifier                            
EXPOSURE= '1       '           / Exposure request number                        
BKGDTARG=                    F / Background target                              
TEMPLATE= 'MIRI Imaging'       / Observation template used                      
OBSLABEL= 'NGC628  '           / Proposer label for the observation             

 

지금 보고 있는 데이터는 MIRI 장비의 F1000W 필터로 관측된 것이며, 다른 필터에 대한 데이터 역시 해당 파일을 읽어서 표출해볼 수 있습니다. 그러면 F1130W 필터 데이터 파일을 대상으로 다시 작업을 해봅시다. 전반적인 과정은 동일합니다. 다만 파일명이 변경되어야 하며, 이미지 클리핑의 범위도 변화가 필요합니다. 따라서 앞서 제시했던 과정에서 변경이 필요한 부분들만 보면 다음과 같습니다.

 

file = 'data/JWST/jw02107-o039_t018_miri_f1130w_i2d.fits’

i = IMAGE(data>35<85, MARGIN=0, /CURRENT)

 

이러한 변동사항만 반영하여 전체 과정을 다시 실행해보면 표출 결과는 다음과 같습니다.

 

 

위의 과정들을 보면 클리핑의 범위가 F1000W 데이터의 경우는 25~45였던 반면 F1130W 데이터의 경우는 35~85로 처리하였는데, 이와 같이 클리핑 범위가 변경되어야 하는 것은 아마도 노출 시간의 차이 때문인 것으로 보입니다. F2100W 데이터의 경우는 또 다릅니다. 즉 데이터 값 범위가 더 크기 때문에 클리핑의 범위를 대략 다음과 같이 200~350으로 설정해보았습니다.

 

file = 'data/JWST/jw02107-o039_t018_miri_f2100w_i2d.fits’

i = IMAGE(data>200<350, MARGIN=0, /CURRENT)

 

이러한 변동사항만 반영하여 전체 과정을 다시 실행해보면 표출 결과는 다음과 같습니다.

 

 

물론 클리핑의 범위를 정하는 것 뿐 아니라 컬러테이블의 설정 등 여러가지 처리 과정들은 연구자의 판단에 의하여 적절하게 선택되어야 할 것입니다. 예를 들어 맨 처음에 처리했던 F1000W 데이터에 대하여 적용할 컬러테이블을 직접 만들고 클리핑의 범위도 다시 조정해볼 수 있는데, 주요 변동사항들은 다음과 같습니다.

 

file = 'data/JWST/jw02107-o039_t018_miri_f1000w_i2d.fits’

ct = COLORTABLE(['black', 'green', 'violet', 'white'])
i = IMAGE(data>25<35, RGB_TABLE=ct, MARGIN=0, /CURRENT)

 

이러한 변경사항만 반영하여 전체 과정을 다시 실행해보면 표출 결과는 다음과 같습니다.

 

 

다만 여기서 유의해야 할 것은, 위의 그림에서 보이는 색상은 절대로 실제가 아니며 그냥 편의상 가상으로 적용한 가짜 색상(False Color)이라는 것입니다. 사실 이런 데이터의 경우는 "실제 색상"이라는 말 자체가 의미가 없습니다. 왜냐하면 이 데이터 자체가 적외선 관측 데이터이고, 적외선이라는 파장영역은 가시광 영역 바깥이기 때문에 어차피 우리 눈에는 보이지 않습니다. 색상이라는 개념 자체는 가시광 영역에서만 유효합니다. 따라서 이러한 데이터에 대하여 어떤 색상을 입히든 그것은 프로그래머의 자유입니다. 따라서 우리가 언론 기사 등을 통하여 보는 천체 사진들 중에는 이런 경우도 많다는 것을 염두에 두시면 좋습니다(물론 그런 사진들에 적용된 "가짜 색상" 역시 데이터 특성 및 시각적 화려함 등을 종합적으로 고려한 결과입니다).

 

오늘 소개된 예제에서 사용한 데이터 파일들 및 그 처리 방식은 그냥 하나의 예시일 뿐입니다. 연구자의 목적에 따라 좀 더 복잡하고 세밀한 처리에 의하여 더욱 의미있는 결과를 얻을 수도 있을 것입니다. 어쨌든 JWST의 데이터를 이와 같은 방식으로 입수하여 IDL에서 처리 및 표출을 해볼 수 있다는 것을 참조해두시면 좋을 것 같습니다. 오늘 소개된 내용은 얼마전 L3Harris Geospatial 웹페이지에 올라온 관련 게시물을 참조한 것임을 밝혀둡니다. 실제로 L3Harris Geospatial의 모기업인 L3Harris는 이 JWST 프로젝트에 직접 참여하고 있기도 합니다.

반응형