본문 바로가기

Fields Applied with AI/컴퓨터 비전 Computer Vision

Ⅰ. 컴퓨터 비전 기초 (5. 마스크 연산과 ROI)

  • 마스크 영상(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를 활용한 컴퓨터 비전과 딥러닝