[OpenCV] 이미지 회전 및 변환

9072 단어 pythonTILopencvTIL

우리가 사용하는 폰의 갤러리를 생각해보자. 이미지를 편집할 때 자르고, 회전시키는 등 다양한 작업을 할 수 있다. 이처럼 이미지 편집에 사용되는 기술을 어떻게 하면 되는지 알아보는 시간을 가질 예정이다.

이미지 회전

  1. 회전 중심 구하기(일반적으로 이미지의 중심)
  2. 2D 회전 행렬 만들기(getRotationMatrix2D()사용)
  3. 위에서 만든 회전 행렬을 사용하여 이미지에 아핀 변환 적용 시키기(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에 양수 값을 주면 이미지가 아래로 이동하고 음수 값은 위로 이동한다.

이미지 변환 단계

  1. 이미지를 읽고 너비와 높이를 구한다.
  2. 이미지 회전과 마찬가지로 2D 배열인 변환 행렬을 만든다. 이 행렬에는 x 및 y 축을 따라 이미지를 이동하는 데 필요한 정보가 포함된다.
  3. 이미지 회전에서와 같이 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)

결과


좋은 웹페이지 즐겨찾기