IDL/Programming

REFORM과 CONGRID 함수의 원리 및 활용 [1]

이상우_idl 2015. 10. 28. 15:24
반응형

이번에는 IDL에서 배열을 처리하는데 있어서 사용되는 여러가지 내장함수들 중 REFORM과 CONGRID에 관한 얘기를 한번 해볼까 합니다. 각각의 함수에 대하여 개별 게시물로 2회에 걸쳐서 다뤄보도록 하겠습니다.


아마도 대개의 경우는 이 두 함수들 중 CONGRID라는 이름이 좀 더 친숙하게 다가올 것 같습니다. 왜냐하면 IDL 기본 교육이나 이미지 처리 교육 등에서 이 CONGRID라는 함수는 단골로 등장하기 때문입니다. 특히 이 함수는 이미지를 확대 또는 축소하는 작업에서 그 위력을발휘합니다.


하지만 이미지의 확대/축소는 CONGRID 함수가 할 수 있는 원래의 기능을 특수하게 사용한 예제라고 보면 됩니다. 원론적으로 파고들면, CONGRID 함수의 기능은 어떤 배열을 임의의 크기로 변형하는 역할입니다. 간단하게 1차원 배열에 대한 적용 예제를 보기로 합시다. 다음과 같이 1, 2, 3 단 세 개의 원소값들로 이루어진 1차원 배열에 대하여 CONGRID 함수를 적용하여 9개의 원소값들을 갖는 배열로 확장시킨 b를 얻고 그 값들을 출력해보았습니다. 참고로 CONGRID 함수는 이러한 작업을 할 때 샘플링 기법을 사용하는 것이 기본 설정입니다. 정확히 얘기하면 Nearest Neighbor Sampling입니다. 하여간 이 과정에 의하여 b를 얻으면 결과는 다음과 같습니다.


IDL> a = [1, 2, 3]

IDL> b = CONGRID(a, 9)

IDL> PRINT, b

       1       1       2       2       2       3       3       3       3


이 과정에서는 배열의 원소 갯수를 3개를 9개로 늘렸으므로, 변형된 배열 b에서는 일단 6개의 빈자리가 발생합니다. 이 빈 자리를 채우는 과정에서 어떤 기법을 쓰느냐가 관건이 됩니다. 물론 위의 결과는 샘플링 기법에 의하여 채워진 경우입니다. 즉, 가장 가까운 원본 데이터값을 가져오는 기법이기 때문에 이러한 결과가 나옵니다. 그런데 결과값들이 다소 이상하게 느껴질 가능성은 있습니다. 3개를 9개로 확대했으면 그 결과가 1, 1, 1, 2, 2, 2, 3, 3, 3으로 나와야 할 것 같은데 왜 1, 1, 2, 2, 2, 3, 3, 3, 3과 같은 방식으로 나오느냐에 대한 의문입니다. 그런데 이것은 사실 새로 확대된 9개의 자리들 중에 원본 데이터값들이 어느 자리로 일단 배치가 되느냐를 생각해야 하는데요. 이 원리에 대해서는 다음 그림을 참조하면 이해가 쉬우리라 생각됩니다.




즉, 새로운 9개의 자리를 원본의 갯수인 3개 기준으로 섹터를 나누면 각 섹터는 3개의 자리에 해당되는데, 여기서 각 섹터마다 맨 첫 자리에 원본값들을 배치한 후에 샘플링을 수행하기 때문입니다. 그렇다면 이러한 방식이 아닌 우리가 그냥 쉽게 떠올릴 수 있는 방식으로 처리된 결과를 얻는 방법은 없을까요? 당연히 있습니다. 바로 /CENTER라는 키워드를 추가적으로 사용하면 됩니다. 그러면 다음과 같은 결과를 얻게 됩니다.


IDL> b = CONGRID(a, 9, /CENTER)

IDL> PRINT, b

       1       1       1       2       2       2       3       3       3


그리고 이렇게 /CENTER 키워드를 사용했을 경우의 처리 과정에 대해서는 다음 그림을 통하여 도식적으로 이해하면 됩니다.




물론 1차원 뿐 아니라 2차원, 3차원 등의 경우에는 각 차원별로 유사한 방식으로 처리된다고 보면 됩니다. 사실 CONGRID 함수는 원본 배열의 크기와 결과 배열의 크기 사이에 특별한 제약이 없습니다. 예를 들어, 원본이 5개 짜리였는데 이것을 10개짜리로 만들던99개 짜리로 만들던 아무런 제약이 없습니다. 유사한 성격의 REBIN이라는 함수의 경우는 정수배로만 처리가 가능한데, 여기에 비하면 상당히 유연하다는 장점이 있습니다. 그런데 CONGRID 함수의 사용에 있어서 유념해야 할 제약사항은 바로 "차원(Dimension)은 바꿀 수 없다"는 점입니다. 즉, 원본이 3개 짜리 1차원인데 이것을 3X3의 2차원으로 만든다든지, 아니면 원본이 10X10 2차원인데 이것을 100개 짜리 1차원으로 만든다든지 하는 방식의 작업은 허용이 안됩니다(물론 1차원 배열을 그 이상의 차원으로 만드는 작업의 경우 이 자체는 오류를 발생하지는 않지만, 결과는 의도한 것과 전혀 다르다는 점을 유의해야 합니다).


그렇다면 차원(Dimension)까지 변형하는 것은 가능할까요? 당연히 가능합니다. 이러한 역할을 수행하는 함수가 바로 REFORM입니다. 이 REFORM이라는 함수도 활용 가치가 꽤 다양한데요. 이 함수에 대해서는 다음 회에 다루기로 하겠습니다.

반응형