IDL/배열 생성 및 처리

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

이상우_idl 2022. 3. 25. 11:20
728x90
반응형

IDL에서는 배열에 대한 각종 처리 작업을 지원하는 여러 종류의 기능 함수들이 있는데 그 중에서 SHIFT, REVERSE, ROTATE 함수들에 대하여 각각 관련 예제와 함께 소개해보고자 합니다.

 

< SHIFT 함수 >

 

SHIFT 함수배열의 특정한 차원에 대하여 임의의 갯수만큼 이동(Shift)시키는 역할을 합니다. 적용 대상 배열의 차원에는 제한이 없습니다. 예를 들어 1차원 배열에 대하여 적용해본 예제는 다음과 같습니다.

 

a = [1, 2, 3, 4, 5]
a_f = SHIFT(a, 2)
PRINT, a_f
       4       5       1       2       3

 

여기서는 1차원 배열 a에 대하여 2만큼 이동을 시킨 결과 배열 a_f를 얻었습니다. 출력된 내용을 보면 우측으로 2만큼 이동시킨 결과임을 확인할 수 있습니다. 반대 방향으로 이동시키려면 (-)를 붙이면 됩니다. 즉 다음과 같습니다.

 

a_f = SHIFT(a, -2)
PRINT, a_f
       3       4       5       1       2

 

2차원 배열에 대해서도 당연히 적용이 가능합니다. 다음과 같이 JPG 파일의 데이터를 2차원 배열로 가져와서 예제로 사용해보겠습니다. 여기서 사용된 JPG 파일은 아래 링크를 통하여 받으시면 됩니다. 아니면 여러분이 직접 준비한 JPG 파일을 사용하셔도 됩니다.

 

landscape.jpg
0.64MB

 

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

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

 

이와 같이 READ_JPEG 명령을 사용하여 JPG 파일의 이미지 데이터를 img라는 2차원 배열로 가져오고, SIZE 함수를 사용하여 배열의 크기 정보를 추출한 다음, IMAGE 함수를 사용하여 원본 이미지를 표출합니다. 표출된 모습은 다음 그림과 같습니다.

 

 

이제 다음과 같이 SHIFT 함수를 사용하여 결과를 얻어봅시다. 여기서는 첫번째 차원인 가로 방향으로 200 그리고 두번째 차원인 세로 방향으로 100만큼 이동시킨 결과를 img_f라는 배열로 얻었습니다.

 

img_f = SHIFT(img, 200, 100)

 

이렇게 얻은 결과 배열 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)

 

그 모습은 다음 그림과 같습니다. SHIFT 함수에 의하여 각 차원별로 이동이 적용되었음을 알 수 있습니다.

 

 

< REVERSE 함수 >

 

REVERSE 함수배열의 특정한 차원에 대하여 값들의 순서를 뒤집는 역할을 합니다. 적용 대상 배열의 차원에는 제한이 없습니다. 예를 들어 1차원 배열에 대하여 적용해본 예제는 다음과 같습니다.

 

a = [1, 2, 3, 4, 5]
a_f = REVERSE(a)
PRINT, a_f
       5       4       3       2       1

 

다차원 배열에 대하여 적용하려면 순서를 뒤집는 대상이 될 차원에 해당되는 인덱스를 함께 명시해줘야 합니다. 다만 위와 같이 대상이 1차원 배열인 경우에는 굳이 인덱스를 사용하지 않아도 무방합니다. 어쨌든 우리가 위에서 JPG 파일을 읽어서 얻었던 2차원 배열인 img를 예로 들어봅시다. 이 배열에 대하여 다음과 같이 REVERSE 함수를 적용하면서 인덱스를 1로 명시해주면, 첫번째 차원인 가로 방향에 대하여 순서를 뒤집은 결과를 얻게 됩니다.

 

img_f = REVERSE(img, 1)

 

이렇게 얻은 결과 배열 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)

 

그 모습은 다음 그림과 같습니다. 가로 방향의 순서 즉 좌우가 뒤집어진 것을 확인할 수 있습니다.

 

 

만약 원본 배열에 대하여 세로 방향의 순서 즉 위아래를 뒤집고 싶다면 다음과 같이 인덱스를 2로 적어주면 됩니다.

 

img_f = REVERSE(img, 2)

 

이 결과의 모습은 다음 그림과 같습니다.

 

 

그런데 만약 가로 및 세로 방향 모두 즉 모든 차원들에 대하여 동시에 뒤집는 처리를 하고 싶다면 어떻게 해야 할까요? 사실 REVERSE 함수로는 그런 처리들을 한번에 다 하기는 불가능합니다. 즉 다음과 같이 다수의 인덱스들을 동시에 사용할 수는 없습니다.

 

img_f = REVERSE(img, 1, 2); 에러 발생!

 

이렇게 하면 에러가 발생합니다. 왜나하면 REVERSE 함수에서는 뒤집는 대상이 될 차원을 지정하는 인덱스를 오직 하나만 받을 수 있기 때문입니다. 따라서 다음과 같이 REVERSE 함수를 연이어 사용하는 것이 하나의 해결책이 될 수 있습니다.

 

img_f = REVERSE(img, 1)
img_f = REVERSE(img_f, 2)

 

이 결과의 모습은 다음 그림과 같습니다.

 

 

이제 다음 순서는 ROTATE 함수인데요. 이 내용은 다음 회차 게시물에서 이어서 소개하도록 하겠습니다.

반응형