2차원 영상을 표출하다보면 컬러테이블을 사용하는데 있어서 색상이 불연속적으로 분포하는 컬러테이블을 사용하고 싶은 경우가 종종 있습니다. 원래 IDL에서 지원하는 컬러테이블들은 거의 모두 연속적인 색상분포를 합니다. 그런데 예를 들면, 내가 갖고 있는 2차원 자료의 범위가 1.0~3.0까지인데, 1.0~1.5는 회색, 1.5~2.0은 파란색, 2.0~2.5는 초록색, 2.5~3.0은 노란색과 같은, 구간이 딱딱 나눠지는 색상분포를 하도록 표출하고자 할 경우를 얘기하는 것입니다.
사실 IDL에서는 이와 같은 컬러테이블을 구성할 수 있는 루틴이 기본적으로 제공되지는 않습니다. 물론 IDL의 컬러체계를 이해한다면 당연히 프로그래밍에 의하여 만들 수는 있습니다. 그래서 이러한 프로그래밍 방법을 기술하는 내용을 적어볼까 하다가 그냥 아예 루틴으로 만들어봤습니다. 지금 이 글의 첨부파일로 있는 LOAD_DISCRETE_CTABLE이라는 루틴입니다. 기본적인 사용법은 이 코드의 앞부분에 적어놓았으므로 간단한 예제만 들어보겠습니다. 앞서 언급했던 경우를 실제로 구현해보기로 하겠습니다.
먼저 다음과 같이 HANNING 함수를 사용하여 가상의 2차원 자료를 만들었습니다. 최소 및 최대값이 1.0 및 3.0인 경우입니다.
data = HANNING(300, 300)*2 + 1
data_range = [MIN(data), MAX(data)]
PRINT, data_range
levels = [1.5, 2.0, 2.5]
rgb = [[100, 100, 100], [255, 0, 0], [0, 255, 0], [0, 0, 255]]
여기서는 2차원 자료의 최소 및 최대값을 data_range라는 이름의 변수에 함께 넣었습니다. 그리고 이 범위안에서 색상이 나눠지는 구간경계값들인 1.5, 2.0, 2.5를 levels라는 변수에 넣었습니다. 이 때 최소 및 최대값은 이 levels에 포함하지 마세요. 그리고 각 색상구간별로 각각의 색상에 해당되는 RGB값들로 구성된 3Xn의 크기를 갖는 rgb라는 배열을 생성합니다. 구간경계값이 3개니까 구간의 갯수는 4개가 되므로, 여기서 rgb는 3X4의 크기를 갖습니다. 각 구간별 색상 역시 앞서 예에서 가정했던 회색([100, 100, 100]), 파란색([0, 0, 255]), 초록색([0, 255, 0]), 노란색([255, 255, 0])입니다.
먼저 기존 컬러테이블과의 비교를 위하여 다음과 같이 가로로 긴 윈도우를 하나 만들고, 왼편에 3번 컬러테이블이 적용된 영상을 먼저 TVSCL로 표출하였습니다. 그리고 앞서 설정했던 data_range, levels, rgb와 같은 정보들이 LOAD_DISCRETE_CTABLE 루틴을 사용하는데 있어서 사전에 필요한 정보들입니다. 이 정보들을 이 루틴의 입력인자로 하여 다음과 같이 사용합니다. 그러면 불연속 컬러테이블이 적용이 되고, 이 상태에서 역시 TVSCL로 영상을 표출했습니다.
DEVICE, DECOMPOSED = 0
WINDOW, XSIZE=300*2, YSIZE=300
LOADCT, 3
TVSCL, data, 0
LOAD_DISCRETE_CTABLE, data_range, levels, rgb
TVSCL, data, 1
LOADCT, 0
이와 같은 과정을 거친 결과는 다음 그림과 같습니다.구간별로 칼같이 나눠진 색상분포를 기반으로 영상이 표출된 것을 확인할 수 있습니다(참고로 이 내용도 예제코드로 이 글에 함께 첨부해놓았습니다). 따라서 LOAD_DISCRETE_CTABLE 루틴의 사용을 위하여 필요한 입력인자들만 상황에 맞게 설정해주면 됩니다.
test_discrete_colorbar_20111024.pro
다만 세번째 입력인자인 rgb의 경우, 색상의 수가 많아질 경우 선택이나 RGB값 구하는 것이 다소 번거로울 수 있습니다. 만약 IDL 8.0 이상의 버전을 사용중이라면 제가 얼마전에 이 블로그에서 올렸던 SHOW_COLORS_LIST라는 루틴을 사용하면 많은 도움이 될 것입니다. 참고로 LOAD_DISCRETE_CTABLE 루틴은 기존의 Direct Graphics 체계에서든 새로운 New Graphics에서든 모두 사용 가능합니다.
'IDL > Direct Graphics' 카테고리의 다른 글
DG 그래픽 체계에서 Z-buffer에 그림을 그리고 저장하는 방법 (0) | 2012.11.21 |
---|---|
플롯상의 각 점들을 서로 다른 색상으로 표출하는 방법 [2] (0) | 2012.07.27 |
극좌표계에서 벡터 표출하기 (0) | 2012.02.07 |
Mac OS X Lion에서 TVRD 사용시 에러 해결방법 (0) | 2011.11.21 |
PostScript에서 플롯과 이미지를 함께 표출하기 [1] (0) | 2011.11.07 |