목표
- 이미지를 가지고 기하학적 변환을(평행이동, 회전, 어파인 등) 해봅시다.
대표적인 기하학적 변환 함수
-opencv에서 대표적으로 2가지 변환 함수 제공
- cv2.warpAffine : 어파인 변환= 평행이동 + 회전+ 스케일링
- cv2.warpPerspective : 원근 변환 = 평행 이동 + 회전 + 스케일링 + 원근
스케일링 변환
- 이미지 크기 조절 -> cv2.resize()
- 사용되는 보간법 -> ex. cv2.INTER_AREA(크기 줄일때), cv2.INTER_CUBIC or cv2.INTER_LINEAR(크기 늘릴떄)
파일명 : 01_scaling.py
- 원본 이미지 2배로 늘림. INTER_CUBIC 보간법 사용
import cv2
import numpy as np
img = cv2.imread("C:/Users/do/Documents/github/opencv_python/05day/kimheungkook.jpg")
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)
cv2.imshow('image1',img)
cv2.imshow('image2',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
평행이동 변환
- 이미지를 밀어내는 변환
- (x. y) 좌표계 상에서 (t_x, t_y)만큼 이동시키는 변환 행렬 M은 아래와 같음
=> cv2.warpAffine() 함수에 매개변수로 넣어 100,50 정도 이동
- x축으로 100, y축으로 50 만큼 이동
import cv2
import numpy as np
img = cv2.imread("C:/Users/do/Documents/github/opencv_python/05day/kimheungkook.jpg", 0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
회전 rotation 변환
- 각도 theta만큼 이미지를 회전시키는 변환 행렬 M은 아래와 같음
- 하지만 opencv는 중심점을 지정해서 회전 가능
- cv2.getRotationMatrix2D 함수로 위와 같은 회전 변환 행렬을 얻을 수 으며 스케일링 없이 90도 회전한 결과는 아래와 같음
import cv2
import numpy as np
img = cv2.imread("C:/Users/do/Documents/github/opencv_python/05day/kimheungkook.jpg", 0)
rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
어파인 변환
- 어파인 변환에서 원근 변형은 생기지 않음.
- 이 변환을 하려면 입력 영상에서 3점과 출력 영상에서 대응할 점 3개를 지정해야함
- cv2.getAffineTransform 함수로 2 x 3 행렬을 만들어 cv2.warpAffine 수행
* 어파인 변환= 회전, 평행이동, 스케일링이 수행됨
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("C:/Users/do/Documents/github/opencv_python/05day/kimheungkook.jpg")
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[100,24],[80,200]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
원근변환 perspective transform - 기울어진 사진을 펴기
- 원근 변환 시에는 3 x3의 변환 행렬이 필요합니다. 이 행렬을 구하기 위해선 입력 이미지의 4개의 점과 출력 영상에서 4점이 필요하며, cv2.getPerspectiveTransform 함수로 얻을 수 있습니다.
- 그러고 나서 cv2.warpPerspective 함수로 아까 구한 변환 행렬을 사용하면 원근 변환된 이미지를 얻게 됩니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread("C:/Users/do/Documents/github/opencv_python/05day/kim_perspective.png")
rows,cols,ch = img.shape
pts1 = np.float32([[11,5],[592,17],[512,438],[90,440]])
pts2 = np.float32([[0,0],[592,0],[592,442],[0,442]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(592,442))
cv2.imshow('img',img)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
- 아래의 사진은 원본 이미지로 592 x 442 크기
- 기존 모서리 : (11,5), (592. 17), (512, 438), (90, 440)
- 변경 후 모서리 : (0,0) (592, 0), (592, 442), (0, 442)
'로봇 > 영상' 카테고리의 다른 글
opencv-python 튜토리얼 - 10. 이미지 스무딩 (0) | 2020.08.14 |
---|---|
opencv-python 튜토리얼 - 9. 이미지 이진화 (0) | 2020.08.14 |
opencv-python 튜토리얼 - 7. 이미지 기본 연산 다루기 (0) | 2020.08.10 |
opencv-python 튜토리얼 - 6. 트랙바를 컬러 팔레트로 사용해보기 (0) | 2020.08.10 |
opencv-python 튜토리얼 - 5. 마우스를 패인트 브러쉬로 사용하기 (0) | 2020.08.10 |