본문 바로가기
Image Processing (Python)

Image Read (이미지 불러오기)

by HanByol Jang 2021. 11. 11.
728x90

함수 설명

컴퓨터상에서 우리가 눈으로 보고 있는 이미지는 디지털 이미지로, 이는 숫자로 이루어진 데이터입니다.

이미지 = 숫자 데이터

위처럼 각각 값을 가지는 픽셀들이 촘촘히 뭉쳐서 하나의 이미지를 이루고 있는 것입니다.

 

여기서 픽셀 값은 디지털 카메라에서 촬영시 들어온 빛의 양을 나타냅니다. 그러므로 픽셀 값이 클수록 밝은 영역이고 값이 작을수록 어두운 영역을 표현하고 있습니다. 아래처럼 밝고 어두움을 나타내는 이미지를 Grayscale (회색조) 이미지라고 합니다.

 

Grayscale 이미지

 

다음으로, Color 이미지는 빛의 삼원색(빨강, 초록, 파랑)의 조합을 통해 모든 색상을 만들어냅니다. 

빛의 삼원색

즉, 우리가 보고 있는 color 이미지는 R, G, B 채널이라고 부르는 3개의 Grayscale 이미지의 합으로 이루어져있습니다. 각 채널의 값이 높을수록 해당 색을 많이 포함하고 있습니다.

 

Grayscale 이미지를 함수를 통해 불러오면 (256,256)의 단일 배열이 됩니다. 반면에 color 이미지는 (256,256,3)처럼 3 채널 배열이 생성됩니다. 그러므로 color 이미지의 각 픽셀값은 [255,0,0] (빨강), [255,255,0] (노랑) 이런식으로 3개의 값을 가지게 됩니다. 


코드 설명

python에서 이미지를 불러오는 방법은 다양합니다.

그 가운데 몇가지 방법에 대해 소개하도록 하겠습니다.

 

1. OpenCV 라이브러리

import cv2

image = cv2.imread(filename, flag)

1) filename : 이미지파일의 경로

2) flag : 파일을 읽는 방법. 보통 아래 두가지 방법을 사용합니다.

cv2.IMREAD_COLOR : 이미지 파일을 color로 읽습니다. (defalult)

cv2.IMREAD_GRAYSCALE : 이미지 파일을 grayscale로 읽습니다.

 

특이점은 OpenCV를 통해 color 이미지를 불러오면 RGB 순서가 아닌 BGR 순서로 읽어집니다. 

numpy 배열형태입니다.

 

2. Pillow 라이브러리

from PIL import Image

image = Image.open(filename)

 

numpy 배열 형태가 아니기 때문에 numpy로 변환하려면 따로 처리를해줘야합니다.

num_image = np.array(image)

 

3. Matplotlib 라이브러리

import matplotlib.pyplot as plt

image = plt.imread(filename)

 

RGB 순서로 읽어지고 numpy 배열형태입니다.

 

4. scikit-image 라이브러리

from skimage import io

image = io.imread(filename)

 

RGB 순서로 읽어지고 numpy 배열형태입니다.

 

5. ImageIO 라이브러리

import imageio

image = imageio.imread(filename)

 

RGB 순서로 읽어지고 numpy 배열형태입니다.

 

6. SimpleITK 라이브러리

import SimpleITK as sitk

image = sitk.ReadImage(filename)

 

numpy 배열 형태가 아니기 때문에 numpy로 변환하려면 따로 처리를해줘야합니다.
num_image = sitk.GetArrayFromImage(image)


예제

다양한 함수를 통해 이미지를 불러옵니다.

matplotlib 라이브러리를 사용하여 이미지를 보기 위해 모두 numpy로 변환

import cv2
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import imageio
import SimpleITK as sitk
from skimage import io

filename = 'test.jpg'

# OpenCV
image1 = cv2.imread(filename)
image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)

# Pillow
image = Image.open(filename)
image2 = np.array(image)

# Matplotlib
image3 = plt.imread(filename)

# scikit-image
image4 = io.imread(filename)

# ImageIO
image5 = imageio.imread(filename)

# SimpleITK
image = sitk.ReadImage(filename)
image6 = sitk.GetArrayFromImage(image)

# view
img_list = [image1, image2, image3, image4, image5, image6]
title_list = ['OpenCV', 'Pillow', 'Matplotlib', 'scikit-image', 'ImageIO', 'SimpleITK']

for i in range(len(img_list)):
    plt.subplot(2, 3, i+1, )
    plt.imshow(img_list[i])
    plt.title(title_list[i])
    plt.axis('off')

plt.show()

 

이미지를 잘 불러오는 것을 확인 할 수 있습니다.

728x90

'Image Processing (Python)' 카테고리의 다른 글

Flip (대칭)  (0) 2021.11.16
Sharpening (샤프닝)  (1) 2021.11.15
Invert (색반전)  (0) 2021.11.10
Zero Padding  (0) 2021.11.09
Z-Score Standardization (표준화)  (0) 2021.11.08

댓글