Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Matplotlib의 plt.show()와 OpenCV cv2.imshow()의 차이점 완벽 정리

이미지 처리 작업을 하다 보면 MatplotlibOpenCV(cv2)에서 같은 이미지가 서로 다른 색상으로 표시되는 경우를 종종 경험하게 됩니다. 그 이유는 두 라이브러리가 이미지를 읽고 화면에 표시하는 방식이 다르기 때문입니다.

cv2.imread() 메서드는 이미지를 다차원 NumPy 배열로 불러오며, 각 채널은 BGR(파랑, 초록, 빨강) 순서로 저장됩니다. 반면 Matplotlib의 image.imread()는 일반적인 RGB(빨강, 초록, 파랑) 순서를 사용합니다. 따라서 cv2로 읽은 이미지를 그대로 plt.imshow()로 출력하면 빨강과 파랑이 뒤바뀐 듯한 색상 왜곡이 나타납니다.

구현 단계

  • 그림(figure) 크기를 설정하고 서브플롯 사이 및 주변의 여백을 조정합니다.
  • 이미지 파일명을 초기화합니다.
  • nrows=1, ncols=2, index=1로 현재 그림에 첫 번째 서브플롯을 추가합니다.
  • cv2의 imread()로 이미지를 읽습니다.
  • 축(axis)을 제거하고 이미지를 표시한 뒤 제목을 붙입니다.
  • nrows=1, ncols=2, index=2로 두 번째 서브플롯을 추가합니다.
  • plt(matplotlib.image)의 imread()로 동일한 이미지를 읽습니다.
  • 축을 제거하고 이미지를 표시한 뒤 제목을 붙입니다.
  • show() 메서드를 호출하여 전체 그림을 화면에 출력합니다.

예제 코드

import cv2
from matplotlib import pyplot as plt, image

plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True

filename = "bird.jpg"

# cv2로 이미지 읽기 (BGR 순서)
plt.subplot(121)
img = cv2.imread(filename)
plt.axis("off")
plt.imshow(img)
plt.title("with cv2")

# matplotlib으로 이미지 읽기 (RGB 순서)
plt.subplot(122)
img = image.imread(filename)
plt.axis("off")
plt.imshow(img)
plt.title("with plt")

plt.show()

실행 결과

아래 출력에서 확인할 수 있듯이, cv2로 읽은 이미지(왼쪽)는 채널 순서가 달라 색상이 뒤바뀌어 표시되고, matplotlib으로 읽은 이미지(오른쪽)는 원래 색상 그대로 자연스럽게 표시됩니다.

Matplotlib의 plt.show()와 OpenCV cv2.imshow()의 차이점 완벽 정리

색상 왜곡 해결 방법

cv2로 읽은 이미지를 Matplotlib에서 올바른 색상으로 표시하려면 채널 순서를 BGR에서 RGB로 변환해 주어야 합니다.

img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()

이처럼 두 라이브러리의 채널 순서 차이만 이해하면, 상황에 맞게 변환 함수를 활용하여 어느 환경에서도 이미지를 정확하게 표시할 수 있습니다.