IDL/Image Processing

컬러테이블을 직접 만들어봅시다

이상우_idl 2014. 8. 11. 15:12
728x90
반응형

컬러테이블(Color Table)이라는 것은 IDL 유저들이라면 다들 잘 아시듯이 256개의 색상들로 구성된 일종의 색상표입니다. 0~255의 범위를 갖는 각각의 정수값별로 약속된 256개의 색상들로 구성되어 있습니다. 물론 컬러테이블은 여러 종류가 있으며 각 테이블별로 색상들의 구성은 각각 다릅니다. IDL에서는 총 75종(0~74)의 컬러테이블들이 지원되며(예전 버전에서는 41종), 각 컬러테이블의 색상 구성은 XLOADCT라는 명령을 실행하여 확인이 가능합니다.


그런데 작업을 하다보면, 이와 같이 IDL에 내장된 75종의 컬러테이블외에 별도의 컬러테이블을 필요로 하는 경우가 간혹 있습니다. 이런 경우에는 유저가 컬러테이블을 직접 만들어야 하는데, 물론 IDL에서는 이러한 작업도 얼마든지 가능합니다. 다만 컬러테이블을 직접만들기 위해서는 컬러의 RGB 구성에 관한 이해, 그리고 IDL에서 배열 및 컬러테이블을 다루는 방식에 대한 기본지식 등이 어느 정도 필요한 것은 사실입니다(이러한 내용은 제가 Image Processing in IDL과 같은 교육을 할 때에 다루는 내용들 중 하나이기도 합니다). 그래서 이와 같이 사용자 정의 컬러테이블을 만드는 방법에 관하여 제가 예전에 이 블로그에 올렸던 게시물이 하나 있습니다(링크). 여기서는 불연속적인 색상 구성을 갖는 컬러테이블을 직접 만드는 방법 및 관련 루틴들을 소개하고 있습니다.


그런데 색상이 불연속적이지 않고 부드럽게(gradation이 들어간) 변화하는 컬러테이블을 직접 만들고자 하는 경우도 있을 수 있습니다. 사실 이것은 깊게 들어간다면 꽤 복잡해질 수도 있는 내용이라, 이렇게 블로그 게시물로 간략하게 다루기가 쉽지만은 않을 수도 있는데요. 가급적이면 간략하게(잘 될지는 모르겠습니다) 핵심만 한번 소개해보기로 하겠습니다. 마침 또 얼마전에 방명록에 이러한 질문이 올라온 것도 있고 해서 이 내용을 중심으로 해서 한번 다뤄보기로 하였습니다. 일단 목표를 먼저 언급해본다면, 다음 그림과 같은 색상 패턴을 갖는 컬러테이블을 직접 만들어보고자 합니다. 즉, 파란색(Blue)으로 시작을 해서 중간에서 흰색(White)이 되고 그 이후에는 빨간색(Red)으로 변화하는 모습을 보이도록 하고 싶습니다.



우리가 컬러테이블을 만드는데 있어서 기본적으로 알아야 하는 사실은, 컬러테이블을 구성하는 총 256개의 값들(0~255) 각각에 대하여 대응될 색상에 대한 Red, Green, Blue값을 알고 있어야 한다는 것입니다. 결국 256개의 Red값, 256개의 Green값, 256개의 Blue값들이 필요하다는 얘기가 됩니다. 이것은 색의 3원색인 Red, Green, Blue 각각의 강도가 얼마냐에 따라 이들을 합성한 색상이 천차만별로 나온다는 색의 원리에 근거한 내용입니다(단지 IDL에만 국한되는 내용이기 때문에 알아두시면 상식적으로도 분명 도움이 많이 됩니다). 먼저 첫번째 색상은 파란색인데 이 색의 RGB값은 [0, 0, 255]입니다. 가운데에위치한 흰색의 RGB값은 [255, 255, 255]이고 끝에 위치한 빨간색의 RGB값은 [255, 0, 0]입니다. 그리고 색상값(Color Index)으로 보면 첫번째 색상인 파란색은 0, 가운데의 흰색은 127, 끝의 빨간색은 255에 해당되는 것으로 생각하면 됩니다. 이것을 Red, Green, Blue 각 채널별로 떼어놓고 생각해보면 다음과 같은 패턴을 보여야 한다는 얘기가 됩니다.


Red 채널값 : 0 ~~ 255 ~~ 255

Green 채널값 : 0 ~~ 255 ~~ 0

