Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- VScode Python
- opencv-python
- 스프링역사
- 영상 추출
- OpenCV 초급
- 영상 생성
- nameWindow
- cvtColor
- 고릴라캠핑TV
- 파티라이트
- Python 환경설정
- vscode
- Python
- OpenCV 기초
- 파이썬 설정
- OpenCV 예제
- openCV 실습
- python-opencv
- imwrite
- 제드파티라이트
- imread
- VScode 환경설정
- 고릴라캠핑TV체험단
- 영상 복사
- numpy.ndarray
- matplotlib
- python 3.7.7
- OpenCV
- 고릴라캠핑
- OpenCV 입문
Archives
- Today
- Total
코딩. 캠핑
OpenCV-Python 입문(5) - 마스크 연산과 ROI 본문
ROI(Region of Interest)
- 관심 영역, 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역
마스크 연산
- OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상을 인자로 함께 전달해야 한다.
- 마스크 영상은 cv.CV_8UC1 타입(스레이스케일 영상)
- 마스크 영상은 픽셀 값이 0이 아닌 위치에서만 연산이 수행됨
-> 보통 마스크 영상으로는 0 또는 255로 구성된 이진 영상을 사용
마스크 연산을 지원하는 픽셀 값 복사 함수
cv2.copyTo(src, mask, sdt=None) -> dst
- src : 입력영상
- mask : 마스크 영상. cv2.CV_8U.(numpy.uint8). 0이 아닌 픽셀에 대해서만 복사 연산을 수행.
- dst : 출력 영상. 만약 src와 크기 및 타입이 같은 dst를 입력으로 지정하면 dst를 새로 생성하지 않고 연산을 수행. 그렇지 않으면 dst를 새로 생성하여 연산을 수행한 후 반환
뭔소린지 모르겠다. 실습해보자.
import sys
import cv2
# 마스크 영상을 이용한 영상 합성
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.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()
src영상에서 추출한 비행기 mask를 dst로 합성할 거에오. 아래 한줄만 딱 끼워주면,
cv2.copyTo(src, mask, dst)
당연한 얘기지만 src, mask, dst는 사이즈가 다 같아야하고, src, dst는 타입도 같아야한다. 컬러면 컬러, 그레이스케일이면 그레이스케일로 맞춰주고, mask는 무조건 그레이스케일이여야 한다.
이런 작업을 openCV에서도 할 수 있지만, 아래처럼 numpy에서 제공하는 boolean인덱싱으로도 작업할 수 있다.
dst[mask > 0] = src[mask > 0]
mask 영상에서 픽셀값이 0보다 큰 부분을 다 찾고, src에서도 0보다 큰 부분을 다 찾는다. mask > 0 의 결과는 mask 행렬과 동일한 크기의 행렬이 생성되는데, boolean값. True, False로 구성되어 있는 행렬이 반환되고, 그 행렬을 src 행렬에 대해서 인덱싱을 하게되면, True 부분에만 있는 픽셀만 가져올수 있는데, 그 픽셀값을 동일하게 dst에 세팅하는것이다.
동일하게 적용되는 것을 확인할 수 있다.
이번에는
이 사진을 이용해서 진행해보도록 하겠다.
# 알파 채널을 마스크 영상으로 이용
src = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)
mask = src[:, :, -1] # mask는 알파 채널로 만든 마스크 영상
src = src[:, :, 0:3] # src는 b, g, r 3채널로 구성된 컬러 영상
dst = cv2.imread('field.bmp', cv2.IMREAD_COLOR)
h, w = src.shape[:2]
crop = dst[0:h, 0:w] # src, mask와 같은 크기의 부분 영상 추출
cv2.copyTo(src, mask, crop)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()
이렇게 투명한 png 파일도 합성이 가능하다.
'Dev(개발) > OpenCV(Python)' 카테고리의 다른 글
OpenCV Python 입문(5) - 영상 생성, 복사, 부분 추출 (0) | 2021.01.28 |
---|---|
OpenCV Python 입문(4) - 영상의 속성과 픽셀 값 참조 (2) | 2021.01.28 |
OpenCV Python 입문(3) - 이미지 슬라이드쇼 만들기 (0) | 2021.01.27 |
OpenCV Python 입문(2) - Matplotlib 라이브러리 (1) | 2021.01.26 |
OpenCV Python 입문(1) - OpenCV 기본 함수 (3) | 2021.01.26 |
Comments