Program/OPEN_CV

[Open CV] OpenCV-Python 기초 사용법 _ 마스크 연산과 ROI

사막여유 2022. 4. 27. 21:02
728x90

 

ROI라고 하는 것은 Region of interest라고 하는 관심영역인데영상에서 내가 영상처리할 부분의 좌표나 픽셀등을 지정 , 설정해 놓는 것이다.

그리고 마스크연산은 내가 처리하고자하는 곳을 제외한 부분을 0또는 255의 픽셀값으로 구성하는 것이다.

보통은 Mask 픽셀값을 0으로 지정하여 ROI 연산을 할때 0이 아닌부분 ( 1이상인 부분 )을 보고 연산처리한다.

 

흰색 : ROI  // 검은색 : MASK

 

OpenCV에서는 마스크 연산을 지원하는 함수들이 몇가지 있는데 이를 설명하면

 - cv2.copyTo(src,mask,dst=None) -> dst

위 함수는 저번에 설명했었던 영상 전체 복사가 아닌

영상에서 마스크를 제외한 ROI 영역을 복사하는 함수인데

dst = None을 하게되면 입력받은 영상에 그대로 ROI만 따서 가져오는 기능을 할 수도 있다.

 

 

위와 같이 coptyTo함수를 사용하게되면 src 영상에서 mask ( 0이 아닌 부분 ) 영상의 ROI영역을 따와서

dst 영상에 그대로 카피해주는 역할이다.

 * 여기서 기본적이지만 가장 중요한 점은 src mask dst는 크기가 같아야하고 src와 dst는 타입이 같아야한다.

 

그리고 4개의 채널을 가지는 영상을 불러와서 합성을 해보려고한다면

src = cat.bmp 라는 고양이 영상을 불러오고

logo = opencvlogo.png 라는 로고 영상을 불러온 다음

mask 영상에는 logo에서 불러온 영상의 알파 채널만을 이용하여 ROI를 따낸다.

mask = logo [ :, :, 3] 이라고 코딩해주면 RGB 다음 알파채널을 사용하여 ROI를 따낼 수 있다.

이후 logo는 알파채널을 제외한 RGB값만 받아와서 영상을 만들어준다.

 

그리고 중요한 건 고양이영상과 logo 영상의 크기가 맞지 않는다는 점인데

그러면 영상에서는 합성된 부분이 보이지 않기 때문에 mask에서의 영상 크기를 추출하고 어제 배웠었던 영상 복사인데 서로 픽셀값을 공유하는 복사기능을 사용하여 고양이 영상에서도 그 부분을 추출한다.그리고 그 추출한 부분을 가지고 copyto함수를 쓰게되면 추출한 부분의 픽셀값이 바뀌게 되는데 이는 고양이 영상과 공유되고있었기 때문에 cv2.copyto(logo,mask,crop) 이라고 인자에 Cat대신 crop이라는 변수를 넣어줘도 크게 문제되지 않는다.

 

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

https://bit.ly/3L3avNW

 

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

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

fastcampus.co.kr

 

728x90