아래 이미지(Fig 2)를 보면 알 수 있듯이 이미지를 OpenCV(import cv2) 로 출력하면 색상이 파랗게 변한다. 색상이 바뀌는 이유와 색상 변경 없이 기존 이미지를 그대로 출력하는 방법에 대해 알아보자. 이번 실습에 사용한 데이터는 ⚡️ Kaggle ‘Pokemon Image Dataset’ 에서 다운로드해 사용하였다.


1. 라이브러리 및 이미지 파일 로드

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

import glob
import cv2
# 이미지 파일 경로 로드
paths = glob('../input/pokemon-image-dataset/images/images/*')
print(paths[:5])
['../input/pokemon-image-dataset/images/images/parasect.png',
 '../input/pokemon-image-dataset/images/images/lumineon.png',
 '../input/pokemon-image-dataset/images/images/raikou.png',
 '../input/pokemon-image-dataset/images/images/comfey.jpg',
 '../input/pokemon-image-dataset/images/images/dedenne.png']


2. 이미지 출력

파일 경로를 가지고 이미지를 출력할 땐 두 가지 방법(plt.imread, cv2.imread)이 있는데 두 가지 방법으로 이미지를 출력한 결과가 다르다(이미지 색상에 차이가 존재함).

# 1) matplotlib
plt.imshow(plt.imread(paths[0]));
Fig 1. plt.imshow(plt.imread(paths[0]));의 결과


# 2) OpenCV 
plt.imshow(cv2.imread(paths[0]));
Fig 2. plt.imshow(cv2.imread(paths[0]));의 결과


(1) OpenCV를 사용하면 이미지가 파랗게 변하는 이유

imread 함수를 사용하면 이미지를 numpy array 형식으로 읽어오는데 이때 이미지는 여러 형식(‘RGB’, ‘RGBA’, ‘L’ 등) 에 따라 (이미지 가로 크기, 이미지 세로 크기, 채널의 개수) 의 shape를 가지게 된다.
matplotlib에서 제공하는 imread 메서드를 사용하여 이미지를 넘파이 배열로 불러올 땐 기존 이미지 형식 그대로를 불러오는 반면 cv2를 사용하여 이미지를 읽을 땐 BGR 이미지 형식으로 해석한다. 그래서 파랗게 변한 이미지를 출력하는 것이다.

  • OpenCV는 BGR 이미지 형식을 사용함
  • 이미지를 cv2.imread로 읽어올 때 BGR 형식으로 해석함
  • cvtColor 메서드를 사용하여 기존 BRG 이미지를 RGB 로 변환하는 작업을 수행하면 RGB 형식의 이미지로 불러올 수 있음

즉, OpenCV를 사용하면 이미지가 파랗게 보이는 이유는 R 채널을 B 채널로 인식하고 B 채널의 값을 R 채널로 인식하기 때문이다.

(2) cvtColor 메서드 사용

img = cv2.cvtColor(cv2.imread(paths[0]), cv2.COLOR_RGB2BGR)
plt.imshow(img);
Fig 3. cvtColor 메서드를 사용한 결과


cvtColor 함수에 cv2.COLOR_RGB2BGR 인수를 전달하면 이미지의 채널을 RGB에서 BGR로 변경할 수 있다.

3. 이미지 비교

Fig 4. 왼쪽에서부터 원본 이미지, plt로 읽은 이미지, cv2로 읽은 이미지, cvtColor 함수 사용한 이미지


원본 이미지는 투명도 고려한 ‘RGBA’ 형식의 이미지이다. cvtColor를 사용하니 기존 이미지 색상이 잘 출력되는 것을 알 수 있다. 다만 cv2를 활용하면 투명을 고려하던 채널이 제외된다.


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기