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()
• 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는 그레이스케일 타입의 이진 영상.
dst[mask > 0] = src[mask > 0]
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()
카메라와 동영상 처리하기 1 (0) | 2021.05.12 |
---|---|
OpenCV 그리기 함수 (0) | 2021.05.12 |
영상의 속성과 픽셀 값 참조 (0) | 2021.05.12 |
Matplotlib 사용하여 영상 출력하기 (0) | 2021.05.12 |
OpenCV 주요 함수 설명 (0) | 2021.05.12 |
댓글 영역