Program/OPEN_CV

[Open CV] 기하학적 변환 _ 영상의 이동 변환과 전단 변환

사막여유 2022. 5. 22. 16:24
728x90

 

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

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

 픽셀의 좌표가 변환되는 형태 

 Image registration, removal of geometric distortion, ect.

 

 

우리는 위의 affine 과 projective ( perspective ) 의 기하학적 변환만 알아본다.

 

일단 이동변환 ( Translation transformation )을 먼저 알아본다.

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

 - x축과 y축 방향으로의 이동 변위를 지정

   아래와같이 표현할 수 있다.

 

그리고 위와같은 2행3렬의 행렬을 어파인 변환 행렬을 numpy ndarray 로 만들면된다.

 

 - cv2.warpAffine ( src, M, dsize, dst, flags, borderMode, borderValue )

   M : 2x3 어파인 변환 행렬. 실수형

   dsize : (w,h) 튜플. ( 0,0 )이면 src와 같은 크기로 설정

   flags : 보간법 , 기본값은 cv2.INTER_LINEAR

   borderMode : 변환을 하게될 경우에는 새롭게 생겨나는 공간이 있는데 그런 공간들을
                      어떤 색깔로 채울것인지 결정

   borderValue : cv2.BORDER_CONSTANT 일 때 사용할 상수 값. 기본값은 0 

 

 

위와같이 M 행렬을 만들어 준 뒤 ( 픽셀 X과 Y의 이동 거리 ) cv2.warpAffine 함수에 적용시켜주면 

아래와같은 영상을 얻을 수 있다.

 

 

 - 전단 변환 ( Shear transformation )

   층 밀림 변환. x축과 y축 방향에 대해 따로 정의

   즉, x와 y가 같은 벡터만큼 움직이지 않고 서로 다른 벡터값만큼 이동하는 변환

 

 

위와같은 수식을 보면

 x' = x + my 인것을 보아 y값이 커질수록 x' ( x의 변환 결과값 )이 커지는 것을 볼 수 있고

 y' = mx + x 인것을 보다 x값이 커질수록 y' ( y의 변환 결과값 )이 커지는 것을 볼 수 있다. 

 *  여기서 m의 상수가 뜻하는 것은 x 또는 y 의 좌표를 옮기고싶은 크기를 나타낸다.

 

그래서 실제로 코딩으로 구현을 해보면

 

위와같이 표현할 수 있는데 이대로 실행하게되면 결과가 짤리는 것을 볼 수 있다.

 

따라서 

dst = cv2.warpAffine(src,aff,(w+ int(h* 0.5),h))

출력 영상 크기를 옮긴만큼의 m 값에 현재 x가 옮겨졌으니 Width 부분에 my를 더해주어 자연스러운 결과값을 받을 수 있다.

 

 

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3L3avNW

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90