IDL/Python in IDL

파이썬의 컬러테이블을 IDL에서 사용해보기

이상우_IDL 2025. 9. 16. 15:17
728x90

IDL에서 컬러테이블(Color Table)을 사용하는 방법에 관해서는 이 블로그에서 각종 게시물들을 통하여 이미 여러 차례 소개한 바 있습니다. 그 특성상 주로 이미지(Image)나 등위선(Contour) 등의 표출에서 많이 사용하게 됩니다. 현시점 기준으로 IDL에서는 75종*의 컬러테이블들이 지원되고 있으며, 물론 필요에 따라서는 커스텀 컬러테이블을 생성하여 사용하는 것도 가능합니다. 기본적으로 지원되는 75종의 컬러테이블들을 전체적으로 조회하는 방법은 예전에 관련 게시물을 통하여 소개한 바 있습니다. 또한 웹상의 관련 링크를 참조하셔도 됩니다.

 

* 사실 엄밀히 말하면 0부터 75까지 총 76종이긴 하지만, 75번 컬러테이블은 74번 컬러테이블의 색상들의 순서만 뒤집은 것이기 때문에 사실상 75종이라고 봐도 무방합니다.

 

그런데 오늘 소개하고자 하는 내용은 파이썬에서 지원되는 컬러테이블들을 IDL로 가져와서 사용하는 방법에 관한 것입니다. 실제로 파이썬에서 지원되는 컬러테이블들 중에는 IDL에는 없지만 꽤 탐나는(?) 것들이 많이 있는데, 이제 IDL에서도 파이썬 기능을 바로 사용할 수 있게 되었기 때문에 파이썬의 컬러테이블을 가져와서 IDL에서 사용해보는 것이 가능합니다. 물론 이러한 방법론은 파이썬 기능을 내장하기 시작한 IDL 9.2 버전에서만 유효합니다. 또한 Matplotlib 라이브러리를 추가로 설치한 상태를 가정합니다. 이미 타 게시물에서 언급하였듯이 IDL 9.2에 내장된 파이썬에는 Matplotlib 라이브러리가 기본적으로 탑재되어있지는 않기 때문에 별도로 설치해줘야 하며, 다음과 같이 PyUtils 클래스의 PipInstall 메서드를 이용하여 Matplotlib 라이브러를 설치하면 됩니다.
 
IDL> PyUtils.PipInstall, 'Matplotlib'
 
이러한 명령을 실행하면 이제 IDL의 내장 파이썬에서도 Matplotlib 라이브러리를 사용할 수 있게 되며, 이 라이브러리에서 지원되는 다양한 컬러테이블들에 접근할 수 있습니다. 그러한 컬러테이블들 중에서 "viridis"라는 이름의 컬러테이블을 가져와보기로 합시다. 이러한 작업은 일단 다음과 같이 시작합니다.

 

COMPILE_OPT STRICTARR

cm = Python.Import('matplotlib.cm')
ctname = 'viridis'
cmap = cm.get_cmap(ctname)
HELP, cmap

 

여기서는 파이썬의 viridis라는 컬러테이블의 컬러 데이터를 cmap이라는 항목으로 가져온 것입니다. HELP에 의하여 출력된 내용을 보면 cmap 자체는 파이썬의 ListedColormap이라는 클래스의 객체입니다.

 

CMAP            PYTHON  <ID=94474>  <class 'matplotlib.colors.ListedColormap'>

 

하지만 cmap에 대하여 0~1 범위의 위치값을 주면 해당 컬러의 성분값들을 얻을 수 있습니다. 예를 보면 다음과 같습니다.

 

PRINT, cmap(0)

      0.26700400000000002
    0.0048739999999999999
      0.32941500000000001
       1.0000000000000000

 

PRINT, cmap(0.5)

      0.12756799999999999
      0.56694900000000004
      0.55055600000000005
       1.0000000000000000

 

PRINT, cmap(1)
      0.26851000000000003
    0.0096050000000000007
      0.33542699999999998
       1.0000000000000000

 

즉 viridis라는 컬러테이블을 구성하는 색상들 중 첫번째(0), 중간(0.5), 마지막(1)에 해당되는 색상 각각에 대한 RGBA 성분값들이 위와 같이 출력됩니다. RGBA는 Red, Green, Blue 및 Alpha Channel 값인데, 어차피 Alpha Channel 값은 모두 1이고 실제로는 RGB 값들만 필요하다고 보면 됩니다. 그리고 이 성분값들을 보면 모두 0~1 범위를 갖습니다. 즉 색상의 위치 및 성분값들이 0~1 범위의 normalized 실수값으로 취급되고 있음을 유의할 필요가 있습니다. IDL에서는 이러한 값들이 항상 0~255 범위의 바이트형 값으로 취급되었던 것과는 좀 다릅니다. 따라서 파이썬의 컬러테이블을 IDL로 가져오려면, 파이썬의 컬러테이블을 구성하는 색상들 각각에 대한 RGB 값들(0~1 범위의 실수)을 가져오고 이들을 바이트형 값으로 치환하여 IDL에서 사용 가능한 색상 성분값 배열로 재구성하는 과정이 필요합니다. 이러한 처리 과정을 코딩하는 방식은 여러가지가 있겠지만 여기서는 다음과 같이 정의해보았습니다.

 

