OpenCV 강좌, Affine 변환 (이동, 회전, 축소 확대)

OpenCV(Open Source Computer Vision Library)는 이미지 처리 및 컴퓨터 비전 작업을 위한 강력한 라이브러리입니다. 이 강좌는 OpenCV를 사용하여 Afine 변환에 대해 자세히 설명하고, 이동, 회전 및 축소/확대와 같은 변환을 수행하는 방법을 다룰 것입니다. 본 문서에서는 파이썬을 기본 언어로 사용하지만, 필요한 경우 다른 언어에 대한 요약도 제공합니다.

Affine 변환이란?

Affine 변환은 이미지의 기하학적 구조를 변경하는 변환의 하나로, 선형 변환과 평행 이동을 함께 수행합니다. 이 변환은 2D 평면에서 점의 좌표를 변경하면서, 점 간의 상대적인 거리와 각도를 유지합니다. 따라서 Affine 변환 후에도.parallelism이 유지되며, 변환된 이미지의 형태나 구조가 왜곡되지 않습니다.

Affine 변환의 수학적 표현

Affine 변환은 다음과 같은 일반적인 형태의 수식으로 표현할 수 있습니다:

여기서:

  • (x', y')는 변환 후의 좌표입니다.
  • (x, y)는 변환 전의 좌표입니다.
  • M는 2x3 크기의 변환 행렬입니다.

Affine 변환 행렬 M = [ [a, b, tx], [c, d, ty] ]로 정의되며, 여기서 (tx, ty)는 각각 x축과 y축 방향의 이동값입니다. a, b, c, d는 회전 및 축소/확대 변환에 관련된 값입니다.

OpenCV에서 Affine 변환 수행하기

OpenCV를 사용하여 Affine 변환을 수행하는 방법은 여러 가지가 있습니다. 파이썬에서 OpenCV를 활용한 이동, 회전, 축소/확대 변환을 살펴보겠습니다.

1. 이동 변환 (Translation)

이동 변환은 이미지의 위치를 변경하는 것을 의미합니다. 이동 변환을 위해서는 변환 행렬에 이동 벡터를 추가해야 합니다.

python
import cv2
import numpy as np

# 이미지 불러오기
image = cv2.imread('example.jpg')

# 이동 변환 행렬 생성
tx = 100  # x축으로 100픽셀 이동
ty = 50   # y축으로 50픽셀 이동
M = np.float32([[1, 0, tx], [0, 1, ty]])

# 변환 적용
translated_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

# 결과 이미지 보여주기
cv2.imshow('Translated Image', translated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위 코드에서 사용된 warpAffine 함수는 변환 행렬 M과 이미지의 사이즈를 이용하여 이동 변환을 수행합니다. 변환된 이미지는 원래 이미지보다 오른쪽으로 100픽셀, 아래로 50픽셀 이동합니다.

2. 회전 변환 (Rotation)

회전 변환은 이미지를 중심을 기준으로 회전시키는 변환입니다. 원하는 각도만큼 이미지를 회전시키기 위해 회전 변환 행렬을 정의해야 합니다.

python
# 회전 변환 행렬 생성
angle = 45  # 45도 회전
center = (image.shape[1] / 2, image.shape[0] / 2)  # 회전 중심
M = cv2.getRotationMatrix2D(center, angle, 1.0)  # 스케일 1.0(비율 유지)

# 변환 적용
rotated_image = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

# 결과 이미지 보여주기
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위 코드에서 getRotationMatrix2D 함수는 회전 중심, 각도, 스케일 값을 이용하여 회전 변환 행렬을 생성합니다. warpAffine를 사용하여 변환을 적용합니다.

3. 축소/확대 변환 (Scaling)

축소/확대 변환은 이미지를 비율에 따라 크기를 조절하는 변환입니다. 축소/확대를 위해서는 변환 행렬에 스케일 값을 적용합니다.

python
# 축소/확대 변환 행렬 생성
scale_x = 0.5  # x축 방향으로 50% 축소
scale_y = 0.5  # y축 방향으로 50% 축소
M = np.float32([[scale_x, 0, 0], [0, scale_y, 0]])

# 변환 적용
scaled_image = cv2.warpAffine(image, M, (int(image.shape[1] * scale_x), int(image.shape[0] * scale_y)))

# 결과 이미지 보여주기
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

위 코드에서는 x축과 y축 방향으로 각각 50% 축소하는 스케일 변환 행렬을 생성하고, warpAffine를 사용하여 변환을 적용합니다.

Affine 변환의 실용 예제

실제로 Affine 변환은 다양한 이미지 처리 및 컴퓨터 비전 작업에서 활용됩니다. 다음은 몇 가지 실용적인 예제입니다.

1. 이미지 정렬

다양한 각도에서 촬영된 이미지를 보정하여 정렬하는 경우에 Affine 변환을 사용할 수 있습니다.

2. 이미지 왜곡 보정

카메라 렌즈에 의해 발생하는 왜곡을 보정하여 왜곡되지 않은 이미지를 만들기 위해 Affine 변환을 적용할 수 있습니다.

3. 이미지 합성

여러 장의 이미지를 조합하여 하나의 복합적인 이미지를 생성할 때 Affine 변환을 통해 이미지의 기하학적 속성을 조정할 수 있습니다.

OpenCV Affine 변환 요약

AFFINE 변환은 이미지 처리에서 매우 중요한 개념입니다. 이동, 회전 및 축소/확대 변환을 통해 이미지를 조정하고 변형할 수 있으며, OpenCV는 이러한 작업을 수행하는 데 필요한 기능을 제공합니다.

앞서 언급한 예제 코드들을 통해 OpenCV의 다양한 변환 기능을 실험해보면서 Affine 변환의 원리를 이해할 수 있습니다. 계속해서 OpenCV의 기본 기능을 익히고, 다양한 이미지 처리 기법을 활용해보세요!

책임 및 참고 자료

이 강좌에서 다룬 내용은 OpenCV의 공식 문서와 다양한 온라인 자료를 기반으로 하였습니다. 더 많은 정보를 원하신다면 OpenCV 공식 문서 및 관련 서적을 참고하시기 바랍니다.

참고 링크: