- 영상(Image) = 픽셀이 바둑판 모양의 격자에 나열되어 있는 형태인 데이터.
픽셀(Pixel : Picture Element)은 화소라고도 하며 영상을 이루는 가장 기본적인 단위입니다. 여기에서 영상은 하나의 이미지를 뜻하며 여러 영상을 연속적으로 재생하는 것을 동영상이라고 합니다.
2-(1) 영상의 표현 방법
영상은 여러 픽셀의 집합으로 이루어져 있습니다. 이 픽셀에 담겨있는 정보는 '수'를 이용하여 나타내고 픽셀의 집합인 영상은 '수'의 나열로 표현할 수 있습니다. 그래서 이를 표현하기 위한 적절한 수학적 개념인 텐서(Tensor)를 이용하여 영상을 표현하게 됩니다. 상황에 따라서 표현하고자 하는 영상의 정보 종류수는 다양하므로 상황에 따라서 영상의 텐서 차원은 달라지게 됩니다. 기본적인 영상과 관련된 정보는 다음과 같습니다.
이미지 | |
: 4종류의 정보를 담고 있는 4차 텐서(4-tensor)의 영상은 다음과 같이 표현합니다. 이미지 차원 = N x H x W x C N = 이미지 개수 H = 이미지 가로 픽셀수 W = 이미지 세로 픽셀수 C = 이미지 채널수 |
|
<흑백 이미지> mnist 데이터셋을 예로 들면... N = 60,000장 H = 28 W = 28 C = 1 (흑백이라 밝기로만 표현가능) |
<컬러 이미지> 1920 x 1080 고해상도 사진을 예로 들면… N = 1장 H = 1920 W = 1080 C = 3 (RGB 3장의 컬러를 겹쳐서 표현함) |
위 영상을 텐서로 표기할 때에는 2가지 방법이 있습니다.
영상 데이터 자체는 텐서 행렬로 표현하기 때문에 보통 원소 우선 표기법 (H×W×C)을 사용하여 표현합니다. 반면 영상을 인공지능 모델이 처리할 때는 채널 우선 표기법 (C×W×H)을 사용하여 연산하는 것이 효율적이므로 영상을 처리할 때 순서를 바꾸어주어야 합니다.
2-(2) 영상 데이터의 크기
영상을 픽셀로 나타낼 때는 가로 픽셀, 세로 픽셀 순으로 표현하고, 이를 텐서 행렬로 표현할 때는 행(세로), 열(가로) 순으로 표현하므로 순서가 반대임에 유의해야 합니다.
- 흑백 영상 : (가로 크기) X (세로 크기) Bytes
- 컬러 영상 : (가로 크기) X (세로 크기) X 3(채널크기) Bytes
픽셀 하나가 차지하는 정보의 크기는 1Bytes이므로 흑백 사진과 컬러 사진의 메모리 크기는 다음과 같습니다.
2-(3) 흑백 영상
- 흑백 영상(Grayscale Image) = 색상 정보가 없이 오직 밝기 정보만으로 구성된 영상.
흑백 영상의 픽셀 1개에 담겨있는 정보는 밝기 정보입니다. 밝기는 정도에 따라서 0 ~ 255 사이의 정수로 표현합니다.
아래와 같은 흑백 영상을 픽셀 단위로 각 픽셀에 부여된 밝기 정보를 살펴보면 다음과 같이 구성되어 있습니다.
2-(4) 컬러 영상
- 컬러 영상(Truecolor Image) = 색상 정보를 가지고 있어서 다양한 색상을 표현할 수 있는 영상.
컬러 영상은 흑백 영상과 다르게 색 정보를 가지고 있습니다. 색의 종류는 영상의 채널을 뜻하는데 Red, Green, Blue 3가지 색의 채널에 해당하는 3장의 이미지를 겹쳐서 하나의 컬러 이미지를 만들어 냅니다. 각 색의 채널은 흑백 영상과 동일하게 픽셀 1개에 256단계의 밝기 정보를 포함하고 있습니다. 결국 픽셀 1개로 표현할 수 있는 색은 Red 256 밝기, Green 밝기, Blue 밝기의 조합이므로 256의 3제곱인 16,777,216개 입니다. 아래와 같은 컬러 영상에서 픽셀 값 분포를 보면 다음과 같습니다.
2-(5) 컬러 이미지의 RGB 채널
Upload Color Image
from google.colab import files
upload = files.upload()
Saving Lenna.png to Lenna (1).png
Print Image
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.image import imread
img = imread('Lenna.png')
print(img.shape)
plt.imshow(img)
red = img
green = img.copy()
blue = img.copy()
(512, 512, 3)

