본문 바로가기
데이터 과학 관련 스터디/OpenCV

[Open CV] 파이썬 여러개 이미지 동시 출력

by inhovation97 2022. 3. 11.
본 글은 파이썬으로 만드는 OpenCV프로젝트 서적의 내용을 포스팅하는 내용입니다. 
3장 Matplotlib
해당 실습은 cv2 라이브러리를 이용하여 진행합니다.

1. Matplotlib의 subplot을 이용하여 여러 이미지 동시 출력

 

1. Matplotlib의 subplot을 이용하여 여러 이미지 동시 출력

 

cv2 라이브러리를 통해 이미지 읽는 방식은 이미 포스팅을 했었지만, 이미지 여러개를 동시 출력하고 싶을 때가 있습니다. 가령 segmentation이나 gan모델을 학습할 때는 epoch마다 학습 전후 이미지 2개를 동시에 출력합니다. 

이런 경우에는 matplotlib의 subplot을 이용해야하는데, 그 방식을 살펴봅니다.

 

import cv2
import matplotlib.pyplot as plt

fig = plt.figure(figsize = (10,10))
img = cv2.imread('../CV2/img/img1.png')

plt.subplot(1,2,1)
plt.imshow(img)
plt.title('result 1')
plt.xticks([])
plt.yticks([])

plt.subplot(1,2,2)
plt.imshow(img[:,:,::-1]) # BGR -> RGB
plt.title('result 2')
plt.xticks([])
plt.yticks([])
plt.show()

코드 결과

cv2.imread로 읽은 이미지를 plt 라이브러리로 imshow하려면, 주의할 점이 있습니다.

cv2는 이미지를 BGR 순으로 읽어옵니다. 

그대로 plt.imshow로 읽으면, result 1 처럼 파란 이미지로 나오기 때문에 result 2처럼 끝의 채널 순서를 바꿔줘야 합니다.

 

BGR_img = cv2.imread('../CV2/img/img1.png')
RGB_img = BGR_img[:,:,::-1]

print(BGR_img.shape, RGB_img.shape)

print( BGR_img[:,:,0] == RGB_img[:,:,2])

코드 결과

조금만 더 자세히 보면, 둘 다 H,W,C의 배열을 갖고 있습니다. C는 채널이니까 RGB 3개인 것이죠.

cv2.imread로 읽은 이미지를 [:, :, ::-1]로 채널의 순서를 반대로 바꿔주면, RGB 순서로 채널이 바뀝니다. 

마지막 코드에서 BGR_img의 0번째 채널은 B이고, RGB_img의 2번째 채널도 B이기 때문에 비교연산 하면 전부 True로 나오는 것입니다.

 

이미지를 한 번에 여러개를 출력하고 싶으면 matplotlib을 이용해야 하는데, 이 때는 RGB 순으로 바꿔줘야 한다는 점을 잊으면 안됩니다!

 

댓글