Python/파이썬 OpenCV 공부

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

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

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

 


 

 

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

황선규 박사님의 , 패스트 캠퍼스 OpenCV 강의를 공부한 내용을 정리해 보았습니다. 영상의 기하학적 변환(geometric transformation)이란?  영상을 구성하는 픽셀의 배치 구조를 변경함으로써 전체 영상

deep-learning-study.tistory.com

 이전 포스팅에서 영상의 이동 변환에 대해서 알아보았습니다.

 이번에는 전단 변환에 대해 공부하겠습니다.

 

영상의 전단 변환 - Shear transformation

전단 변환

 

 영상의 전단 변환은 층 밀림 변환이라고도 합니다.

 

 이동을 하는데 모든 픽셀들이 동일하게 이동하는 것이 아니라 어떤 픽셀은 조금 이동하고 어떤 픽셀은 많이 이동하여 한쪽을 찌그러뜨리는 효과를 냅니다.

 

 

 전단 변환도 이동 변환과 마찬가지로 어파인 행렬을 만들어야 합니다.

 

 이동 변환에서는 단위 행렬을 어파인 행렬로 생성했지만, 전단 변환은 m 상수도 필요합니다.

 

 

 전단 변환을 한 만큼 영상이 밀려나가게 되어 영상이 짤립니다.

 

 이를 해결하기 위해 밀린 만큼 출력 영상의 크기를 키워주면 됩니다.

 

영상의 어파인 변환 함수 - 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)

# 입력 영상의 크기 추출
h, w = src.shape[:2]

# 입력 영상과 출력 영상의 크기가 동일하다면 영상이 밀린 만큼 짤리게 되므로
# 출력 영상의 크기를 키워줬습니다.
# int를 이용한 경우는 입력값은 실수여야 합니다. 혹시 정수값이 입력될 수 있으므로 int를 이용했습니다.
dst = cv2.warpAffine(src, aff, (w + int(h * 0.5), h))

cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()

 

입력 영상

 

전단 변환

 

반응형