- 필요한 각종 라이브러리와 함수를 불러옵니다.
- numpy : 행렬 연산을 위한 라이브러리.
- matplotlib : 처리한 데이터를 시각화하기 위한 라이브러리.
- matplotlib.image : 이미지를 처리하기 위한 미니 라이브러리.
- Lenna 이미지를 불러와서 형태 확인과 채널에 따른 이미지를 생성합니다.
- img : Lenna 컬러 이미지.
- img에 저장된 Lenna 컬러 이미지의 shape를 확인해보니 가로 픽셀(512 Pixel), 세로 픽셀(512 Pixel), 채널 3개(Red, Green, Blue)로 이루어져 있습니다.
- pyplot 라는 미니 라이브러리의 imshow() 함수를 통해서 이미지를 출력합니다.
- red : Lenna 채널3 컬러 이미지
- green : Lenna 채널3 컬러 복사 이미지
- Blue : Lenna 채널3 컬러 복사 이미지
Print Red Channel
red = img
red[:,:,1] = 0
red[:,:,2] = 0
plt.imshow(red)
- red에 저장되어 있는 컬러 이미지는 3차원 array 데이터로 저장되어 있습니다.
- red 이미지 array의 채널 차원에서 두번째 인덱스(index = 1, Green)를 0으로 만들어 제거합니다.
- red 이미지 array의 채널 차원에서 세번째 인덱스(index = 2, Blue)를 0으로 만들어 제거합니다.
Print Green Channel
green[:,:,0] = 0
green[:,:,2] = 0
plt.imshow(green)
- green에 저장되어 있는 컬러 이미지는 3차원 array 데이터로 저장되어 있습니다.
- green 이미지 array의 채널 차원에서 첫번째 인덱스(index = 0, Red)를 0으로 만들어 제거합니다.
- green 이미지 array의 채널 차원에서 세번째 인덱스(index = 2, Blue)를 0으로 만들어 제거합니다.
Print Blue Channel
blue[:,:,0] = 0
blue[:,:,1] = 0
plt.imshow(blue)
- blue에 저장되어 있는 컬러 이미지는 3차원 array 데이터로 저장되어 있습니다.
- blue 이미지 array의 채널 차원에서 첫번째 인덱스(index = 0, Red)를 0으로 만들어 제거합니다.
- blue 이미지 array의 채널 차원에서 두번째 인덱스(index = 1, green)를 0으로 만들어 제거합니다.
2-(6) 영상 파일 형식
종류 | 특징 |
BMP | • 픽셀 데이터를 압축하지 않고 그대로 저장함. • 파일 용량이 큰 편임. • 파일 구조가 단순해서 별도의 라이브러리 도움 없이 파일 입출력 프로그래밍이 가능함. |
JPG | • 주로 사진과 같은 컬러 영상을 저장함. • 손실 압축을 하므로 픽셀의 변화가 생김. • 압축률이 좋아서 파일 용량이 크게 감소함. |
GIF | • 256 색상 이하의 영상을 저장함. • 일반 사진을 저장 시 화질 열화가 심함. • 무손실 압축을 하며 움직이는 GIF를 지원함. |
PNG | • Portable Network Graphics • 무손실 압축을 함. • 알파 채널(투명도)을 지원함. |
*참고 : OpenCV를 활용한 컴퓨터 비전과 딥러닝
'Fields Applied with AI > 컴퓨터 비전 Computer Vision' 카테고리의 다른 글
Ⅰ. 컴퓨터 비전 기초 (6. 동영상이란?) (0) | 2022.02.27 |
---|---|
Ⅰ. 컴퓨터 비전 기초 (5. 마스크 연산과 ROI) (0) | 2022.02.25 |
Ⅰ. 컴퓨터 비전 기초 (4. 영상의 생성, 복사, 추출) (0) | 2022.02.24 |
Ⅰ. 컴퓨터 비전 기초 (3. 영상의 속성) (0) | 2022.02.24 |
Ⅰ. 컴퓨터 비전 기초 (1. 컴퓨터 비전이란?) (0) | 2022.02.19 |