3-(1) 영상의 여러 가지 속성
영상 데이터는 수의 나열인 텐서라는 수학적 개념으로 표현한다고 했습니다. 그래서 텐서를 다루기 위한 Numpy 라이브러리를 사용하며 영상 데이터는 Numpy의 array라는 형태로 표현되고 다뤄집니다. 다음의 예를 통해 영상 데이터의 속성을 살펴보겠습니다.
import cv2
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
- img1과 img2는 numpy.ndarray 입니다.
- ndim : 차원수, len(img.shape)과 같음.
- shape : 각 차원의 크기. 흑백 영상(h,w) 또는 컬러 영상(h,w,3)
- size : 전체 원소 개수
- dtype : 원소의 데이터 타임. (영상 데이터 = uint8)
- 영상 데이터는 numpy의 자료형 중에 uint8에 해당합니다. uint8에서 u는 ~없다를 뜻하며 int는 정수, 8은 비트를 뜻합니다. 그러므로 영상 데이터의 원소는 8비트의 부호없는 정수를 뜻합니다.
3-(2) 영상의 픽셀 값 참조 예제
Upload Color Image
from google.colab import files
upload = files.upload()
Saving cat.bmp to cat.bmp
Print Image Property
import cv2
import matplotlib.pyplot as plt
from google.colab.patches import cv2_imshow
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)
img3 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)
print('type(img1):', type(img1))
print('img1.shape:', img1.shape)
print('img2.shape:', img2.shape)
print('img2.dtype:', img2.dtype)
type(img1): <class 'numpy.ndarray'>
img1.shape: (480, 640)
img2.shape: (480, 640, 3)
img2.dtype: uint8
- cv2 : 영상을 처리하기 위한 라이브러리.
- matplotlib : 시각화를 위한 라이브러리.
- Google colab에서 OpenCV를 사용할 때 cv.imshow 함수를 그대로 지원하지 않습니다. 그래서 코랩의 patches라는 라이브러리의 cv2_imshow 함수를 import해서 cv2_imshow 함수를 사용해야 출력이 됩니다.
- img1 : 흑백 영상으로 불러온 cat 이미지
- img2 : 컬러 영상으로 불러온 cat 이미지
- img3 : 영상 img2의 픽셀값의 순서를 RGB 순서로 바꿔서 저장한 cat 이미지
- OpenCV에서 컬러 영상을 불러올 때 픽셀값은 BGR 순서로 불러옵니다. 때문에 matplotlib을 사용하여 이미지를 출력하기 위해서 cv2.cvtcolor 함수를 사용하여 RGB 순서로 바꿔줘야 합니다.
Print Image Size
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')
img2 size: 640 x 480
img1 is a grayscale image
- 컬러 영상인 img2의 shape는 행(index = 0), 열(index = 1), 채널(index = 2)로 구성되어 있고, shape[:2]는 shape[0]인 행과 shape[1]인 열을 의미합니다. 각 요소는 h와 w에 저장합니다.
- 출력할 때 h와 w의 순서를 반대로 포맷하여 출력합니다.
- 만약 img1의 shape의 길이가 2일 때 다시 말해 img1의 차원이 행, 열 2개의 차원이라면 흑백 영상이라고 출력합니다.
- 만약 img1의 shape의 길이가 3, img1의 차원이 행, 열, 채널 3개의 차원이라면 트루컬러 영상이라고 출력합니다.
Change Pixel Value
img1[:,:] = 100
img2[:,:] = (0, 0, 255)
img3[:,:] = (0, 0, 255)
cv2_imshow(img1)
cv2_imshow(img2)
plt.imshow(img3)
- 영상 데이터는 텐서 array로 표현될 때 '원소 우선 표기법'을 사용합니다.
- img1의 모든 행과 모든 열의 인덱스의 픽셀값(밝기)을 100으로 수정합니다.
- img2의 모든 행과 모든 열의 인덱스의 픽셀값(밝기)을 blue = 0, green = 0, red = 255로 수정합니다. 여기에서 OpenCV를 이용하여 이미지를 불러왔기 때문에 BGR 순서로 픽셀값이 저장되어 빨간색으로 수정됩니다.
- img3은 img2의 픽셀값 순서를 반대로 저장했기 때문에 RGB 순서로 되어 있으며 모든 행과 모든 열의 인덱스의 픽셀값(밝기)을 red = 0, green = 0, blue = 255로 수정합니다.
*참고 : OpenCV를 활용한 컴퓨터 비전과 딥러닝
'Fields Applied with AI > 컴퓨터 비전 Computer Vision' 카테고리의 다른 글
Ⅰ. 컴퓨터 비전 기초 (6. 동영상이란?) (0) | 2022.02.27 |
---|---|
Ⅰ. 컴퓨터 비전 기초 (5. 마스크 연산과 ROI) (0) | 2022.02.25 |
Ⅰ. 컴퓨터 비전 기초 (4. 영상의 생성, 복사, 추출) (0) | 2022.02.24 |
Ⅰ. 컴퓨터 비전 기초 (2. 영상이란?) (0) | 2022.02.22 |
Ⅰ. 컴퓨터 비전 기초 (1. 컴퓨터 비전이란?) (0) | 2022.02.19 |