pillow의 transpose는 이미지를 선이나 점을 기준으로 뒤집을 때에도 쓰이고, 회전시킬 때에도 쓰입니다. 간단하게 실습해 보겠습니다.

 


 먼저 원본 이미지는 LEFT입니다. transpose 함수는 리터럴 0부터 6까지를 넘기게 됩니다. 이들 각각은 회전시키거나, 뒤집을 방법을 의미해요.

 

 left.jpeg를 엽니다. 다음에 img.transpose(0)을 한 다음에, save를 합니다. 그러면, 0번 방법으로 뒤집거나 회전시키게 됩니다. 0번 방법은 무엇일까요?

 

 기존 이미지에서 무엇이 바뀌었나요? 좌우 대칭이 되어 버렸습니다. FLIP_LEFT_RIGHT입니다. 기존 LEFT 그림에서 L 앞에 세로선을 기준으로 뒤집었다고 생각하시면 되겠습니다.

 

 다음 1번은 어떤가요? 상하가 뒤집혀 버렸습니다. LEFT 밑에 가로선을 기준으로 뒤집어 버린 것입니다. FILP_TOP_BOTTOM인 셈입니다.

 


 다음 2, 3, 4번은 이미지를 회전하는 것입니다.

 

 left_2입니다. 2번 방법입니다. 기존 이미지에서 윈도우 뷰어 프로그램을 이용해서 시계 방향으로 90도 3번 회전시켰습니다. 공식 문서에서는 ROTATE_90인데요. 원본 사진을 반시계 방향으로 90도 회전시킨 것을 의미합니다. 

 

 

 그러면 ROTATE_180은 무엇을 의미할까요? 원본 사진을 180도 회전시킨 것입니다. 고로 위 사진과 같이 됩니다.

 

 4번 방법은 원본 사진을 반시계 방향으로 270도 회전시킨 것입니다. 이 말은 시계 방향으로 90도 회전시킨 것과 같습니다.

 

 


 5번과 6번은 각각 TRANSPOSE와 TRANSVERSE입니다. 이 둘은 또 무엇인가? 먼저 TRANSPOSE는 (x, y)였던 것이 (y, x)로 변환이 일어나는 것입니다. (1, 2)와 (2, 1), 그리고 (-3, 2)와 (2, -3)은 y=x축 대칭입니다.

 

 

 간단하게 L자 그림을 그려 보겠습니다. y=x는 1번, 4번 영역을 지나가고 있어요. 따라서 2번 영역과 y=x 대칭인 것은 3번입니다. 따라서 L을 TRANSPOSE 시키면 ㄱ이 되게 됩니다.

 

 

 다음에, L...을 y=x축 대칭을 시켜 봅시다. 그러면 1행에 ㄱ, 2행에 . , ... 요런 패턴으로 나오게 됩니다. 대칭 축을 그리면 아래와 같습니다.

 

 

이해가 가실려나요?

 

 따라서 이런 그림이 나오게 됩니다. 그런데, 이것을 조금 더 쉽게 이해하는 방법이 있습니다.

 

 

 왼쪽 그림은 LEFT 그림을 좌우로 filp 한 것입니다. 오른쪽 그림은 좌우로 filp한 그림을 반시계 방향으로 90도 회전시킨 것입니다. 오른쪽 그림과 5번 모드가 정확하게 일치함을 볼 수 있어요.

 

 

 6번 모드는 TRANSVERSE 모드입니다. 이 모드는 아래 선을 기준으로 대칭이동 시킨 것입니다. 그러면 아래와 같이 나올 겁니다.

 

 

 이것도 직관적으로 이해하기 쉽지 않네요. 좌우로 filp한 이미지를 90도 시계 방향으로 돌려 보겠습니다.

 

 

 좌측이 좌우로 filp 된 것이고, 우측이 좌우로 filp 된 것을 90도 시계 방향으로 회전시킨 것입니다. 정확히 6번 모드와 똑같이 나옴을 볼 수 있습니다.

 

 

 mode와 filp, 대칭 관계를 정리하면 위와 같습니다. 여기서 5번은 TRANSPOSE를, 6번은 TRANSVERSE를 의미합니다.