파이썬 Python

matplotlib.pyplot 흑백 이미지 출력이 정상적으로 안되는 경우 (plt.imshow(), cmap)

킹남지 2021. 12. 23. 16:27
반응형

matplotlib.pyplot.imshow()로 흑백 이미지를 출력할 때 이상한 색상으로 출력되는 경우가 있습니다.

 

이미지 확인

먼저, Opencv를 통해 이미지를 불러와서 컬러 그대로 출력해보겠습니다. (Colab에서 실행한 코드입니다.)

# 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import cv2
img_1 = cv2.imread('/content/drive/MyDrive/opencv/cat.jpeg', cv2.IMREAD_COLOR) # 이미지를 [B, G, R] 순의 numpy 객체로 반환
img_rgb = cv2.cvtColor(img_1, cv2.COLOR_BGR2RGB)

plt.imshow(img_rgb)
plt.show()

 (opencv는 BGR 순으로 이미지를 불러오기 때문에) 위의 코드처럼 cv2.cvtColor()를 사용해 RGB 순으로 변경해 줍니다.

컬러 출력 결과

컬러는 이상없이 출력됩니다.

 

 

흑백 변환 후 출력 

그럼 RGB로 구성된 컬러 이미지가 아닌, 흑백 이미지로 출력해보겠습니다.

# 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import cv2
img_1 = cv2.imread('/content/drive/MyDrive/opencv/cat.jpeg', cv2.IMREAD_COLOR) # 이미지를 [B, G, R] 순의 numpy 객체로 반환
img_gray = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY) # 흑백으로 변환

plt.imshow(img_gray)
plt.show()

이번에는 cv2.cvtColor()를 사용해 BGR 형식을 GRAY로 변환해줍니다.

흑백 출력 1

기대했던 결과와는 달리 흑백이 아닌 이상한 색상 조합으로 출력됩니다.

 

 

Color map

흑백으로 변환은 완료됐으나, 이미지가 정상적으로 출력되지 않는 이유는 컬러맵을 변경해주지 않았기 때문입니다.

 

matplotlib는 아래와 같이  다양한 컬러맵을 제공합니다.

Color map

 

우리는 imshow()의 cmap 인자를 통해 출력 시 컬러맵을 설정할 수 있는데, default 값이 viridis로 지정돼 있어서 흑백 이미지를 위와 같이 출력한 것입니다.

 

 

 

흑백 출력

이제, cmap = 'gray'로 설정하고 우리가 원하는 출력 결과를 얻어봅시다.

 

# 라이브러리
import numpy as np
import matplotlib.pyplot as plt
import cv2
img_1 = cv2.imread('/content/drive/MyDrive/opencv/cat.jpeg', cv2.IMREAD_COLOR) # 이미지를 [B, G, R] 순의 numpy 객체로 반환
img_gray = cv2.cvtColor(img_1, cv2.COLOR_BGR2GRAY) # 흑백으로 변환

plt.imshow(img_gray, cmap='gray')
plt.show()

흑백 출력 2

이렇게 정상적으로 출력되는 것을 확인할 수 있습니다.

 

 

[참고자료]

[1] https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html

 

matplotlib.pyplot.imshow — Matplotlib 3.5.1 documentation

A parameter for the antigrain image resize filter (see the antigrain documentation). If filternorm is set, the filter normalizes integer values and corrects the rounding errors. It doesn't do anything with the source floating point values, it corrects only

matplotlib.org

반응형