[OpenCV-python] resize, rotation, move, perspective

2018. 6. 13. 01:59Python-이론/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