[OpenCV] 이미지 회전 및 변환
우리가 사용하는 폰의 갤러리를 생각해보자. 이미지를 편집할 때 자르고, 회전시키는 등 다양한 작업을 할 수 있다. 이처럼 이미지 편집에 사용되는 기술을 어떻게 하면 되는지 알아보는 시간을 가질 예정이다.
이미지 회전
- 회전 중심 구하기(일반적으로 이미지의 중심)
- 2D 회전 행렬 만들기(getRotationMatrix2D()사용)
- 위에서 만든 회전 행렬을 사용하여 이미지에 아핀 변환 적용 시키기(warpAffine() 사용)
2D 회전 횡렬 만들기 - getRotationMatrix2D
getRotationMatrix2D(center, angle, scale)
- center : 이미지의 회전 중심
- angle : 회전 각도. 양수이면 시계 반대 방향으로 회전하고 음수이면 시계 방향으로 회전
- scale : 적어준 값에 따라 이미지를 확대 또는 축소
아핀 변환 적용하기 - warpAffine()
이미지에 아핀 변환을 적용한다. 아핀 변환을 적용한 후 원본 이미지의 모든 평행선은 출력 이미지에서도 평행하게 유지된다.
warpAffine(src, M, dsize, dst, flags, borderMode, borderValue)
- src : 입력 이미지
- M : 변환 행렬(실수형)
- dsize : 출력 이미지의 크기. (w, h)튜플
- dst : 출력 이미지
- flags : INTER_LINEAR 또는 INTER_NEAREST와 같은 보간 방법. 기본 값 INTER_LINEAR.
- borderMode : 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
- borderValue : cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0(검정색)
코드
# 이미지 읽기
import cv2
image = cv2.imread('image.jpg')
# 회전점 계산하기
height, width = image.shape[:2]
center = (width/2, height/2)
# 회전 횡렬 계산하기
rotate_matrix = cv2.getRotationMatrix2D(center=center, angle=45, scale=1)
# 회전 횡렬 적용시키기
rotated_image = cv2.warpAffine(src=image, M=rotate_matrix, dsize=(width, height))
# 회전 시킨 이미지 표시
cv2.imshow('Original image', image)
cv2.imshow('Rotated image', rotated_image)
cv2.waitKey(0)
cv2.imwrite('rotated_image.jpg', rotated_image)
결과
이미지 변환
컴퓨터 비전에서, 이미지의 변환은 x축과 y축을 따라 지정된 픽셀 수만큼 이미지를 이동시키는 것이다. 이미지를 이동해야 하는 픽셀을 tx와 ty로 둔 상태에서 변환 행렬 M을 정의할 수 있다.
tx이제 및 ty값 으로 이미지를 이동할 때 알아야 할 사항이 있다.
- tx에 양수 값을 주면 이미지가 오른쪽으로 이동하고 음수 값을 주면 왼쪽으로 이동한다.
- ty에 양수 값을 주면 이미지가 아래로 이동하고 음수 값은 위로 이동한다.
이미지 변환 단계
- 이미지를 읽고 너비와 높이를 구한다.
- 이미지 회전과 마찬가지로 2D 배열인 변환 행렬을 만든다. 이 행렬에는 x 및 y 축을 따라 이미지를 이동하는 데 필요한 정보가 포함된다.
- 이미지 회전에서와 같이 warpAffine()함수를 아핀 변환을 적용한다.
이미지 읽고 너비와 높이 구하기
import cv2
import numpy as np
image = cv2.imread('image.jpg')
height, width = image.shape[:2]
변환 행렬 구하기
tx, ty = width / 4, height / 4
translation_matrix = np.array([
[1, 0, tx],
[0, 1, ty]
], dtype=np.float32)
이미지에 평행 이동 행렬을 적용하기
translated_image = cv2.warpAffine(src=image, M=translation_matrix, dsize=(width, height))
이미지 표시하기
cv2.imshow('Translated image', translated_image)
cv2.imshow('Original image', image)
cv2.waitKey(0)
cv2.imwrite('translated_image.jpg', translated_image)
결과
Author And Source
이 문제에 관하여([OpenCV] 이미지 회전 및 변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@rlath/OpenCV-이미지-회전-및-변환저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)