Google Colaboratory에서 PIL로 뭔가를 그려서 표시

TL;DR



Google Colaboratory에서 뭔가 그려서 표시하려면 IPython.display.display를 사용하는 것이 좋습니다.

소개



Google Colaboratory에서 무언가 이미지를 그려서 표시하는 것은 의외로 번거로웠습니다. 그 방법을 몇 가지 소개한다.

PIL로 이미지 그리기



우선, 뭔가 그림을 그린다. 개인적으로는 Cairo에 익숙하기 때문에 pycairo를 사용하고 싶지만, Google Colab상에서는 pycairo가 들어가지 않는다. import cairo 그러면 안된다고 하고, !pip install pycairo 그러면 실패한다. 원래 Cairo의 라이브러리가 들어 있지 않은 것 같다. 그래서 PIL을 사용합니다.
from PIL import Image, ImageDraw
im = Image.new("RGB", (256,256))
draw = ImageDraw.Draw(im)
draw.ellipse((64,64,192,192),fill=(255,0,0))

이제 이미지에 흑자에 빨간색 원이 그려졌을 것이다. 다음은 셀의 실행 결과이지만 실행 결과 인 이미지는 표시되지 않습니다. im 에 저장되었을 뿐이다.



어떻게 든 그것을 표시합시다는 것이 본고의 목적이다.

제안 1: matplotlib+numpy 사용



먼저 이미지 데이터를 numpy 배열로 변환하고 matplotlib의 pyplot.imshow를 사용하는 방법이 있습니다.
import matplotlib.pyplot as plt
import numpy as np
plt.imshow(np.array(im))



일단 표시되는데, 불필요한 축이 있거나 한다.

(2021년 4월 9일 추가)

지금 같은 일을 하면 축이 표시되지 않는 것 같습니다. 어딘가에서 기본 설정이 바뀌 었습니까?



방안 2: 버퍼에 토하고 IPython.display.Image 로 표시



한 번 io.BytesIO로 만든 버퍼에 저장하고 버퍼를 IPython.display.Image로 표시합니다.
import io
buf = io.BytesIO()
im.save(buf,"PNG")
data = buf.getvalue()
IPython.display.Image(data)

PIL의 Image.save는, 파일명을 지정하는 경우는 타입을 자동 판별해 줍니다만, 버퍼에 토할 때에는 타입을 명시하지 않으면 안 되는 것에 주의. 실행하면 이렇게 된다.



불필요한 축 등이 표시되지 않고 이미지가 그대로 표시되기 때문에 좋은 느낌이다.

방안 3 : 한 번 파일에 토하고 IPython.display.Image로 표시



앞의 예에서는 한 번 버퍼에 뱉어 getvalue() 로 원시 데이터를 취득하고, 그것을 IPython.display.Image 에 먹이게 했다. 그렇다면 한 번 파일에 토해 버리는 것이 편한 생각도 한다.
import IPython
im.save("test.png")
IPython.display.Image("test.png")



요약



Google Colab에서 '그림하기'를 하는 것은 의외로 번거롭다. 3가지 방법을 소개했지만, 개인적으로는 파일에 토해버려 표시하는 방법이 제일 편하다고 생각한다. 그렇기 때문에, Google Colab상에서 「그림」을 하는 샘플은 이런 느낌이 된다.
from PIL import Image, ImageDraw
import IPython
im = Image.new("RGB", (256,256))
draw = ImageDraw.Draw(im)
draw.ellipse((64,64,192,192),fill=(255,0,0))
im.save("test.png")
IPython.display.Image("test.png")

Google Colab의 실행 결과는 이런 느낌.



import도 최저한이고, 이것이 제일 편하지 않을까.

제안 4: IPython.display.display 사용(2019년 10월 1일 추가)


IPython.display 에는 display 라는 함수가 있어, 그것은 이미지를 그대로 표시할 수 있는 것을 나중에 알았다.
from IPython.display import display
display(im)



이것이 가장 쉽습니다.

안5: (2020년 11월 26일 추가)



코멘트란에서의 지적대로, 셀로 PIL.Image.Image 를 그대로 평가해 버리는 것이 보다 편하네요.
from PIL import Image, ImageDraw
im = Image.new("RGB", (256,256))
draw = ImageDraw.Draw(im)
draw.ellipse((64,64,192,192),fill=(255,0,0))
im



참고로 한 사이트


  • jupyter notebook에서 이미지를 표시하고 싶다면 IPython.display 모듈의 메소드를 사용하십시오.
  • Jupyter에서 PIL 이미지 보기
  • IPython Notebook + cairo로 그리기
  • 좋은 웹페이지 즐겨찾기