Program/OPEN_CV

[Open CV] 기하학적 변환 _ 리매핑

사막여유 2022. 5. 27. 08:02
728x90

 

 - 리매핑이란 ( remapping ) ?

   영상의 특정 위치 픽셀을 다른 위치에 재배치 하는 일반적인 프로세스   

 

   출력 영상에서 x , y 좌표의 픽셀 값을 입력영상에서 참조를 하는데 어느 위치에서 참조할것인지를 나타내는 

   map x 와 map y 라고 하는 함수를 정의를 해서 ,

   출력 영상의 픽셀값을 입력 영상 어느 좌표에서 참조해서 갖고올것인지를 지정하게끔해서

   출력 영상의 픽셀값을 셋팅하는 것.

 

앞에서 들었던 강의 중 어파인변환, 투시변환같은 것들을 리매핑 기능으로 만들 수 있고,

기존에 만들었었던 사각형, 평행사변형 등의 모양이 아닌 영상 자체가 출렁이도록 만들수도 있다.

 

 

좌 : 이동변환 우 : 좌우 대칭변환

위 이미지를 보게되면 x 방향으로 -200 y 방향으로 -100 만큼 이동한 것을 볼 수 있다.

보통 위같은 이동변환을 보고 좌측방향으로 200 위로 100만큼 이동했다고 생각할 수 있는데

일단 , mapping 의 의미를 다시 생각해보면 

출력영상 dst는 입력영상에서의 픽셀값을 가져오는데 그럼, 입력영상에서의 -200 , -100 픽셀에 해당하는 값을가져오게 되는 것이라고 생각할 수 있다.그럼 입력영상의 입장에서 생각해보면 우측으로 200픽셀 아래로 100 픽셀 이동한 값이 출력영상으로 나타나게 된다.결국 이동변환의 수식은 출력영상의 입장에서의 수식이고, 입력영상을 생각하면 반대인 것이다.

 


 - cv2.remap ( src, map1, map2, interpolation, dst, borderMode, borderValue )

src : 입력 영상

map1 : 결과 영상의 ( x , y ) 좌표가 참조할 입력 영상의 x 좌표
          입력 영상과 크기는 같고, 타입은 np.float32인 numpy.ndarray
          * 위 이미지의 map x 에 해당

map2 : 결과영상의 ( x , y ) 좌표가 참조할 입력 영상의 y 좌표
          * 위 이미지의 map y 에 해당

interpolation : 보간법

dst : 출력영상

borderMode : 가장자리 픽셀 확장 방식. 기본값을 cv2.BORDER_CONSTANT

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


 

실제로 구현된 코딩이다.

map2와 map1 에서 볼 수 있는 np.indices 는 어떤 행렬의 인덱스값 즉, x좌표값과 y 좌표값을 따로 분리시켜주는 함수이다. 

그렇게 map2와 map1 에 입력영상의 x좌표값과 y 좌표값을 넣어주고 

map2에 ( y좌표 ) x 좌표를 더하는데 x좌표는 sin함수를 사용해서 값을 만들고 그 2개를 더하게된 이후

remap함수를 사용하게 되면 

위와같은 영상을 얻을 수 있다.

 

여기서 BORDER MODE를 DEFAULT 를 사용하지않고 기존의 CONSTANT를 사용하게되면 아래와같은

영상이 나타나게 되는데 

 

따라서, BORDER_DEFAULT 인자를 사용하여 가장자리에 픽셀이 있다고 가정하고 만들어주는 것이좋다.

DEFAULT 인자는 주변 픽셀에 대칭해서 색상값을 채워준다.

 

 

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

 

728x90