IDL/Direct Graphics

DG 체계에서 NaN 값이 포함된 이미지의 표출

이상우_idl 2023. 8. 10. 17:06
728x90
반응형

2차원적인 이미지 데이터가 있을 때 IDL에서 이러한 데이터를 이미지의 형태로 표출하는 것은 그리 복잡한 일은 아닙니다. 그런데 이미지 데이터 내에 아무런 의미가 없는 값들이 존재하는 경우가 종종 있습니다. 통상적으로는 특정한 화소에 대하여 의미있는 데이터 값이 전혀 대응되지 못한 경우인데, 주로 이미지 데이터를 얻는 과정에 있어서 관측기기의 문제일 수도 있고 또는 관측에서 데이터로 전환되는 과정에서 뭔가 문제가 발생한 경우일 수도 있습니다. 어쨌든 이렇게 무의미한 값들이 2차원 데이터 내에서 NaN(Not a Number) 값의 형태로 존재하는 상태에서 이 데이터를 이미지의 형태로 표출하는 경우를 가정해보는 것입니다. 먼저 이러한 형태의 가상의 데이터를 다음과 같이 생성해보겠습니다.

 

data = HANNING(600, 600)*100-50
data[100:199, 400:499] = !values.f_nan

 

이와 같이 600x600의 구조를 갖는 2차원 배열의 형태로 존재하는 데이터가 있고, 정상적인 데이터 값의 범위는 -50~50이라고 가정합니다. 다만 이미지 데이터 내의 특정 영역에 NaN에 해당되는 무의미한 값들도 공존하는 경우가 됩니다. 만약 이러한 데이터를 이미지의 형태로 표출하게 된다면 어떤 모습으로 나타나는 것이 좋을까요? 특히 NaN에 해당되는 값들은 어떻게 표출되는 것이 바람직할까요? 생각을 해보면 이러한 무의미한 NaN 값들은 이미지 형태의 표출 결과에서도 아예 안보이게 처리되는 것이 좋지않을까 생각되긴 합니다. 일단 먼저 NG 체계에서 이러한 데이터를 이미지 형태로 표출해봅시다. 그 과정은 다음과 같습니다.

 

win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
i = IMAGE(data, RGB_TABLE=34, MARGIN=0, /CURRENT)

 

표출의 대상이 될 데이터 배열인 data는 600x600의 구조를 갖고 -50~50 범위의 실수값들로 구성되어 있습니다. 그리고 여기서는 IMAGE 함수에 의하여 이 배열에 대하여 바이트 스케일링 처리를 하고 34번 컬러테이블이 적용된 상태로 이미지의 형태로 표출이 됩니다. 여기서 잠깐 34번 컬러테이블의 색상 구성을 보면 다음과 같습니다.

 

 

이와 같이 보라색 계열로 시작하여 붉은색 계열로 끝나는 색상들로 구성되어 있습니다. 이제 IMAGE 함수에 의하여 이 컬러테이블이 적용되어 데이터가 표출된 결과를 봅시다.

 

 

앞서 잠깐 보았듯이 34번 컬러테이블 내에는 흰색(White)이 아예 존재하지 않습니다. 그런데 이 표출 결과를 보면 NaN 값인 화소들이 흰색으로 보입니다. 그 이유는 NG 체계의 이미지 표출에서는 NaN 값인 화소들에 대해서는 컬러테이블 내의 어떤 색상도 전혀 반영되지 않는다는 특성 때문입니다. 즉 NaN 값인 화소들은 사실상 비어있는 구멍처럼 취급된다고 봐도 됩니다. 그렇기 때문에 그냥 그래픽창 자체의 배경색인 흰색이 드러난 것입니다. 이와 같이 유의미한 데이터 값이 존재하지 않는 화소들이 이런 방식으로 표출되는 것은 나름 수긍할만한 처리 방식이라고 봅니다.

 

그런데 오늘은 이러한 이미지 데이터의 표출을 DG 체계에서 하는 경우를 생각해보고자 합니다. 일단 동일한 데이터를 DG 체계에서 표출해봅시다. 그 과정은 다음과 같습니다.

 

DEVICE, DECOMPOSED=0
WINDOW, XSIZE=600, YSIZE=600
LOADCT, 34
TVSCL, data

 

여기서도 2차원 데이터 배열인 data에 대하여 바이트 스케일링 처리를 거쳐 34번 컬러테이블이 적용되어 표출되도록 하였습니다. 바이트 스케일링을 거치게 되면 원래 데이터 값 범위인 -50~50은 컬러테이블 상의 0~255의 색상으로 대응됩니다. 표출된 결과는 다음과 같습니다.

 

 

그런데 이 그림을 잘 보면 뭔가 문제가 있다는 것을 쉽게 인지할 수 있습니다. 즉 DG 체계의 이미지 표출에서는 NaN 값인 화소들에도 컬러테이블 내의 특정한 색상이 반영되어 있다는 것이 쉽게 확인이 됩니다. 앞서 NG 체계에서의 표출에서는 NaN 값인 화소들이 아예 어떤 색상도 반영되지 않았던 것과는 대조적입니다. NaN 값인 화소에는 색상이 반영되지 않아야 할텐데 여기서는 그렇지 않다는 것은 그다지 바람직한 상황은 아닌 것 같습니다. 그런데 이렇게 표출되는 이유는 무엇일까요? 그 이유는 DG 체계에서는 NaN 값이 포함된 2차원 데이터를 TV 또는 TVSCL 명령을 사용하여 이미지로 표출할 경우 그 NaN 값을 이미지 내 최소 화소값과 동일한 것으로 간주하고 그 최소값에 해당되는 색상을 반영시키기 때문입니다. 이렇게 되면 유의미한 데이터 값이 존재하지 않는 화소임에도 불구하고 마치 데이터 값이 존재하는 것처럼 오인될 수 있다는 것이 가장 큰 문제입니다. 그렇다면 DG 체계에서는 이러한 문제를 어떻게 해결해야 할까요?

 

