Computer Vision/opencv(python)

[07] 3) 마스크 연산과 ROI

jwjwvison 2021. 3. 13. 11:31
  • ROI
    • Region of Interest, 관심 영역
    • 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

 

  • 마스크 연산
    • OpenCV 는 일부 함수에 대해 ROI 연산을 지원하며 , 이때 마스크 영상 을 인자로 함께 전달해야 함
    • (ex)cv2.copyTo(), cv2.calcHist(), cv2.bitwise_or(), cv2.matchTemplate(), etc.
    • 마스크 영상은 cv2.CV_8UC1 타입 그레이스케일 영상
    • 마스크 영상의 픽셀 값이 0 이 아닌 위치에서만 연산이 수행됨
    •  ->보통 마스크 영상으로는 0 또는 255 로 구성된 이진 영상 (binary image) 을 사용

 

  • 마스크 연산을 지원하는 픽셀 값 복사 함수
cv2.copyTo (src , mask , dst None ) --> dst
  • src: 입력 영상
  • mask: 마스크 영상,  cv2.CV_8U. (numpy.uint8) 0이 아닌 픽셀에 대해서만 복사 연산을 수행
  • dst: 출력 영상 . 만약 src 와 크기 및 타입이 같은 dst 를 입력으로 지정하면dst 를 새로 생성하지 않고 연산을 수행그렇지않으면 dst 를 새로 생성하여 연산을 수행한 후 반환함

 

  • 마스크 연산 예제
src=cv2.imread('airplane.bmp',cv2.IMREAD_COLOR)
mask=cv2.imread('mask_plane.bmp',cv2.IMREAD_GRAYSCALE)
dst=cv2.imread('field.bmp',cv2.IMREAD_COLOR)

cv2.copyTo(src,mask,dst)  #src,mask,dst 는 모두 크기가 같아야함. 
                          #src와 dst는 같은 타입이어야 하고, mask 는 그레이스케일 타입의 이진영상
  • Numpy의 불리언 인덱싱(Boolean indexing)을 이용한 마스크 연산
dst[mask>0]=src[mask>0]

 

  • 마스크 연산과 ROI 실습
import sys
import cv2

src=cv2.imread('opencv-logo-white.png',cv2.IMREAD_UNCHANGED) #rgb알파 이렇게 4개의 채널이 있을때는 unchanged를 써야함
mask=src[:,:,-1]        #src 이미지에서 4채널 값만 가져온다
src=src[:,:,0:3]        #앞의 3채널만 남김
dst=cv2.imread('field.bmp',cv2.IMREAD_COLOR)

h,w=src.shape[:2]
crop=dst[10:h+10,10:w+10]    # dst의 덮어씌여지는 부분의 사이즈가 같아야한다

cv2.copyTo(src,mask,crop)   #dst 와 src는 속성이 같아야 한다
# print([mask>0])
#dst[mask>0]=src[mask>0]

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

cv2.destroyAllWindows()