- 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()
'Computer Vision > opencv(python)' 카테고리의 다른 글
[09] 5) 카메라와 동영상 처리하기 (0) | 2021.03.15 |
---|---|
[08] 4) OpenCV 그리기 함수 (2) | 2021.03.13 |
[06] 2) 영상의 생성, 복사, 부분 영상 추출 (0) | 2021.03.12 |
[05] openCV-Python 기초 사용법 1) 영상의 속성과 픽셀 값 참조 (0) | 2021.03.11 |
[04] [실습] 이미지 슬라이드쇼 (0) | 2021.03.11 |