Python/파이썬 OpenCV 공부

[파이썬 OpenCV] 영상의 기하학적 변환 - 이동 변환 - cv2.warpAffine

AI 꿈나무 2020. 10. 4. 19:16
반응형

황선규 박사님의 <OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝>, 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다.

 


영상의 기하학적 변환(geometric transformation)이란?

 영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상의 모양을 바꾸는 작업입니다.

 

 영상의 모양 자체를 변환하고 좌표에 대한 개념이 필요합니다.

 

 기하학적 변환이 필요한 이유

 

1. 입력 영상 크기가 제한되어 있어 영상 크기를 축소해야 하는 경우.

2. 객체가 영상의 정중앙에 있어야 하는 경우.

3. 회전이 되어 있는 영상을 똑바로 보정

 

 이 외에도 여러가지 상황에서 영상의 기하학적 변환이 필요합니다.

 

1. 영상의 이동 변환 - Translation transformation

 

 이동 변환은 shift라는 용어도 많이 씁니다.

 

 가로 또는 세로 방향으로 영상을 특정 크기만큼 이동시키는 변환입니다.

 

 x, y 방향으로 어느 정도 이동했는지에 대한 변위를 지정해줘야 합니다.

 

 원점에서 x축 이동은 a, y축 이동은 b로 표시합니다.

 

 덧셈 행렬로 구성되어 있는데, 곱셈 행렬 형태로 변환하여 하나의 수식으로 표현할 수 있습니다.

 

 

 어파인 변환 행렬(동차적 표계 개념)을 적용하면 이동 변환을 하나의 행렬로 표현할 수 있습니다.

 

 이동 변환을 표현하는 어파인 변환 행렬을 np.array로 만들고 cv2.warpAffine 함수로 넘겨주면 이동 변환 할 수 있습니다.

 

2. 영상의 어파인 변환 함수 - cv2.warpAffine

 어파인 변환 행렬을 어파인 변환 함수에 입력해주면 이동 변환을 할 수 있습니다.

 

함수 설명

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(검정색).

 cv2.INTER_LINEAR은 양선형 보간법을 의미합니다.

 borderValue는 이동 변환을 했을 때 생기는 빈공간을 어떤 색깔로 채울 것인지를 의미합니다. 기본값은 0(껌정색)입니다.

 

이동 변환 예제

src = cv2.imread('tekapo.bmp')

if src is None:
    print('Image load failed!')
    sys.exit()

# 어파인 변환 행렬 생성
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()

 

 

 

영상의 이동 변환

 

 입력 영상과 동일한 크기로 출력 영상을 출력했으므로 영상이 짤렸습니다.

 짤린 부분까지 출력하고 싶다면 출력 영상의 크기를 크게 해야합니다.

 

반응형