OpenCV 강좌, 이미지 자르기와 회전

OpenCV는 이미지 및 비디오 처리에 널리 사용되는 오픈 소스 컴퓨터 비전 라이브러리입니다. 이 강좌에서는 OpenCV를 사용하여 이미지 자르기 및 회전 작업을 수행하는 방법에 대해 설명하겠습니다. 예제는 주로 파이썬을 기반으로 작성되지만 다른 언어에서도 쉽게 변환할 수 있습니다.

1. OpenCV 설치

우선 OpenCV 라이브러리를 설치해야 합니다. 파이썬 환경에서 다음 명령어로 손쉽게 설치할 수 있습니다:

pip install opencv-python

2. 이미지 불러오기

이미지를 처리하기 위해 먼저 이미지를 불러와야 합니다. OpenCV에서는 cv2.imread() 함수를 사용하여 이미지를 불러올 수 있습니다.

import cv2

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

# 이미지 창에 표시
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.1 이미지 표시에 대한 설명

위 코드는 ‘sample.jpg’라는 이름의 이미지를 불러와 화면에 표시합니다. 사용자는 키를 누를 때까지 이미지 창이 열려 있습니다.

3. 이미지 자르기

이미지를 자르기 위해서는 이미지의 특정 부분을 선택해야 합니다. OpenCV에서는 배열 슬라이싱을 사용하여 이미지를 쉽게 자를 수 있습니다. 다음은 자르는 방법의 예제입니다:

# 이미지의 높이와 너비 가져오기
height, width, _ = image.shape

# 자를 영역 지정 (y1:y2, x1:x2)
# 예: (100:400, 150:450)
cropped_image = image[100:400, 150:450]

# 자른 이미지 표시
cv2.imshow('Cropped Image', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.1 자르기 작업에 대한 설명

위 코드에서는 이미지의 일부를 자르고 이를 화면에 표시합니다. 자를 영역을 지정하기 위해 슬라이싱 구문을 사용하여 image[y1:y2, x1:x2] 형식을 사용합니다. 이는 OpenCV에서 NumPy 배열로 이미지를 처리할 때 일반적으로 사용하는 방법입니다.

4. 이미지 회전

이미지를 회전하려면 cv2.getRotationMatrix2D()cv2.warpAffine() 함수를 사용해야 합니다. 먼저 회전할 각도와 중심점을 지정해야 합니다.

# 회전 각도 설정
angle = 45
center = (width // 2, height // 2)

# 회전 행렬 생성
rot_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

# 이미지 회전
rotated_image = cv2.warpAffine(image, rot_matrix, (width, height))

# 회전된 이미지 표시
cv2.imshow('Rotated Image', rotated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

4.1 회전 작업에 대한 설명

회전 행렬을 사용하여 이미지를 회전하며, 회전 각도는 degrees 단위로 지정합니다. 중심점은 회전할 이미지의 중심을 기준으로 합니다. cv2.warpAffine() 함수는 이미지를 지정된 회전 행렬에 따라 변형하여 회전된 이미지를 생성합니다.

5. 이미지 자르기 및 회전을 함께 사용하기

자르기와 회전 작업을 결합할 수도 있습니다. 아래의 예제는 먼저 이미지를 자르고, 이후에 자른 이미지를 회전하는 과정을 보여줍니다.

# 이미지 자르기
cropped_image = image[100:400, 150:450]

# 회전 각도 설정
angle = 30
center = (cropped_image.shape[1] // 2, cropped_image.shape[0] // 2)

# 회전 행렬 생성
rot_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)

# 자른 이미지 회전
rotated_cropped_image = cv2.warpAffine(cropped_image, rot_matrix, (cropped_image.shape[1], cropped_image.shape[0]))

# 결과 이미지 표시
cv2.imshow('Cropped and Rotated Image', rotated_cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5.1 자르기와 회전을 함께 사용하는 이유

이런 방식으로 자르기와 회전을 결합하면 복잡한 이미지 처리 작업을 보다 효율적으로 수행할 수 있습니다. 예를 들어, 특정 영역의 피쳐를 강조하거나 두 배율로 확대하여 관심 있는 객체를 더욱 잘 보이게 하는 등의 작업이 가능합니다.

6. 결론

이번 강좌에서는 OpenCV를 사용하여 이미지를 자르고 회전하는 방법을 배웠습니다. 이 과정에서 사용된 기본적인 함수들은 다양한 이미지 처리 작업에 적용할 수 있습니다. 추가적으로 여러분은 OpenCV의 다양한 기능을 탐험해 보시길 권장합니다.

6.1 앞으로의 학습 방향

OpenCV는 이미지 처리의 시작일 뿐입니다. 딥러닝, 실시간 이미지 처리 및 비디오 분석 등 보다 복잡한 응용 프로그램을 개발해보세요. OpenCV의 문서를 참고하면 더 많은 기능을 확인할 수 있습니다.

6.2 예제 코드 저장

작성한 예제 코드를 파일로 저장하고자 한다면, 아래와 같은 형태로 저장할 수 있습니다:

cv2.imwrite('output_cropped_rotated.jpg', rotated_cropped_image)

이 코드는 처리된 이미지를 ‘output_cropped_rotated.jpg’라는 이름으로 저장합니다.

참고 자료