상세 컨텐츠

본문 제목

영상의 생성, 복사, 부분 영상 추출

영상처리/OpenCV Python

by cepiloth 2021. 5. 12. 11:42

본문

728x90
반응형

지정한 크기로 새 영상 생성하기

numpy.empty(shape, dtype=float, ...) -> arr
numpy.zeros(shape, dtype=float, ...) -> arr
numpy.ones(shape, dtype=None, ...) -> arr
numpy.full(shape, fill_value, dtype=None, ...) -> arr

• shape: 각 차원의 크기. (h, w) 또는 (h, w, 3)
• dtype: 원소의 데이터 타입. 일반적인 영상이면 numpy.uint8 지정
• arr: 생성된 영상(numpy.ndarray)
• 참고사항:
▪ numpy.empty() 함수는 임의의 값으로 초기화된 배열을 생성
▪ numpy.zeros() 함수는 0으로 초기화된 배열을 생성
▪ numpy.ones() 함수는 1로 초기화된 배열을 생성
▪ numpy.full() 함수는 fill_value로 초기화된 배열을 생성

 

영상의 생성 예제 코드

img1 = np.empty((480, 640), dtype=np.uint8) # grayscale image
img2 = np.zeros((480, 640, 3), dtype=np.uint8) # color image
img3 = np.ones((480, 640), dtype=np.uint8) * 255 # white
img4 = np.full((480, 640, 3), (0, 255, 255), dtype=np.uint8) # yellow

 

영상의 참조 및 복사 예제 코드

img1 = cv2.imread('HappyFish.jpg')
img2 = img1
img3 = img1.copy()

 

마스크 연산과 ROI

 

ROI

• Region of Interest, 관심 영역
• 영상에서 특정 연산을 수행하고자 하는 임의의 부분 영역

마스크 연산

• OpenCV는 일부 함수에 대해 ROI 연산을 지원하며, 이때 마스크 영상을 인자로 함께 전달해야 함
(e.g.) 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]

 

airplane mask 연산 예제

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)

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]

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

 

import sys
import cv2

# 알파 채널을 마스크 영상으로 이용
src = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
logo = cv2.imread('opencv-logo-white.png', cv2.IMREAD_UNCHANGED)

if src is None or logo is None:
    print('Image load failed!')
    sys.exit()

mask = logo[:, :, 3]    # mask는 알파 채널로 만든 마스크 영상
logo = logo[:, :, :-1]  # logo는 b, g, r 3채널로 구성된 컬러 영상
h, w = mask.shape[:2]
crop = src[10:10+h, 10:10+w]  # logo, mask와 같은 크기의 부분 영상 추출

cv2.copyTo(logo, mask, crop)
#crop[mask > 0] = logo[mask > 0]

cv2.imshow('src', src)
cv2.imshow('logo', logo)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()

 

728x90
반응형

'영상처리 > OpenCV Python' 카테고리의 다른 글

카메라와 동영상 처리하기 1  (0) 2021.05.12
OpenCV 그리기 함수  (0) 2021.05.12
영상의 속성과 픽셀 값 참조  (0) 2021.05.12
Matplotlib 사용하여 영상 출력하기  (0) 2021.05.12
OpenCV 주요 함수 설명  (0) 2021.05.12

관련글 더보기

댓글 영역