1.Scaling(보간법)
- 크기 조절은 단지 이미지의 크기를 조절하는 것이다.
- opencv는 scaling을 위해 cv2.resize()함수를 제공한다.
- 이미지의 크기는 수동으로 지정하거나 배율 인수를 지정할 수 있다.
이미지의 크기를 늘리거나 줄이더라도 픽셀의 수는 일정하므로 빈공간이 생기게 된다. 그 빈공간을 잘 채울 수 있게 하는 방법을 다음과 같이 소개하겠다.
- cv2.INTER_AREA : 크기 줄일 떄 사용
- cv2.INTER_CUBIC : 크기 늘릴떄 사용 (속도 느림, 퀄리티 좋음)
- cv2.INTER_LINEAR : 크기 늘릴떄 사용(기본값)
보간법을 적용하여 축소
import cv2
img = cv2.imread('catImg.jpg')
dst = cv2.resize(img, None, fx=0.5,fy=0.5, interpolation = cv2.INTER_AREA) # None : width, height 크기를 지정해주지 않겠다는 의미
#x,y의 비율을 정의하는것(0.5배로 축소)
cv2.imshow('img',img)
cv2.imshow('resize',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
보간법을 적용하여 확대
import cv2
img = cv2.imread('catImg.jpg')
dst = cv2.resize(img, None, fx=2,fy=2, interpolation = cv2.INTER_CUBIC) # None : width, height 크기를 지정해주지 않겠다는 의미
#x,y의 비율을 정의하는것(0.5배로 축소)
cv2.imshow('img',img)
cv2.imshow('resize',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.Translation Transformation(이동 변환)
- 이동 변환은 가로 또는 세로 방향으로 영상을 특정 크기만큼 이동시키는 것이다.
- x, y방향으로 어느정도 이동했는지에 대한 변위를 지정해 주어야 한다.
cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
• src: 입력 영상
• M: 2x3 어파인 변환 행렬. 실수형.
• dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 src와 같은 크기로 설정.
• dst: 출력 영상
• flags: 보간법. 기본값은 cv2.INTER_LINEAR.
• borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT.
• borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0(검정색).
- 파라미터로 들어갈 M에 Affine 변환 행렬이 무슨 소리지 라는 생각이 들 수 있다.
- 원점에서 x 축 이동은 a, y축 이동은 b로 표시할때 다음과 같이 행렬로 표현할 수 있다.
- 다음과 같은 덧셈 행렬을, 곱셈 행렬 형태로 변환하여 하나의 수식으로 표현할 수 있다.
- 어파인 변환 행렬을 적용하면 이동 변환을 하나의 행렬로 표현할 수 있다.
- 이렇게 이동 변환을 표현하는 어파인 변환 행렬을 np.array로 만들고 cv2.warpAffine 함수로 넘겨주면 이동 변환할 수 있다.
import cv2
import numpy as np
src = cv2.imread('img.jpg')
# 어파인 변환 행렬 생성
aff = np.array([[1, 0.5, 0],
[0, 1, 0]], dtype=np.float32)
dst = cv2.warpAffine(src, aff, (0, 0)) # 0,0 의미는 입력영상 크기와 동일한 출력 영상 생성
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
3.Rotation Transformation(회전 변환)
- 회전 변환은 영상을 특정 각도만큼 반시계 방향으로 회전시키는 변환이다.
- cv2.getRotationMatrix2D 함수를 사용하면 영상의 중앙을 기준점으로 회전할 수 있다.
- cv.2getRotationMatrix2D 함수는 결과 값을 2x3 어파인 변환 행렬을 반환합니다.
cv2.getRotationMatrix2D(center, angle, scale) -> retval
• center: 회전 중심 좌표. (x, y) 튜플.
• angle: (반시계 방향) 회전 각도(degree). 음수는 시계 방향.
• scale: 추가적인 확대 비율
• retval: 2x3 어파인 변환 행렬. 실수형.
import cv2
img = cv2.imread('img.jpg')
rows,cols = img.shape[:2]
#이미지의 중심점을 기준으로 90도 회전하면서 0.5배 scale
M = cv2.getRotaionMatrix2D((cols/2,rows/2),90,0.5)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)
4.Affine Transformation
- 어파인 변환은 영상의 이동, 전단, 확대, 회전을 조합할 때 직사각형이 평행사변형으로 변화하게 된다.
- 어파인 변환을 표현하는 방법은 2 x 3 행렬의 실수형에 회전, 크기, 이동 정보가 들어 있다.
cv2.getAffineTransform
-opencv에서 점 3개의 이동전, 이동 후 좌표를 입력하면 어파인 변환 행렬을 변환하는 함수를 제공한다.
cv2.getAffineTransform(src, dst) -> retval
• src: 3개의 원본 좌표점. numpy.ndarray. shape=(3, 2) e.g) np.array([[x1 , y1 ], [x2 , y2 ], [x3 , y3 ]], np.float32)
• dst: 3개의 결과 좌표점. numpy.ndarray. shape=(3, 2)
• dst: 3개의 결과 좌표점. numpy.ndarray. shape=(3, 2)
import cv2
import numpy as np
img = cv2.imread('img.jpg')
rows, cols,ch = img.shape
#원래 지점
pts1 = np.float32([[200,100],[400,100],[200,200]])
#이동할 지점
pts2 = np.float32([[200,300],[400,200],[200,400]])
#어파인 변환 행렬 생성
M = getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('dst',dst)
------생략--------
5.Perspective Transformation(투시 변환)
-opencv에서 점 4개의 이동 전, 후 좌표를 입력하면 투시 변환 행렬을 반환하는 함수를 제공한다.
cv2.getPerspectiveTransform(src, dst, solveMethod=None) -> retval
• src: 4개의 원본 좌표점. numpy.ndarray. shape=(4, 2) e.g) np.array([[x1 , y1 ], [x2 , y2 ], [x3 , y3 ], [x4 , y4 ]], np.float32)
• dst: 4개의 결과 좌표점. numpy.ndarray. shape=(4, 2)
• retval: 3x3 투시 변환 행렬
영상 투시 변환 함수 cv2.warpPerspective()
- 투시 변환 함수에 투시 변환 행렬을 입력하면 변환된 영상을 출력.
cv2.warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None) -> dst
• src: 입력 영상
• M: 3x3 투시 변환 행렬. 실수형.
• dsize: 결과 영상 크기. (w, h) 튜플. (0, 0)이면 src와 같은 크기로 설정
• dst: 출력 영상
• flags: 보간법. 기본값은 cv2.INTER_LINEAR
• borderMode: 가장자리 픽셀 확장 방식. 기본값은 cv2.BORDER_CONSTANT
• borderValue: cv2.BORDER_CONSTANT일 때 사용할 상수 값. 기본값은 0.
import cv2
import numpy as np
img = cv2.imread('poker.jpg')
width, height = 530,710 # 가로 크기 640 세로크기 240
src = np.array([[702,143],[1133,414],[725,1007],[276,700]],dtype = np.float32) # input 4개 지점
dst = np.array([[0,0],[width,0],[width,height],[0,height]],dtype = np.float32) # output 4개 지점
#좌상, 우상, 우하, 좌하 (시계방향으로 4 지점 정의)
matrix = cv2.getPerspectiveTransform(src,dst) # matrix 얻어옴
result = cv2.warpPerspective(img,matrix,(width,height)) # matrix대로 변환한 이미지를 받아오는것
cv2.imshow('img',img)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)
warp~~ --> 주어진 행렬로 영상을 변환해주는 함수
get~~Transform --> 원하는 지점으로 이동할 수 있도록 변환 행렬을 반환해주는 함수.
'CV' 카테고리의 다른 글
영상의 모폴로지 연산 - Morphological Image Processing (0) | 2022.10.23 |
---|---|
이미지 블러링(Images Smoothing/Blurring) (0) | 2022.10.23 |
OpenCV 기본 연산 (0) | 2022.10.22 |
도형 그리기(직선, 사각형, 원, 타원, 다각형, 텍스트) (0) | 2022.10.22 |
연결 요소 (0) | 2022.10.22 |