2018. 6. 13. 01:59ㆍPython-이론/python-opencv
resize, rotation, move, perspective
이미지 사이즈 변경하기 (resize)
예제코드
import cv2 import numpy as np img = cv2.imread('images/desk.png') halfW = cv2.resize(desk, None, fx=0.5, fy=1,interpolation=cv2.INTER_AREA) halfH = cv2.resize(desk, None, fx=1, fy=0.5, interpolation=cv2.INTER_AREA) halfWH = cv2.resize(desk, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA) cv2.imshow('original', desk) cv2.imshow('halfW', halfW) cv2.imshow('halfH', halfH) cv2.imshow('halfWH', halfWH)
결과
cv2.resize(img, dsize, fx=, fy=,interpolation=보간법)
인자
img: 원본 이미지
dsize: dsize로 나타내는 튜플값으로 나타냅니다.(x 픽셀, y 픽셀)
fx: x사이즈 비율 (비율값을 원하지 않는다면 원하는 가로 크기/img.shape[1])
fy: y사이즈 비율 (비율값을 원하지 않는다면 원하는 가로 크기/img.shape[0])
interpolation: resize할 때 사용하는 보간법
INTER_AREA: 픽셀영역 관계를 이용한 resampleing방법 원래 크기 보다 줄여줄 때 유용하다.
INTER_LINEAR: (default value) bilinear
INTER_NEAREST: nearest_neighbor(size 크게 할때)
INTER_CUBIC: 4x4 픽셀에 적용된다. (bicubic interpolation)
INTER_LANCZOS4: 8x8 픽셀에 적용된다. (LANCZOS4 interpolation)
이미지 작게 만들 때는 cv2.INTER_AREA를 사용하고 크게 만들 때는 cv2.INTER_CUBIC + cv2.INTER_NEAREST를 사용한다.
이미지 회전하기(rotation)
딥러닝의 cnn을 사용하면서 이미지를 회전시키면 더욱 좋은 결과가 나오는 것을 볼 수 있었다. 이번에는 이미지를 한번 회전시켜 보겠습니다.
예제코드
import cv2 import numpy as np img = cv2.imread('images/desk.png') h,w = img.shape[:2] M1 = cv2.getRotationMatrix2D((w/2, h/2), 90, 1) M2 = cv2.getRotationMatrix2D((w/2, h/2), 45, 1) rotation1 = cv2.wrapAffine(img, M1, (w,h)) rotation2 = cv2.wrapAffine(img, M2, (w,h)) cv2.imshow('rota1', rotation1) cv2.imshow('rota2', rotation2)cv2.waitkey(0)
cv2.destroyAllWindows()
결과
코드설명
cv2.getRotationMatrix2D((이미지 중앙X, 이미지 중앙Y ), 각도, scale)
각도 만큼 돌릴 수있는데 (2x3)의 배열을 반환한다.
cv2.wrapAffine(이미지, 각 픽셀당 곱해줄 필터?, (이미지 크기X, 이미지 크기Y))
원본 이미지를 M만큼 이동시켜준다.
픽셀이(X,Y)가 존재하고 M이 [[M11, M12, M13], [M21, M22, M23]]
원본 이미지를 (X*M11 + Y*M12 + M13, X*M21 + Y*M22 + M23)이런식으로 모든 픽셀을 구해준다.
이미지 이동시키기
예제 코드
import numpy as np M = [ [1, 0, 100], [0, 1, 100] ] desk = cv2.imread('images/desk.png') h, w = desk.shape[:2] M = np.float32(M) move = cv2.warpAffine(desk, M, (w, h)) cv2.imshow('move', move) cv2.waitKey(0) cv2.destroyAllWindows()
결과
원근법 주기
이미지를 적용시킬 때 무작정 원본 이미지만이 아니라 원래의 이미지의 멀리 보이고 싶은 것을 더 멀리 보이게 가까이 있는 것을 더 가깝게 보이게 만들 필요가 있을 때도 있다. 이번에는 이미지에 원근법을 주어 보겠다.
예제코드
방법1 Affine을 사용하기
import cv2 import numpy as np pts1 = np.float32([[50, 50], [200, 50], [20, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) M = cv2.getAffineTransform(pts1, pts2) threePointsImg= cv2.warpAffine(img, M, (w, h)) cv2.imshow('threePointsImg', threePointsImg) cv2.waitkey(0) cv2.destroyAllWindwos()
결과
pts1 = np.float32([[50, 50], [200, 50], [20, 200]])
pts2 = np.float32([[10, 100], [200, 50], [100, 250]])
M = cv2.getAffineTransform(pts1, pts2)
pts1을 pts2까지 이동시키는 M을 만든다.
방법2 getPerspectiveTransform을 사용하기
import cv2 import numpy as np plt1 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) plt2 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) M = cv2.getPerspectiveTransform(plt1, plt2) perspectiveImg = cv2.warpPerspective(img, M, (w, h)) cv2.imshow('perspective', perspectiveImg) cv2.waitKey(0) cv2.destroyAllWindows()
plt1 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]])
plt2 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]])
네개의 좌표를 이동시키는 M을 만든다. 위의 방법과 달리 getAffineTransform과 달리 getPerspectiveTransform을 사용해야한다.
결과
'Python-이론 > python-opencv' 카테고리의 다른 글
[opencv-python] 이미지 읽어서 출력하기 (1) | 2019.06.30 |
---|---|
opencv 설치하기 (0) | 2019.06.29 |
[OpenCV-python] Contour 응용하기 2 (0) | 2018.06.08 |
[OpenCV-python] Contour 응용하기 1 (1) | 2018.06.07 |
[OpenCV-python] Contour (0) | 2018.06.07 |