- 마스크 영상(Mask Image) = 영상의 특정 관심 영역(ROI)과 아닌 영역을 나눈 영상.
# 관심 영역(ROI : Region of Interest)이란 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역을 말합니다.
# 보통 마스크 영상은 0 or 255로 구성된 이진 영상(Binary image)를 사용합니다.
# 마스크 영상은 cv2.CV_8UC1 타입의 흑백 영상입니다.
- 마스크 연산(Mask Calculation) = 마스크 영상을 처리하는 영상.
# OpenCV는 일부 함수에 대해 ROI 연산을 지원함. 이때 마스크 영상을 인자로 함께 전달해야 합니다.
(ex. cv2.copy, cv2.calcHist, cv2.bitwise_or, cv2.matchTemplate…)
# 마스크 영상의 픽셀 값이 0이 아닌 위치에서만 연산이 수행됩니다.
5-(1) 마스크 연산 예제①
마스크 영상은 따로 포토샵이나 다른 프로그램을 이용하여 우선 만들어줘야 합니다.
Upload File
from google.colab import files
upload = files.upload()
upload = files.upload()
upload = files.upload()
Saving airplane.bmp to airplane.bmp
Saving mask_plane.bmp to mask_plane.bmp
Saving field.bmp to field.bmp
Read src, mask, dst
import sys
import cv2
from google.colab.patches import cv2_imshow
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)
- src : 'airplane' 컬러 이미지.
- mask : 미리 만들어진 'airplane' 마스크 흑백 이미지.
- dst : 최종적으로 합성되어 출력될 배경 이미지.
Synthesize Image
if src is None or mask is None or dst is None:
print('Image load failed!')
sys.exit()
cv2.copyTo(src, mask, dst)
# dst[mask > 0] = src[mask > 0]
- 합성을 하기 전에 이미지 파일이 잘못될 경우 종료하는 if문을 만들어줍니다.
- mask 이미지에서 0이 아닌 픽셀값을 가지고 있는 영역(ROI)의 픽셀 위치를 추출합니다.
- src 이미지에서 ROI에 해당하는 픽셀값을 복사합니다.
- dst 이미지에서 ROI에 해당한는 픽셀값을 복사한 src 픽셀값으로 대체합니다.
- cv2.copyTo 함수를 사용하는 것과 동일하게 Numpy의 Boolean index를 사용하여 dst의 동일한 위치에 있는 픽셀값을 src의 픽셀값으로 대체하면 합성이 됩니다.
- 동일한 위치의 픽셀값을 추출, 복사, 대체하는 것이므로 반드시 src, mask, dst는 동일한 크기의 영상이여야 합니다.
Print Image
cv2_imshow(src)
cv2_imshow(mask)
cv2_imshow(dst)
5-(2) 마스크 연산 예제②
이번 예제에서는 원본 이미지의 알파 채널(투명도)을 마스크 영상으로 사용합니다.
Upload File
from google.colab import files
upload = files.upload()
upload = files.upload()
Saving cat.bmp to cat.bmp
Saving opencv-logo-white.png to opencv-logo-white.png
Read src, image
import sys
import cv2
from google.colab.patches import cv2_imshow
src = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
logo = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)
- src : 'cat' 컬러 이미지.
- logp : 'opencv-logo-white' 4채널(R,G,B,a) 컬러 이미지.
Create Mask Image
if src is None or logo is None:
print('Image load failed!')
sys.exit()
mask = logo[:, :, 3]
logo = logo[:, :, :-1]
h, w = mask.shape[:2]
crop = src[10:10+h, 10:10+w]
- mask : logo 4채널 컬러 이미지에서 BRG 채널만 가지고 있는 컬러 이미지.
- logo : logo 4채널 컬러 이미지에서 a 채널만 가지고 있는 컬러 이미지.
- h, w : mask의 세로 픽셀수와 가로 픽셀수.
- crop : 배경 영상인 src 컬러 이미지에서 행 10~10+h-1, 열 10~10+w-1에 해당하는 합성을 원하는 영역.
- 따로 마스크 영상을 만드는 대신에 알파 채널을 슬라이싱하여 마스크 영상을 만들었습니다. 또한 crop의 경우 배경 이미지에서 합성을 원하는 위치 영역을 뜻하는데 이때 대체될 mask의 크기와 동일해야 합니다.
Print Image
cv2.copyTo(logo, mask, crop)
#crop[mask > 0] = logo[mask > 0]
cv2_imshow(src)
cv2_imshow(logo)
cv2_imshow(mask)
*참고 : OpenCV를 활용한 컴퓨터 비전과 딥러닝
'Fields Applied with AI > 컴퓨터 비전 Computer Vision' 카테고리의 다른 글
Ⅰ. 컴퓨터 비전 기초 (7. 입력 장치 이벤트) (0) | 2022.03.13 |
---|---|
Ⅰ. 컴퓨터 비전 기초 (6. 동영상이란?) (0) | 2022.02.27 |
Ⅰ. 컴퓨터 비전 기초 (4. 영상의 생성, 복사, 추출) (0) | 2022.02.24 |
Ⅰ. 컴퓨터 비전 기초 (3. 영상의 속성) (0) | 2022.02.24 |
Ⅰ. 컴퓨터 비전 기초 (2. 영상이란?) (0) | 2022.02.22 |