아마도 여러가지 아이디어들이 있을 수 있겠지만, 제 생각에는 컬러테이블에서 데이터 값 표출에 사용될 색상 범위와 NaN 값을 표시할 색상을 분리해서 적용하는 것이 가장 좋을 것 같습니다. 구체적인 예를 들자면, 컬러테이블의 0~254 범위의 색상들만 데이터 값에 대응시키고 NaN인 화소들은 따로 선별하여 255번 색상을 대응시키는 방법입니다. 이를 위해서는 먼저 데이터 배열에 대하여 바이트 스케일링을 다음과 같은 방식으로 적용해야 합니다.

 

data_scl = BYTSCL(data, MIN=-50, MAX=50, TOP=254)
HELP, data_scl
PRINT, MIN(data_scl), MAX(data_scl)

 

여기서는 원래 데이터 배열인 data에 대하여 BYTSCL 함수를 사용하여 바이트 스케일링 처리를 하여 그 결과를 data_scl이라는 배열로 얻었습니다. 두 배열은 구조는 똑같이 600x600입니다. 그리고 바이트 스케일링 처리를 하는 경우 그 결과 배열은 통상적으로 0~255의 범위를 갖는 것이 일반적이지만, 여기서 얻은 data_scl의 경우는 0~254의 범위를 갖게 됩니다. 즉 원본 데이터의 -50~50의 범위가 바이트 스케일링 처리가 되어 0~254의 범위를 갖게 된 것입니다. 255가 아니라 254가 된 이유는 BYTSCL 함수의 TOP 키워드의 값이 254로 설정되어 있기 때문입니다. 물론 이것은 향후의 처리를 위하여 일부러 0~254의 범위가 되도록 하기 위함입니다. 이제 다음 과정으로 갑니다.

 

ww = WHERE(FINITE(data) EQ 0, count)
IF count NE 0 THEN data_scl[ww] = 255

 

여기서는 원본 데이터 배열인 data 내에서 NaN 값인 화소들의 위치를 탐색하여 그 위치 정보를  ww로 얻은 다음, 앞서 얻었던 data_scl 배열 내에서 이 ww 위치에 해당되는 화소들에 대하여 값을 255로 대체한 것입니다. 이렇게 하면 data_scl 배열은 결국은 0~255 범위의 값을 갖습니다. 다만 data_scl 배열 내에서는 원본 데이터 상에서 유의미한 값들은 0~254의 범위로 대응되고 원본 데이터 상에서 NaN이었던 값들은 255가 되는 셈입니다. 이와 같이 유의미한 값들과 NaN 값들이 대응될 색상값을 아예 따로 분리해줍니다. 그리고 다음 단계에서는 컬러테이블에 대한 약간의 튜닝이 필요한데 그 과정은 다음과 같습니다.

 

LOADCT, 34
TVLCT, 255, 255, 255, 255

 

여기서는 일단 34번 컬러테이블을 불러옵니다. 참고로 DG 체계에서는 이와 같이 LOADCT 명령을 사용하여 컬러테이블을 불러올 수 있습니다. 그런데 이 컬러테이블을 그대로 사용하는 것이 아니고, 컬러테이블 내에서 256번째 색상(255에 대응되는 색상)의 RGB 값이 [255, 255, 255]가 되도록 즉 흰색(White)으로 대체한 것입니다. 이렇게 하는 이유는 TV 명령으로 data_scl을 표출할 때 0~254 범위의 값들은 원래 34번 컬러테이블의 색상들이 대응되도록 하고 255인 값은 별도로 지정한 흰색이 대응되도록 하기 위함입니다. 즉 결과적으로는 원본 데이터 상에서 NaN 값인 화소들만 따로 흰색으로 처리하기 위함이라고 보면 됩니다. 이제 다음과 같이 최종 표출 과정으로 갑니다.

 

TV, data_scl

 

표출 결과는 다음과 같습니다.

 

 

이와 같이 정상적인 값의 화소들에는 34번 컬러테이블의 색상들이 제대로 반영되어 있고 NaN 값인 화소들은 그냥 흰색으로 처리됩니다. 그러면 정상적인 값의 화소들과 NaN인 화소들 사이의 구분이 명확해집니다. 따라서 DG 체계에서 2차원 데이터를 이미지 형태로 표출할 때 NaN 값인 화소들을 별도로 구별하여 표출하려면 대략 이러한 방식으로 처리하는 것도 약간 복잡해 보일 수도 있지만 하나의 좋은 대안이 될 수 있습니다. 그 외에도 이러한 방식의 표출에 있어서 그림 내에 컬러바까지 함께 표시하고자 할 경우도 있을텐데요. 그 경우에는 DG 체계에서 컬러바를 표시하는 방법을 소개한 관련 게시물의 내용을 참조하여 처리하면 됩니다.

반응형