2차원적인 데이터를 이미지(Image)의 형태로 표출하는데 있어서는 기본적으로 다양한 컬러테이블(Color Table)들을 적용하여 값이 높낮이를 반영하는 방식이 일반적입니다. 그런데 경우에 따라서는 특정한 화소(Pixel)들만을 강조하여 나타내는 것이 필요할 수 있습니다. 즉 어떤 조건을 내걸고 그 조건을 만족하는 화소들이 판별한 후 이미지 상에서 이러한 화소들만 특별히 강조하는 방식을 뜻합니다. 제가 얼마전에 올렸던 게시물에서 다음과 같은 그림을 제시했던 적이 있습니다.
이 그림은 2차원 데이터를 흑백 계열 색상의 컬러테이블로 표출해놓은 상태에서 특정한 화소들만 붉은색으로 강조하여 표출한 것입니다. 사실 이러한 표출을 위해서는 약간의 요령이 필요한데, 여기서는 NG 체계에서 두 종류의 이미지를 중첩하는 방식으로 구현하였습니다. 그러면 이 방법에 관하여 지금부터 살펴보도록 하겠습니다. 먼저 가상의 2차원 배열을 생성하고 이를 이미지로 표출하는 기본적인 과정은 다음과 같습니다.
data = HANNING(500, 500)*40+30+RANDOMU(-1, 500, 500)*8-4
win = WINDOW(DIMENSIONS=[600, 600], /NO_TOOLBAR)
i = IMAGE(data, MARGIN=0.1, /CURRENT)
여기서 생성된 2차원 배열 data의 값들은 대략 26~74 정도의 범위가 됩니다. 일단 표출된 그림을 보면 다음과 같습니다.
그 다음에는 일정한 조건을 걸고 이 조건에 부합하는 화소들만 선별한 다음 이러한 화소들을 붉은색으로 중첩하여 표출하는 과정으로 가보겠습니다. 그래서 다음과 같이 배열 값이 50-3부터 50+3까지의 범위에 속하는 화소들을 선별하기 위하여 WHERE 함수를 사용하였습니다.
diffs = ABS(data-50)
ww = WHERE(diffs LE 3, count, COMPLEMENT=wwn, /NULL)
PRINT, count
여기서 출력된 변수 count의 값은 20111로 나옵니다. 즉 주어진 조건에 부합하는 화소들의 갯수가 그만큼이라는 의미입니다. 이제 이렇게 선별된 화소들만 붉은색으로 표출해야 할텐데요. 여기서는 두가지 방법을 제시해보겠습니다. 먼저 첫번째 방법은 다음과 같습니다.
mask1 = MAKE_ARRAY(500, 500, VALUE=1.0)
mask1[wwn] = !values.f_nan
여기서는 먼저 원래 데이터 배열인 data와 구조가 동일한 mask1이라는 배열을 생성하면서 내부의 값들을 모두 1.0으로 통일하였습니다. 그 다음에는 앞서 WHERE 함수로부터 얻은 wwn이라는 배열이 등장하는데요. 즉 앞서 WHERE 함수에서는 data 배열의 값이 50-3~50+3의 범위에 속하는 화소들의 인덱스들을 ww로 얻고 그 조건에 부합되지 않는 화소들의 인덱스들을 wwn으로 얻었는데, 이 wwn을 여기서 활용한 것입니다. 즉 결과적으로 보면 원래 데이터 배열인 data에서 50-3~50+3의 범위에 속하는 화소들의 인덱스 위치들에 대해서는 mask1의 값이 1.0이 되고, 그 범위에 속하지 않는 화소들의 인덱스 위치에 대해서는 mask1의 값이 NaN이 되도록 한 것입니다. 이렇게 처리된 mask1을 다음과 같이 이미지의 형태로 중첩하면 됩니다.
ct = COLORTABLE(['red'])
io = IMAGE(mask1, RGB_TABLE=ct, /OVERPLOT)
이렇게 하면 조건에 부합되는 화소들은 붉은색으로 표시되고 조건에 맞지않는 화소들은 그 값이 NaN이므로 그냥 투명하게 처리됩니다. 다만 여기서 IMAGE 함수의 RGB_TABLE 속성에 부여된 컬러테이블이 COLORTABLE 함수로 별도로 정의된 ct임을 유의해야 합니다. 이 ct는 지금 이 작업에서만 사용할 용도로 따로 정의한 컬러테이블인데 그 색상 구성은 다음과 같습니다.
우리가 통상적으로 사용하는 컬러테이블과는 많이 다른 모습인데, 그냥 모든 색상들이 붉은색(Red)으로 통일되도록 의도적으로 정의된 것입니다. 즉 mask1을 중첩 표출하는데 있어서 이러한 컬러테이블을 사용하면 값이 1.0인 화소들은 붉은색으로 표시되고 NaN인 화소들은 투명하게 처리됩니다. 어차피 다른 색상은 전혀 필요없기 때문에 이와 같이 정의된 컬러테이블을 사용한 것입니다. 따라서 위와 같은 과정을 거치면 표출 결과는 다음과 같습니다.
이와 같이 특정한 조건을 기준으로 선별된 화소들만 붉은색으로 표시된 것을 확인할 수 있습니다. 그리고 지금까지 제시된 내용이 첫번째 방법이었다면 두번째 방법은 다음과 같습니다.
mask2 = MAKE_ARRAY(500, 500, VALUE=!values.f_nan)
mask2[ww] = 1
즉 앞서 정의했던 mask1 대신 이번에는 바로 위와 같이 정의된 mask2를 사용하는 것입니다. 이 내용을 잘 보면 mask1을 정의할 때와는 순서가 반대입니다. 즉 이번에는 data와 구조가 동일하면서 모든 화소값들이 NaN인 배열 mask2를 일단 정의하고, 그 다음에는 50-3~50+3의 범위에 속하는 화소들에 대해서만 그 값을 1로 대체하는 과정입니다. 그 다음 순서도 동일합니다. 다만 다음과 같이 mask1 대신 mask2를 투입하면 됩니다.
ct = COLORTABLE(['red'])
io = IMAGE(mask2, RGB_TABLE=ct, /OVERPLOT)
최종 표출 결과는 위의 그림과 동일하므로 생략합니다.
지금까지 NG 체계 기반의 두가지 방법을 제시하였는데, 물론 좀 더 생각해본다면 SCATTERPLOT 함수를 사용하는 방법(관련 게시물 참조)도 가능하고 그 외에도 여러가지 대안들이 있을 것입니다. 어쨌든 이러한 방법들을 잘 응용하면 다음과 같이 다수의 서로 다른 조건에 부합되는 화소들을 차별적으로 강조하여 중첩 표출하는 것도 충분히 가능할 것입니다.
'IDL > Image Processing' 카테고리의 다른 글
ERODE 함수 소개 (0) | 2024.07.25 |
---|---|
MORPH_GRADIENT 함수 소개 (0) | 2024.07.18 |
IDL 8.9의 Gabor Filter 기능 소개 (0) | 2023.07.04 |
HSV 및 HLS 체계 기반의 컬러테이블 생성 [2] (0) | 2023.04.04 |
HSV 및 HLS 체계 기반의 컬러테이블 생성 [1] (0) | 2023.03.29 |