본문으로 바로가기
728x90

확대/축소 변환

확대/축소는 resize 를 사용합니다.

 

cv2.resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)  ->  dst

  • src: 입력 이미지
  • dsize: 출력 이미지 사이즈
  • dst: 출력 이미지
  • fx: 가로 사이즈 배수
  • fy: 세로 사이즈 배수
  • interpolation: 보간법
import cv2
import os
import numpy as np

path = os.path.join('img', 'img.jpg')
img = cv2.imread(path)
print(img.shape)

dst = cv2.resize(img, None, fx=0.5, fy=0.5)
dst2 = cv2.resize(img, None, fx=2, fy=2)


cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)

cv2.waitKey()
cv2.destroyAllWindows()

원본

 

가로, 세로 각각 2배 축소

dst = cv2.resize(img, None, fx=0.5, fy=0.5)

 

가로, 세로 각각 2배 확대

dst2 = cv2.resize(img, None, fx=2, fy=2)

 

대칭 변환

이미지 대칭 변환은 flip을 사용합니다.

 

cv2.flip(src, flipCode, dst=None)  ->  dst 

  • src: 입력 이미지
  • flipCode: 1: 좌/우 대칭 0: 상/하 대칭 -1: 좌/우&상/하 대칭
  • dst: 출력 이미지
import cv2
import numpy as np
import os

_path = os.path.join('img','apple.jpg')

src = cv2.imread(_path)

dst = cv2.flip(src, 1)
dst2 = cv2.flip(src, 0)
dst3 = cv2.flip(src, -1)

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)

cv2.waitKey()
cv2.destroyAllWindows()

 

원본과 좌우 대칭

dst = cv2.flip(src, 1)

 

상하 대칭과 좌우상하 대칭

dst2 = cv2.flip(src, 0)
dst3 = cv2.flip(src, -1)

 

이동 변환

이동변환은 [[1,0,x], [0,1,y]] 형태의 2x3 변환 행렬을 warpAffine 의 파라미터로하여 변환하여 표현할 수 있습니다.

 

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst

  • src: 입력 이미지
  • M: 2x3 변환 행렬
  • dsize: 출력 이미지 사이즈
  • dst: 출력 이미지
import cv2
import os
import numpy as np

path = os.path.join('img', 'img.jpg')
img = cv2.imread(path)
print(img.shape)

M = np.float32([[1,0,50], [0,1,100]])
dst = cv2.warpAffine(img, M, (0,0))

M2 = np.float32([[1,1,50], [0,1,50]])
dst2 = cv2.warpAffine(img, M2, (0,0))

M3 = np.float32([[1,0,50], [0.5,1,50]])
dst3 = cv2.warpAffine(img, M3, (0,0))

cv2.imshow('img', img)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)

cv2.waitKey()
cv2.destroyAllWindows()

 

기본사용법으로 원본과 이동변환 비교입니다.

X 축으로 +50

Y 축으로 +100 

M = np.float32([[1,0,50], [0,1,100]])
dst = cv2.warpAffine(img, M, (0,0))

 

다음과 같은 이동도 가능합니다.

M2 = np.float32([[1,1,50], [0,1,50]])
dst2 = cv2.warpAffine(img, M2, (0,0))

M3 = np.float32([[1,0,50], [0.5,1,50]])
dst3 = cv2.warpAffine(img, M3, (0,0))

 

회전 변환

이미지를 회전 변환은 getRotationMatrix2D 의 결과인 2x3 변환 행렬을 warpAffine 의 파라미터로하여 변환합니다.

 

cv2.getRotationMatirx2D(center, angle, scale) -> retval

  • center: 회전의 중심좌표로 (x, y) 튜플
  • angle: 회전하는 각도(반시계방향이 양수)
  • scale: 추가적인 확대 비율
  • retval: 2x3 변환 행렬

cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst

  • src: 입력 이미지
  • M: 2x3 변환 행렬
  • dsize: 출력 이미지 사이즈
  • dst: 출력 이미지
import cv2
import numpy as np
import os

_path = os.path.join('img','img.jpg')

src = cv2.imread(_path)

print(src.shape)
cp = (src.shape[1] / 2, src.shape[0] / 2)

rot1 = cv2.getRotationMatrix2D(cp, 45, 1)
rot2 = cv2.getRotationMatrix2D(cp, 90, 1)
rot2 = cv2.getRotationMatrix2D(cp, 180, 0.5)

dst1 = cv2.warpAffine(src, rot1, (0,0))
dst2 = cv2.warpAffine(src, rot2, (0,0))

cv2.imshow('src', src)
cv2.imshow('dst1', dst1)
cv2.imshow('dst2', dst2)

cv2.waitKey()
cv2.destroyAllWindows()

원본

45도 회전

rot1 = cv2.getRotationMatrix2D(cp, 45, 1)
dst1 = cv2.warpAffine(src, rot1, (0,0))

 

90도 회전

rot2 = cv2.getRotationMatrix2D(cp, 90, 1)
dst2 = cv2.warpAffine(src, rot2, (0,0))

 

180도 회전, 2배 축소

rot3 = cv2.getRotationMatrix2D(cp, 180, 0.5)
dst3 = cv2.warpAffine(src, rot3, (0,0))