IDL/Image Processing

불연속적인 색상들로 구성된 컬러테이블의 생성 방법

이상우_idl 2017. 2. 28. 10:00
728x90
반응형

이 글의 제목을 보신 분들은 어쩌면 낯설지 않은 제목이라 느끼실지도 모르겠습니다. 그렇게 느끼시는 분이 계시다면 우선 감사의 말씀을 드리고 싶습니다. 그만큼 여길 자주 방문해주셨다는 얘기거든요. 하여간 유사한 주제를 제가 이 블로그에서 몇 번 다룬 적이 있었습니다. 특히 이 게시물에서는 전용 프로그램도 하나 만들어서 함께 첨부를 했었습니다. 그런데 당시 올렸던 내용은 사실 Direct Graphics 체계를 기준으로 한 내용이었다는 한계는 있었습니다. 그리고 사용 방법도 약간은 불편한 편이었던 것 같습니다.

 

그래서 그냥 이번 기회에 그래픽 체계 상관없이 DG, NG 체계에서 모두 사용 가능한 좀 더 사용이 편한(?) 프로그램을 하나 만들어 보았습니다. 프로그램의 이름은 CTABLE_DISCRETE라고 명명해 보았습니다. 이 게시물에 직접 첨부하였고 또 다운로드 가능한 외부 링크도 하나 더 추가해 놓았습니다.

 

ctable_discrete.pro
0.00MB

 

 

링크 누르기

 

그럼 이 프로그램의 사용 방법을 예제를 통하여 소개해 드리겠습니다. 여기서는 yellow, orange, red, blue 네 개의 색상들만으로 구성된 컬러테이블을 만드는 경우를 가정해 봅시다. 이 컬러테이블에는 단 네 개의 색상들만 존재해야 하며, 각 색상별 구간의 간격은 모두 동일하다고 가정하였습니다. 이러한 컬러테이블을 생성하기 위하여 CTABLE_DISCRETE를 사용하는 방법은 다음과 같습니다.

 

colors = ['yellow', 'orange', 'red', 'blue']

ctb = CTABLE_DISCRETE(colors, values)

 

이와 같이컬러테이블을 구성할 색상들로 구성된 배열을 인자로 주기만 하면 됩니다. 이 때 컬러들을 명시하는데 있어서는 이와 같이 IDL에서 인식 가능한 고유명 문자들도 가능하며, 또는 RGB 값들로 주는 것도 가능합니다. 즉, 위의 내용을 다음과 같이 적어도 됩니다.

 

colors = [[255, 255, 0], [255, 165, 0], [255, 0, 0], [0, 0, 255]]

ctb = CTABLE_DISCRETE(colors, values)

 

이렇게 하여 CTABLE_DISCRETE 함수가 되돌려준 컬러테이블 배열인 ctb는 256x3의 구조를 가지며, NG 또는 DG 체계에서 바로 사용이 가능합니다. NG 체계에서 이 컬러테이블을 다음과 같이 적용해 보았습니다. 여기서는 0~1의 범위를 갖는 값들로 구성된 400x400 크기의 data라는 배열을 생성한 후, 위에서 얻은 컬러테이블을 바로 적용하였습니다. 또한 해당 컬러테이블의 모습을 보여주는 컬러바도 구현해 보았습니다. 그 결과는 다음 그림과 같습니다.

 

data = HANNING(400, 400)

win = WINDOW(DIMENSIONS=[400, 500], /NO_TOOLBAR)

im = IMAGE(data, RGB_TABLE=ctb, POSITION=[0, 0.2, 1, 1], /CURRENT)

 

cbar = COLORBAR(TARGET=im, /BORDER)

 

 

 

이와 같이 단 몇 개의 색상들이 균등하게 배분되어 있는 불연속 컬러테이블을 생성하여 바로 적용이 가능합니다. 여기서는 0~1의 범위의 값들이 4개의 색상들로 구성되어 있으므로, 각 색상은 0~0.25, 0.25~0.5, 0.5~0.75, 0.75~1과 같이 길이가 균일한 값 구간에 차례로 대응됩니다. 그런데 색상들의 배분이 균등하지 않은 경우에는 어떻게 해야 할까요? 예를 들면, 네 개의 색상이 대응되어야 할 값 구간이 0~0.2, 0.2~0.5, 0.5~0.7, 0.7~1과 같이 서로 다른 경우입니다. 이러한 경우에 각 색상이 컬러테이블 상에서 점유하는 길이를 계산하는 것이 좀 귀찮을 수 밖에 없습니다. 그런데 CTABLE_DISCRETE에서는 그 부분을 내부적으로 다 해결해주도록 되어 있습니다. 사용자는 다음과 같이 데이터 구간 값들로 구성된 배열 추가 인자로 주면 됩니다.

 

colors = ['yellow', 'orange', 'red', 'blue']

values = [0, 0.2, 0.5, 0.7, 1]

 

ctb = CTABLE_DISCRETE(colors, values)

 

여기서 유의할 부분은, 데이터 구간값들을 배열로 줄 때 사이사이 마디값들 뿐 아니라 시작값과 끝값도 명시해야 한다는 것 뿐입니다. 이와 같이 ctb가 얻어지도록 수정한 후 다음의 내용을 실행하면 됩니다. 여기서 하단의 COLORBAR 함수에서 컬러바 상의 마디값들을 조정하기 위하여 values가 TICKVALUES 속성에 부여되었음을 주목하세요. 그 결과는 다음 그림과 같습니다.

 

data = HANNING(400, 400)

win = WINDOW(DIMENSIONS=[400, 500], /NO_TOOLBAR)

im = IMAGE(data, RGB_TABLE=ctb, POSITION=[0, 0.2, 1, 1], /CURRENT)

 

cbar = COLORBAR(TARGET=im, TICKVALUES=values, /BORDER)

 

 

 

이와 같은 방식으로 CTABLE_DISCRETE 함수를 활용하시면 됩니다. 그리고 DG 체계에서 사용하는 경우에는 다음과 같이 TVLCT 명령을 사용하여 컬러테이블을 로드한 다음 이후의 표출 과정을 진행하면 된다는 정도로만 언급해 둡니다.

 

TVLCT, ctb

 

아직 완벽해 보이지는 않지만 이 상태로 여러분께 한번 소개해 봅니다. 사용해 보시고 혹시 문제점이나 필요한 개선점들이 있다면 알려주시기 바랍니다.

반응형