Blue 채널값 : 255 ~~ 255 ~~ 0


그러면 각 채널별 값에 해당되는 배열을 만들어줘야 합니다. 그래서 Red, Green, Blue 채널별로 rc, gc, bc라는 이름의 바이트형 배열을 다음과 같이 선언합니다.


rc = BYTARR(256)

gc = BYTARR(256)

bc = BYTARR(256)


그리고 앞서 언급했던 변화패턴을 보이도록 하기 위하여 다음과 같은 배열값 설정을 해보았습니다. 단, 여기서는 예를 들어 0~255와 같이 값이 변하는 경우 변화양상은 선형(Linear)이 되도록 하였습니다. 물론 변화양상이 선형이어야만 하는 것은 아닙니다. 곡선형이 될 수도 있습니다. 하지만 이런 경우는 여기서 다루기가 너무 복잡해지기 때문에 그냥 단순하게 선형 변화로 가정합니다.


rc[0:127] = BINDGEN(128)*2

rc[127] = 255b

gc[0:127] = BINDGEN(128)*2

gc[127] = 255b

bc[0:127] = 255b

rc[128:255] = 255b

gc[128:255] = 254b-BINDGEN(128)*2

bc[128:255] = 254b-BINDGEN(128)*2


이와 같은 방식으로 rc, gc, bc 배열들이 구성되면, 이 색상들로 이루어진 컬러테이블을 TVLCT라는 명령을 사용하여 적용할 수 있습니다. 그리고 DG체계에서 컬러테이블을 제대로 사용하려면, 그 유명한 DEVICE, DECOMPOSED=0 명령이 사용되어야 한다는 것은 당연한 사실입니다.


DEVICE, DECOMPOSED=0

TVLCT, rc, gc, bc


여기까지 되었다면, 우리가 원하는 컬러테이블이 현재 적용되어 있는 상태이고 이제 실제 데이터를 바이트 스케일링해서 표출하기만 하면 됩니다. 다음과 같이 0~255의 값들로 구성된 가상의 2차원 데이터 배열을 만들고 표출을 직접 해보면, 다음 그림과 같은 결과를 얻을 수 있습니다. 우리가 만든 컬러테이블이 적용된 상태임을 한눈에 알 수 있습니다.


data = HANNING(400, 400)*255

WINDOW, 0, XS=400, YS=400, RETAIN=2

TVSCL, data



어떻습니까? 물론 중간에 rc, gc, bc 배열값들을 조정하는 과정이 좀 복잡해보일 수도 있지만, 어차피 색상의 부드러운 변화 패턴을 넣기 위해서는 어떤 형태로든 필요한 부분입니다. 그리고 위의 그림은 보기에 따라서는 흰색과 주변색들 사이의 변화가 다소 급격하다는 느낌을 받을 수도 있는데요. 이것은 선형 변화패턴의 특성일 수도 있습니다. 좀 더 부드럽게 하고자 한다면 곡선형 변화패턴을 주는 것이 더 나을 수도 있기는 합니다만, 이 경우 선형이 아닌 더 차수가 높은 함수 형태의 변화 패턴을 넣어야 하기 때문에 중간과정이 좀 더 복잡해질 수도 있습니다. 물론 이렇게 선형 이외의 패턴이 들어갈 경우에는 구성 색상들도 다른 방식으로 변화하기 때문에 눈으로 보이는 결과도 다를 수 밖에 없습니다. 그리고 이렇게까지 가게 되면, 거의 컬러리스트(Colorist)들의 작업 영역에 들어간다고 볼 수도 있습니다. 이런 부분까지는 여기서 다루지는 않겠습니다.


위의 표출 예제는 DG 체계에서의 경우이고, 물론 NG 체계에서도 이와 같이 직접 만든 컬러테이블의 사용이 얼마든지 가능합니다. NG 체계에서의 예제 코드 및 표출 결과는 다음과 같습니다. DG와의 차이는, 컬러테이블의 적용이 TVLCT로 이루어지는 것이 아니라 그래픽 함수내의 RGB_TABLE이라는 속성이 사용된다는 점입니다. 이 속성에 부여되는 RGB 배열이 256X3 또는 3X256의 형태가 되어야 한다는 점만 유의하면 됩니다.


win = WINDOW(DIMENSIONS=[600, 540])

rgb = [[rc], [gc], [bc]]

im = IMAGE(data, RGB_TABLE=rgb, /CURRENT)

cb = COLORBAR()





반응형