본문 바로가기

OpenCV/Python

이미지 기하학적 변환

1.단순 회전

cv.getRotationMatrix2D( (센터 좌표), 회전 각도, 이미지 크기 )

import cv2 as cv

img = cv.imread('hamster.jpg')

img_h, img_w = img.shape[:2]

rotate = cv.getRotationMatrix2D((img_w/2, img_h/2), 45, 1)

img_rotate = cv.warpAffine(img, rotate, (img_w, img_h))

cv.imshow("ass", img_rotate)
cv.waitKey(0)

 

2. 크기 조정

cv.resize 사용

 

1) 확대

- 이미지 확대시에는 INTER_CUBIC, INTER_LINEAR 근데 CUBIC은 느리다

 

 

2) 축소

- 축소할때는 INTER_AREA 권장

 

3. 이미지 이동

WarpAffine 함수 사용

이동행렬을 만들어서 변환시키는 것임

ex) [1,0,100] [0,1,50] -> x방향(오른쪽) 으로 100, y 방향(아래) 로 50 이동하는 행렬

 

 

4. 아핀 변환

그림과 같이 세점을 대응시켜야한다

-> 정말 간단하게 생각하면,  모서리 좌표들을 찍어두고, 그 좌표의 픽셀 위치를 바꿔주면 된다.

참고 이미지

 

 

cv.getAffineTransform(기존의 세개 좌표, 변경된 세개의 좌표) 

ex) 예제

-> 원하는 좌표를 3개 찍고, 변환 후 getAffineTransform 함수 사용

import cv2 as cv
import numpy as np

point_list = []


def mouse_callback(event, x, y, flags, param):

    # 좌표를 클릭으로 찾기
    if event == cv.EVENT_LBUTTONDOWN:
        print(" (%d,%d) " % (x, y))
        point_list.append((x, y))
        cv.circle(img, (x, y), 2, (100, 150, 210), -1)


cv.namedWindow('test')
cv.setMouseCallback('test', mouse_callback)

img = cv.imread('HBW.jpg')

while True:
    cv.imshow('test', img)

    # 좌표 다 찍으면, 루프 나오고 변환 작동
    if cv.waitKey(0) == 27:
        break


h, w = img.shape[:2]

points_1 = np.float32([point_list[0], point_list[1], point_list[2]])
points_2 = np.float32([point_list[0], point_list[1], point_list[2]])

# 원하는 변환은 이 위치에
# 두번째 포인터에 y좌표가 +100
points_2[1][1] += 100

M = cv.getAffineTransform(points_1, points_2)

img_result = cv.warpAffine(img, M, (w, h))

cv.imshow('result', img_result)

cv.waitKey(0)

 

 

 

5. 퍼스펙티브 변환

: 간단히 말해, 3차원 공간에 있는 물체를 2차원 평면에 올려놓는 것

: 중요하므로 따로 쓰겠음

 

'OpenCV > Python' 카테고리의 다른 글

원근(퍼스펙티브) 변환  (0) 2021.06.13
영역 지정 (내가 헷갈려서 정리..)  (0) 2021.06.13
ROI - 3 응용하기2 ( 평균 색 추출하기)  (0) 2021.06.12
ROI -2 응용하기  (0) 2021.06.11
ROI -1 관심영역 설정  (0) 2021.06.11