IDL/배열 생성 및 처리

배열 처리 함수 소개 (SHIFT, REVERSE, ROTATE) [2]

이상우_idl 2022. 4. 6. 12:08
728x90
반응형

IDL에서는 배열에 대한 각종 처리 작업을 지원하는 여러 종류의 기능 함수들이 있는데 그 중에서 SHIFT, REVERSE, ROTATE 함수들에 대하여 각각 관련 예제와 함께 소개해보고자 합니다. 지난 회차에서는 SHIFT 및 REVERSE 함수에 관하여 알아보았고 오늘은 ROTATE 함수에 관하여 알아보도록 하겠습니다.

 

< ROTATE 함수 >

 

ROTATE 함수 대상 배열을 회전(rotate) 또는 전치(transpose)시키는 역할을 합니다. 적용 대상 배열의 차원은 1차원 또는 2차원만 가능합니다. 그리고 회전에 있어서는 90도 단위의 회전만 가능합니다. 90도로 제한되지 않는 임의의 각도로 회전하는 기능은 지원되지 않으며, 만약 이러한 처리가 필요할 경우에는 제가 얼마전에 소개했던 ROT 함수(관련 게시물 참조)를 사용하면 됩니다. ROTATE 함수는 그 특성상 2차원 배열에 적용하는 경우가 대부분입니다. 2차원 배열에 대한 예제를 보기 위하여 지난 회차에서 사용했던 JPG 파일을 똑같이 사용해보겠습니다. 똑같은 파일이지만 여기서도 다시 첨부합니다.

 

landscape.jpg
0.64MB

 

그리고 먼저 원본 이미지를 2차원 배열로 읽고 표출하는 과정 및 결과는 다음과 같습니다.

 

READ_JPEG, 'landscape.jpg', img, /GRAY
sz = SIZE(img, /DIM)

win0 = WINDOW(DIMENSIONS=[sz[0], sz[1]], /NO_TOOLBAR)
i0 = IMAGE(img, MARGIN=0, /CURRENT)

 

 

이제 배열 img에 대하여 ROTATE 함수를 적용해봅시다.

 

img_f = ROTATE(img, 1)

 

ROTATE 함수를 사용할 때에는 이와 같이 대상 배열 및 방향 인덱스를 함께 사용해야 합니다. 여기서는 방향 인덱스의 값을 1로 설정하였는데, 이 경우에는 대상 배열을 반시계 방향으로 90도 회전시키게 됩니다. 따라서 원본 배열인 img는 806x605의 형태이므로 결과 배열인 img_f는 605x806의 형태를 갖게 됩니다. 결과 배열인 img_f에 대하여 크기에 맞는 그래픽창을 띄우고 표출해봅시다.

 

sz_f = SIZE(img_f, /DIM)
win1 = WINDOW(DIMENSIONS=[sz_f[0], sz_f[1]], /NO_TOOLBAR)
i1 = IMAGE(img_f, MARGIN=0, /CURRENT)

 

표출된 모습은 다음 그림과 같습니다. ROTATE 함수에 의하여 반시계 방향 90도 회전이 적용되었음을 알 수 있습니다.

 

 

ROTATE 함수에서 사용 가능한 방향 인덱스들은 0부터 7까지 총 8종입니다. 다만 0인 경우에는 아무런 변화도 주지 않기 때문에 실질적으로는 1부터 7까지 총 7종이라고 봐도 무방합니다. IDL 도움말에서 ROTATE 함수에 관한 섹션을 찾아보면 각 인덱스별 처리 방식에 대해서 자세히 소개되어 있습니다. 세부 내용은 다음과 같습니다.

 

 

만약 인덱스가 2이면 반시계 방향 180도 회전이 됩니다. 앞선 예제 코드에서 숫자만 2로 바꿔서 처리한 결과는 다음 그림과 같습니다.

 

 

그리고 인덱스가 4이면 전치(Transpose) 처리가 됩니다. 즉 X와 Y가 서로 뒤바뀌는 대각선 방향의 대칭이 됩니다. 이 경우의 결과는 다음 그림과 같습니다.

 

 

인덱스가 5이면 전치 후 반시계 방향 90도 회전이 됩니다. 그 결과는 다음 그림과 같습니다.

 

 

실제로 위의 인덱스 테이블을 보면 0~3인 경우는 그냥 회전에 해당되고 4~7인 경우는 전치 후 회전에 해당됩니다. 이러한 특성을 잘 감안하여 사용하시면 됩니다. 그리고 서두에서 언급했듯이 ROTATE 함수는 2차원 뿐 아니라 1차원 배열에 대해서도 적용이 가능합니다. IDL의 커맨드 입력창에서 간단한 예제를 테스트해본다면 다음과 같습니다.

 

IDL> a = [1, 2, 3, 4, 5]
IDL> a_f = ROTATE(a, 1)

IDL> HELP, a_f
A_F             INT       = Array[1, 5]

IDL> PRINT, a_f
       1
       2
       3
       4
       5

 

이와 같이 5개의 값들로 구성된 1차원 배열 a를 반시계 방향으로 90도 회전시킨 결과 배열 a_f는 1x5의 형태를 갖게 됩니다. 만약 인덱스를 2로 설정하여 180도 회전시킬 경우에는 그 결과는 다음과 같습니다.

 

IDL> a_f = ROTATE(a, 2)
IDL> HELP, a_f
A_F             INT       = Array[5]
IDL> PRINT, a_f
       5       4       3       2       1

 

이 결과는 마치 이전 게시물에서 소개했던 REVERSE 함수를 사용한 경우와 같습니다. 다음과 같이 REVERSE 함수를 사용해보면 바로 확인이 됩니다.

 

a_f = REVERSE(a)
IDL> HELP, a_f
A_F             INT       = Array[5]
IDL> PRINT, a_f
       5       4       3       2       1

 

이와 같이 ROTATE 함수는 2차원 또는 1차원 배열에 대하여 회전 및 전치를 여러가지 방식으로 적용하는 역할을 한다는 것을 염두에 두고 사용하시면 여러모로 활용도가 높을 것입니다.

반응형