영상의 속성과 픽셀 값 참조
OpenCV는 영상 데이터를 numpy.ndarray로 표현
import cv2
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
numpy.ndarray
- ndim : 차원 수
- shape : 각 차원의 크기
- 그레이스케일 : (h, w) - 컬러 : (h, w, 3) - size : 전체 원소 개수
- dtype : 원소의 데이터 타입. 영상 데이터는 unit8
OpenCV 영상 데이터 자료형과 NumPy 자료형
OpenCV 자료형 (1채널) | NumPy 자료형 | 구분 |
cv2.CV_8U | numpy.uint8 | 8비트 부호없는 정수 |
cv2.CV_8S | numpy.int8 | 8비트 부호있는 정수 |
cv2.CV_16U | numpy.uint16 | 16비트 부호없는 정수 |
cv2.CV_16S | numpy.int16 | 16비트 부호있는 정수 |
cv2.CV_32S | numpy.int32 | 32비트 부호있는 정수 |
cv2.CV_32F | numpy.float32 | 32비트 부동소수형 |
cv2.CV_64F | numpy.float64 | 64비트 부동소수형 |
cv2.CV_16F | numpy.float16 | 16비트 부동소수형 |
- 그레이스케일 영상 : cv2.CV_8UC1 ⇨ numpy.uint8, shape = (h, w)
- 컬러 영상 : cv2.CV_8UC3 ⇨ numpy.uint8, shape = (h, w, 3)
✔︎ 영상의 속성 참조
import sys
import cv2
# 영상 불러오기
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
if img1 is None or img2 is None:
print('Image load failed!')
sys.exit()
# 영상의 속성 참조
print('type(img1):', type(img1))
print('img1.shape:', img1.shape)
print('img2.shape:', img2.shape)
print('img1.dtype:', img1.dtype)
# 영상의 크기 참조
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')
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.waitKey()
✔︎ 영상의 픽셀 값 참조
# 영상의 픽셀 값 참조 (사용하지 않음)
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)
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
- shape : 각 차원의 크기. (h, w) 또는 (h, w, 3)
- dtype : 원소의 데이터 타입. 일반적인 영상이면 numpy.uint8
- arr : 생성된 영상(numpy.ndarray)
- 참고사항
- 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 # dark gray
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('HappyFish.jpg')
img2 = img1
img3 = img1.copy()
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()
# 영상 복사
img1 = cv2.imread('HappyFish.jpg')
img2 = img1
img3 = img1.copy()
img1.fill(255)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)
cv2.waitKey()
cv2.destroyAllWindows()
✔︎ 부분 영상 추출
# 부분 영상 추출
img1 = cv2.imread('HappyFish.jpg')
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()
'OpenCV' 카테고리의 다른 글
[OpenCV] 기초 5 : 키보드 이벤트/ 마우스 이벤트 (0) | 2022.01.30 |
---|---|
[OpenCV] 기초 4 : 카메라와 동영상 처리 (0) | 2022.01.30 |
[OpenCV] 기초 3 : 마스크 / 그리기 함수 (0) | 2022.01.30 |
[OpenCV] 기초 1 : 주요 함수 (0) | 2022.01.30 |
OpenCV 란? (1) | 2022.01.30 |