IDL/Image Processing

POLAR_SURFACE 함수의 활용

이상우_idl 2015. 8. 6. 17:18
728x90
반응형

POLAR_SURFACE는 (R, theta, Z) 기반의 극좌표 데이터를 (X, Y, Z) 기반의 직교 좌표 데이터로 변환해주는 역할을 하는 IDL의 내장함수입니다. 극좌표 데이터는 말 그대로 반경(R)과 방위각(theta) 기반의 좌표를 갖는 격자점마다 데이터값(Z)이 존재하는 형태인데, 이 상태로는 IDL의 2, 3차원 표출 방식인 SURFACE, IMAGE 등에 그대로 인수로서 들어갈 수가 없습니다. 이러한 표출 방식들은 직교 좌표계 데이터만 지원하기 때문입니다. 따라서 손쉬운 표출이 가능하도록 좌표계를 변환해주는 역할을 하는 함수가 바로 오늘 소개할 POLAR_SURFACE라는 함수입니다. 사실 IDL에서 꽤 오래전부터 지원되어왔던 함수이지만 그 존재나 기능은 그리 널리 알려져 있는 편은 아닌 것 같아서 한번 소개를 해보려고 합니다.


설명을 위하여 우선 극좌표 기반의 가상 데이터를 다음과 같은 방식으로 만들어보았습니다. 방위각 방향으로는 0도에서 360도까지 5도 간격(총 72 스텝)이고, 반경 방향으로는 0~201에 걸쳐 201개의 격자들이 있는 데이터입니다. 물론 각 격자점마다 -1~1의 범위를 갖는 값이 다 존재하도록 생성되었습니다. 이렇게 생성된 z라는 배열은 201X72의 구조를 갖는 배열이 됩니다. 그리고 반경 및 방위각 방향의 격자점들 위치에 해당되는 r, theta 배열도 함께 있어야 합니다. 그리고 방위각인 theta의 경우 일단 각도(degree) 단위로 생성한 다음 !dtor을 곱하여 라디안(Radian)으로 바꿔줬는데, 이후 사용할 POLAR_SURFACE에서는 방위각의 값들이 이렇게 라디안 단위로 되어 있어야 하기 때문입니다.


r = FINDGEN(201) / 200.0

theta = FINDGEN(72)*5*!dtor

z = r^2 # COS(theta*3)

HELP, z


이 z라는 배열의 값들이 존재하는 격자점들은 원래는 다음과 같은 분포를 갖습니다. 첫번째 그림은 위에서 내려다 본 모습이고, 두번째 그림은 옆쪽에서 약간 기울어진 시선 방향에서 본 모습입니다. 물론 여기서는 격자점들의 분포만 보여주고 있을 뿐, 실제 데이터값의 변동 자체는 나타나있지 않습니다. (참고로 이 두 그림들은 PLOT3D라는 함수를 사용하여 표출한 모습인데, 세부 프로그램 내용은 생략합니다)



사실 위와 같은 그림으로 표출하면 된다고 생각할 수도 있는데, 방위각 간격이나 반경 반향 간격이 더 촘촘해서 격자점들이 더 많아지면 위와 같은 방식의 표출은 효율적이지 않습니다. 무엇보다도 표출에 시간이 많이 소요됩니다. 따라서 직교 좌표계로 변환한 후 적절한 표출 방식을 사용하는 것이 더 효율적입니다. 여기서 POLAR_SURFACE가 등장하는데요. 일단 다음과 같이 사용하여 직교 좌표로의 변환 결과인 ps를 얻었습니다.


ps = POLAR_SURFACE(z, r, theta, /GRID, SPACING=[0.002, 0.002], $

  MISSING=!values.f_nan)

HELP, ps


이렇게 얻어진 ps는 배열 구조를 확인해보면 1001X1001로 나옵니다. 그 이유는 SPACING이라는 키워드에 주어진 0.002라는 값때문인데요. -1~1의 범위 즉 2를 0.002로 나누면 1000이 나옵니다. 즉 직교 좌표계로 변환된 배열의 X, Y 방향별 격자수를 조절하기 위한 값이라고 보면 됩니다. 이 값이 커지면 격자수는 줄어들겠지요. 어느 정도 크기의 배열로서 결과를 얻을 것인지에 따라 적절히 조절하면 됩니다. 자 이제는 이 ps를 그냥 SURFACE 또는 IMAGE와 같은 방식으로 표출하기만 하면 됩니다. 먼저 다음과 같이 SURFACE함수를 사용하여 표출하면 그 모습은 다음 그림과 같습니다.


win = WINDOW(DIMENSIONS=[500, 500])

sf = SURFACE(ps, /CURRENT)



그리고 이번에는 다음과 같이 IMAGE 함수를 사용하여 표출하면 그 모습은 다음 그림과 같습니다.


win = WINDOW(DIMENSIONS=[500, 500])

im = IMAGE(ps, MARGIN=0, /CURRENT)



나름 그럴듯하게 결과가 나온 것 같습니다. 물론 격자 구조 자체가 변환된 결과를 표출한 것이기 때문에, 극좌표 기반의 원본 데이터에 있던 격자점들이 아닌 지점들에 대해서도 값이 존재하게 된 상태입니다. 이러한 계산은 POLAR_SURFACE 내부에서 선형내삽(Bilinear Interpolation)을 수행하여 얻은 결과입니다. 그리고 원본 데이터의 특성상 반경 외곽에는 원래 데이터값이 존재하지 않지만, 직교 좌표로 변형된 결과에서는 어떻게든 이런 부분에도 내삽값들이 생길 수 밖에 없는데요. 만약 이런 외곽 부분에는 유의미한 값이 아예 존재하지 않게 하려면 위에서와 같이 POLAR_SURFACE 함수내에서 MISSING이라는 키워드를 사용하면 됩니다. 여기서는 이렇게 의미없는 공간 격자에 대해서는 NaN(Not a Number)값을 부여하도록 한 경우입니다.


이와 같은 좌표계 변환 및 표출 방식은 극좌표 기반으로 산출되는 데이터에 대해서는 모두 적용이 가능합니다. 예를 들면, 레이더 관측 자료같은 경우에 이러한 표출 방법을 적용해볼만한 좋은 예제라고 볼 수 있습니다.


반응형