해당 글은 제로베이스데이터스쿨 학습자료를 참고하여 작성되었습니다
OpenCV는 영상데이터를 numpy.ndarray
로 표현
numpy.ndarray
uint8
OpenCV 영상 데이터 자료형과 Numpy 자료형
그레이스케일 : cv2.CV_8UC1
-> numpy.uint8
컬러영상 : cv2.CV_8UC3
-> numpy.uint8
import cv2
import sys
# 영상 불러오기
img1 = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./data/cat.bmp', cv2.IMREAD_COLOR)
# 영상 속성
print('type(img1):', type(img1)) # type(img1): <class 'numpy.ndarray'>
print('img1.shape:', img1.shape) # img1.shape: (h, w)
print('img2.shape:', img2.shape) # img2.shape: (h, w, 3)
print('img2.dtype:', img2.dtype) # img2.dtype: uint8
h, w = img2.shape[:2]
print('img2 size: {} x {}'.format(w, h))
# 색상 속성
if len(img1.shape) == 2:
print('img1 is a grayscale image')
elif len(img1.shape) == 3:
print('img1 is a truecolor image')
------------------------------------------------------------
type(img1): <class 'numpy.ndarray'>
img1.shape: (480, 640)
img2.shape: (480, 640, 3)
img2.dtype: uint8
img2 size: 640 x 480
img1 is a grayscale image
img1 = cv2.imread('./data/cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('./data/cat.bmp', cv2.IMREAD_COLOR)
# for y in range(h):
# for x in range(w):
# img1[y, x] = 255
# img2[y, x] = [0, 0, 255]
img1[:, :]=255
img2[:, :]=[0, 0, 255] # (B, G, R)
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.waitKey()
cv2.destroyAllWindows()
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
numpy.uint8
numpy.empty()
: 임의의 값으로 초기화된 배열을 생성numpy.zeros()
: 0으로 초기화된 배열을 생성numpy.ones()
: 1로 초기화된 배열을 생성numpy.full()
: fill_value로 초기화된 배열을 생성import numpy as np
import cv2
# 새 영상 생성하기
img1 = np.empty((240, 320), dtype=np.uint8) # grayscale image
img2 = np.zeros((240, 320, 3), dtype=np.uint8) # color image
img3 = np.ones((240, 320), dtype=np.uint8) * 255 # white
img4 = np.full((240, 320, 3), (0, 255, 255), dtype=np.uint8) # yellow
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.imshow('img4', img4)
cv2.waitKey()
cv2.destroyAllWindows()
img1 = cv2.imread('./data/HappyFish.jpg')
img2 = img1 # img1을 참조
img3 = img1.copy() # img1을 복사
img1[:, :, :] = 255
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()
import numpy as np
import cv2
img1 = cv2.imread('./data/HappyFish.jpg')
# img.shape = (h, w)
img2 = img1[40:120, 30:150] # numpy.ndarray의 슬라이싱
img3 = img1[40:120, 30:150].copy()
img2.fill(0)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()
img = cv2.imread('./data/lenna.bmp', cv2.IMREAD_GRAYSCALE)
img_face = img[200:400, 200:400] # 얼굴 영역(관심영역, ROI)
# cv2.add(input, add_num, output)
cv2.add(img_face, 50, img_face) # 밝기 조절
cv2.circle(img_face, (100, 100), 80, 0, 2) # 원 그리기
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.CV_8UC1
타입이어야 한다cv2.copyTo(src, mask, dst=None) -> dst
cv2.CV_8UC3
cv2.CV_8U
cv2.CV_8UC3
import sys
import cv2
# 마스크 영상을 이용한 영상 합성
src = cv2.imread('./data/airplane.bmp', cv2.IMREAD_COLOR)
mask = cv2.imread('./data/mask_plane.bmp', cv2.IMREAD_GRAYSCALE)
dst = cv2.imread('./data/field.bmp', cv2.IMREAD_COLOR)
if src is None or mask is None or dst is None:
print('Image load failed!')
sys.exit()
# mask에서 값이 0이 아닌 부분을 src에서 복사해서 dst에 합성
# cv2.copyTo() 실행 시에 모든 요소의 크기가 같아야 함
cv2.copyTo(src, mask, dst)
# dst[mask > 0] = src[mask > 0]
cv2.imshow('src', src)
cv2.imshow('mask', mask)
cv2.imshow('dst', dst)
cv2.waitKey()
cv2.destroyAllWindows()
import sys
import cv2
# 알파 채널을 마스크 영상으로 이용
src = cv2.imread('./data/cat.bmp', cv2.IMREAD_COLOR)
logo = cv2.imread('./data/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[:, :, 0:3] # 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) # logo를 crop에 합성 -> crop은 src의 참조이므로 src의 수정됨
#crop[mask > 0] = logo[mask > 0]
cv2.imshow('src', src)
cv2.imshow('logo', logo)
cv2.imshow('mask', mask)
cv2.waitKey()
cv2.destroyAllWindows()