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))
'OpenCV' 카테고리의 다른 글
파이썬 OpenCV 를 위한 Numpy 정리 (0) | 2020.07.24 |
---|---|
파이썬 OpenCV 기하학적 변환 알아보기 -2 : 이미지 피라미드 만들기 (0) | 2020.07.24 |
파이썬 OpenCV 이미지 필터링 알아보기 : blur, GaussianBlur, medianBlur, bilateralFilter (1) | 2020.07.14 |
파이썬 OpenCV 트랙바 사용하기 (1) | 2020.07.14 |
파이썬 OpenCV 이미지 밝기 조절 : add, sub (0) | 2020.07.14 |