rgb = BYTARR(256, 3)
FOR j = 0, 255 DO BEGIN
  cv = cmap(j/255.)
  rgb[j, 0] = ROUND(cv[0]*255)
  rgb[j, 1] = ROUND(cv[1]*255)
  rgb[j, 2] = ROUND(cv[2]*255)
ENDFOR
HELP, rgb

 

이와 같은 과정을 거치면 viridis 컬러테이블을 구성하는 색상들에 대한 RGB 성분값들로 구성된 배열인 rgb를 획득할 수 있습니다. 여기서 rgb는 256x3의 구조를 갖는 2차원 바이트형 배열이 되며, 이후의 표출 과정에서는 이 rgb 배열을 컬러테이블 데이터로 투입하면 됩니다. 그러면 이제는 IDL로 이미지와 컬러바를 함께 표출하는 방식의 작업을 진행하면서 방금 가져온 viridis 컬러테이블을 사용해보기로 합시다. 먼저 예제로 사용할 2차원 데이터를 다음과 같이 정의합니다.

 

data = HANNING(600, 600)*100
add = FLTARR(600, 600)
add[300, 300] = HANNING(300, 300)*50
data = data+add

 

이와 같이 600x600의 구조를 갖는 실수형 배열이며 그 값 범위가 0~100인 data를 정의하였습니다. 그리고 이 데이터를 이미지의 형태로 표출하면서 컬러바도 함께 표시하는 과정을 다음과 같이 정의합니다.

 

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
i = IMAGE(data, RGB_TABLE=rgb, MARGIN=[0.08, 0.03, 0.08, 0.13], /CURRENT)
cb = COLORBAR(POSITION=[0.2, 0.92, 0.8, 0.95], FONT_SIZE=10, /BORDER)
tt = TEXT(0.5, 0.965, ctname, ALIGNMENT=0.5, FONT_SIZE=12, /NORMAL)

 

여기서는 앞서 파이썬의 viridis 컬러테이블의 색상 성분값들로 구성된 rgb 배열을 IDL의 IMAGE 함수의 RGB_TABLE 속성에 바로 투입한 것을 주목하면 됩니다. 이러한 과정에 의하여 표출된 그림을 보면 다음과 같습니다.

 

 

이와 같이 파이썬의 viridis 컬러테이블을 IDL로 가져와서 이미지의 표출 작업에 적용할 수 있습니다. 또한 이와 같은 요령으로 파이썬의 다른 컬러테이블들도 얼마든지 가져와서 사용할 수 있습니다. 이번에는 파이썬의 inferno라는 컬러테이블을 사용해봅시다. 그러려면 위의 내용에서 ctname을 정의한 부분만 다음과 같이 수정하면 됩니다.

 

ctname = 'inferno'

 

이러한 수정 사항을 반영하여 다시 얻은 그림은 다음과 같습니다.

 

 

동일한 방식으로 다른 컬러테이블 세가지(managua, twilight, plasma)만 더 보면 다음과 같습니다.

 

 

 

 

따라서 오늘 소개한 방법론을 사용하면 파이썬의 Matplotlib 라이브러리에서 지원되는 여러 컬러테이블들 중 마음에 드는 것을 IDL로 가져와서 사용할 수 있습니다. 이러한 방법은 앞서 언급하였듯이 IDL 9.2에서만 적용이 가능합니다. 하지만 만약 다음과 같이 컬러테이블 데이터를 .sav 파일로 저장해둔다면, 이 파일을 RESTORE 명령으로 불러오는 방식으로 다른 유저가 사용하거나 또는 다른 버전의 IDL에서 사용하는 것도 물론 가능할 것입니다.

 

SAVE, FILENAME='python_ct_viridis.sav', rgb

 

그리고 파이썬의 Matplotlib 라이브러리에서 지원되는 컬러테이블들의 목록 및 그 모습은 관련 링크에서 볼 수 있으므로 여기서 마음에 드는 것을 골라서 사용하면 됩니다.

 

 

* 이 글이 도움이 되었다면 게시물에 대하여 공감 버튼(하트 모양) 클릭 및 블로그 구독도 해주시면 더 큰 힘이 됩니다. 감사합니다.

LIST