IDL에서 컬러테이블을 사용하는데 있어서 유저가 직접 커스텀 컬러테이블을 정의하기 위하여 COLORTABLE 함수를 활용하는 방법 및 예제를 소개하는 게시물들을 이전에 2회에 걸쳐서 올린 바 있습니다(게시물 1, 게시물 2). 오늘은 계속 이어지는 내용으로서 특히 COLORTABLE 함수의 NCOLORS 키워드에 주목해보고자 합니다. 그래서 이 NCOLOR 키워드의 역할 및 활용 방법을 관련 예제와 함께 소개해보겠습니다.
IDL 도움말에서 COLORTABLE 함수에 관한 섹션에서 NCOLORS 키워드에 대한 설명을 보면 표시될 색상들의 갯수를 설정하는 역할을 하며 디폴트 값은 256이라고 기술되어 있습니다. 이것이 어떤 의미인지 예를 들어서 설명해보겠습니다. 다음과 같이 COLORTABLE 함수를 이용하여 34번 컬러테이블을 불러온다고 가정합니다.
ct = COLORTABLE(34)
이 컬러테이블의 모습은 다음과 같습니다. 34번 컬러테이블은 제가 이 블로그의 여러 게시물들에서 자주 활용했기 때문에 아마 익숙하실 겁니다.
그런데 이번에는 다음과 같이 NCOLORS 키워드를 추가로 사용하면서 34번 컬러테이블을 불러온다고 가정합니다. 여기서는 이 키워드의 값을 20으로 설정해봅시다.
ct = COLORTABLE(34, NCOLORS=20)
이렇게 불러온 컬러테이블의 모습은 실제로 다음과 같습니다.
위의 두 경우를 비교해보면 NCOLORS 키워드의 역할이 어떤 것인가를 짐작할 수 있습니다. 즉 특정 컬러테이블에 대하여 실제로 사용될 색상들의 갯수를 제한하는 역할인데, 다만 원래의 컬러테이블이 갖고 있던 색상들을 최대한 모두 반영하되 일정한 간격으로 샘플링하여 그 갯수만큼의 색상들만 선별한다고 보면 맞을 것 같습니다. 즉 위에서 NCOLORS=20이란 설정이 반영된 모습을 보면 34번 컬러테이블의 원래 색상들은 모두 반영이 되어있지만, 그 대신 256개 전부가 아니고 적절하게 설정된 일정한 간격으로 20개의 색상들만 선별된 것을 볼 수 있습니다. 따라서 이러한 컬러테이블에서는 유의미한 색상값은 0~19의 범위(갯수가 20개이므로)로 제한되고 나머지 즉 20~255 범위의 색상값들은 사실상 무용지물이 된다고 봐도 무방합니다. 일단 NCOLOR 키워드의 역할에 대해서는 이 정도면 충분히 설명이 된 것 같습니다.
그러면 이렇게 NCOLORS 키워드에 의하여 색상들의 갯수가 제한된 컬러테이블을 어떻게 활용할 것이냐의 문제로 넘어가봅시다. 이를 위하여 먼저 0~100의 범위를 갖는 실수형 값들로 구성되고 500x500의 구조를 갖는 2차원 배열을 다음과 같이 정의합니다.
data = HANNING(500, 500)*100
그리고 다음과 같이 NCOLORS 키워드를 사용하지 않고 그냥 COLORTABLE 함수만으로 불러온 34번 컬러테이블을 사용하여 이미지로 표출해봅시다. 그 과정 및 표출 결과는 다음과 같습니다.
ct = COLORTABLE(34)
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
i = IMAGE(data, RGB_TABLE=ct, MARGIN=0.1, /CURRENT)
cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.08])
그러면 이번에는 다음과 같이 COLORTABLE 함수를 사용하여 34번 컬러테이블을 불러오면서 NCOLORS 키워드의 값을 20으로 설정하여 정의된 컬러테이블을 사용하는 방식으로 변경해봅시다.
ct = COLORTABLE(34, NCOLORS=20)
다만 이러한 변경 사항만 반영하여 나머지 표출 과정을 그대로 다시 실행하면 뭔가 비정상적인 결과가 나올 것 같은 불길한 예감이 드는데, 실제로 그 모습은 다음과 같습니다.
역시나 걱정했던대로 별로 바람직하지 않은 표출 결과를 얻은 것 같습니다. 아무래도 컬러테이블의 가용한 색상 갯수를 제한해버린 상태에서 나머지 표출 과정은 그대로 유지했기 때문에, 이와 같은 결과가 나온 것은 뭐 당연한 일입니다. 그러면 제대로 된 표출 결과를 얻으려면 어떻게 해야할까요? 즉 제한된 갯수의 색상들이 이미지의 표출에도 정상적으로 반영되도록 하려면 어떤 방식으로 처리해야 할 것인가의 문제입니다. 여기서 필요한 것이 바로 BYTSCL 함수입니다. 일단 결론부터 보자면, 먼저 위의 과정에서 IMAGE 함수가 사용된 내용을 다음과 같이 수정하는 것이 필요합니다.
i = IMAGE(BYTSCL(data, TOP=19), RGB_TABLE=ct, MARGIN=0.1, /CURRENT)
여기서는 IMAGE 함수에 투입되는 데이터를 data 배열 그대로 사용하지 않고 위와 같이 BYTSCL 함수에 먼저 투입하면서 TOP 키워드를 사용하여 그 상한값이 19가 되도록 하였습니다. 이것은 앞서 컬러테이블을 정의할 때 NCOLORS 키워드에 20이란 값을 부여하여 가용한 색상 갯수를 20개로 제한했기 때문에, 이미지로 표출되는 배열의 화소값이 20종류 즉 0~19의 범위로 한정되도록 하기 위한 처리 과정이라고 보면 됩니다. 참고로 BYTSCL 함수 및 TOP 키워드의 역할에 관해서는 얼마전에 관련 게시물을 올린 바 있으므로 그 내용도 함께 참조하시면 됩니다. 어쨌든 위와 같은 변경사항을 반영하여 전체 과정을 다시 실행해보면 표출 결과는 다음과 같습니다.
일단 이 정도면 우리가 원했던 결과물을 얻은 것으로 보이긴 하는데요. 아직 한가지 과제가 더 남아있습니다. 바로 하단에 위치한 컬러바에서 눈금의 값들이 data 배열의 값 범위인 0~100으로 표시되지 않고 그냥 바이트 스케일인 0~255로 표시되어 있습니다. 이것은 COLORBAR 함수의 눈금 숫자 표시에 있어서 그냥 디폴트 방식으로 처리되었기 때문입니다. 따라서 COLORBAR 함수가 사용된 내용도 다음과 같이 수정하는 것이 좋습니다.
cb = COLORBAR(POSITION=[0.2, 0.04, 0.8, 0.08], RANGE=[0, 100])
이와 같이 RANGE 속성을 사용하여 컬러바 눈금값의 범위를 따로 설정해주면 됩니다. 이러한 변경사항이 반영된 표출 결과는 다음과 같습니다.
이와 같이 COLORTABLE 함수를 NCOLORS 키워드와 함께 사용하면 특정한 컬러테이블의 색상들의 구성을 원래에 가깝게 모두 사용하면서도 실제로 사용될 색상들의 갯수만 의도적으로 제한하는 방식으로 컬러테이블을 재구성하여 사용할 수 있다는 것을 잘 알아두시면 좋을 것 같습니다.
'IDL > Image Processing' 카테고리의 다른 글
COLORTABLE 함수를 이용한 컬러테이블의 생성 [2] (0) | 2024.09.03 |
---|---|
MORPH_OPEN 및 MORPH_CLOSE 함수 소개 (0) | 2024.08.08 |
DILATE 함수 소개 (0) | 2024.08.01 |
ERODE 함수 소개 (0) | 2024.07.25 |
MORPH_GRADIENT 함수 소개 (0) | 2024.07.18 |