728x90

목표

- 이미지를 가지고 기하학적 변환을(평행이동, 회전, 어파인 등) 해봅시다.

 

대표적인 기하학적 변환 함수

-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)

 

300x250

+ Recent posts