![]() |
ノート/python・matplotlibで扱う画像http://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2Fpython%A1%A6matplotlib%A4%C7%B0%B7%A4%A6%B2%E8%C1%FC |
![]() |
訪問者数 6299 最終更新 2016-09-08 (木) 16:42:48
"""
Simple demo of the imshow function.
"""
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
image_file = cbook.get_sample_data('ada.png')
image = plt.imread(image_file)
plt.imshow(image)
plt.savefig('myada.png')
plt.show()
問題: matplotlibの標準的な画像出力であるshowは、グラフが目的らしく、軸があったり、たとえ軸を無しにしてもキャンバスと画像の間に枠(空白)が挿入されている。画像本体のみを出力したいが、そのやり方がよくわからない。
試した方法:
# plt.subplots_adjust(left=0.0, right=1.0,bottom=0.0, top=1.0 hspace=0.0, wspace=0.0)
# plt.axis('off') # clear x- and y-axes
"""
Simple demo of the imshow function.
"""
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
image_file = cbook.get_sample_data('ada.png')
image = plt.imread(image_file)
###
plt.subplots_adjust(left=0.0, right=1.0, bottom=0.0, top=1.0, hspace=0.0, wspace=0.0)
plt.axis('off') # clear x- and y-axes
###
plt.imshow(image)
plt.savefig('myada.png')
plt.show()
まず、PILについて。 現在はPILは開発が止まっているようで、そのブランチのpillowというパッケージが開発を続けているらしい。 pip install pillow
PILの使い方の例
"""
Simple demo of the PIL image.show function.
"""
from PIL import Image
pilImg = Image.open("IMG_0107_320.png")
pilImg.show() # ImageMagickを使ってXwindow上に表示してくる
pilImg.save('mytest.png')
たとえば PILで画素を操作、保存するとき では img = Image.open("tmp.png")
# Imageからnumpy.arrayへの変換
a = np.array(img)
# numpy.arrayからImageへの変換
img2 = Image.fromarray(a)
# intに変換するときは (8ビットに変換)
img2 = Image.fromarray(np.uint8(a))
というわけで、fromarrayを使えばいい、ということなのだが、この向き(PILでファイルを読んだものをnumpyのarrayに変換した後、それをもう一度PILに戻す)はうまくゆくが、matplotlibでファイルを読んだものをfromarrayでPILのデータに変換するとエラーが起こる。
いろいろなページに、np.uint8()によって符号無し8ビット整数にせよとあるが、これだけではうまくなかった。
"""
Simple demo of the PIL image.show function.
"""
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
from PIL import Image
image_file = cbook.get_sample_data('ada.png')
image = plt.imread(image_file)
pilImg = Image.fromarray(image) # またはImage.fromarray(np.uint8(image))
pilImg.show() # ImageMagickを使ってXwindow上に表示してくる
pilImg.save('myface.png')
実行すると、fromarrayの呼び出しのところで TypeError: Cannot handle this data type となる。
fromarrayに食わせる前に、一回 asarray を食わせる必要があったらしい。 pilImg = Image.fromarray(np.uint8(np.asarray(image))) とすることによって、タイプエラーは出なくなった。
"""
Simple demo of the PIL image.show function.
"""
import matplotlib.pyplot as plt
import matplotlib.cbook as cbook
import numpy as np
from PIL import Image
image_file = cbook.get_sample_data('ada.png')
image = plt.imread(image_file)
pilImg = Image.fromarray(np.uint8(np.asarray(image))) # << ここを変更
pilImg.show() # ImageMagickを使ってXwindow上に表示してくる
pilImg.save('myface.png')
内容をよく見ると、plt.imreadで読み込んだ値は浮動小数で0から1の間であり、PILでの出力側は整数で0から255でなければならない。
plt.imreadで読み込んだ値をそのまま整数に変換しても、全部0になるので、真っ黒になるのは当然である。
そこで、この例では255倍して、値を合わせることにする。一般性を考えて、読み込んだ値の最大値を求めて、それが256になるようにすると良いかも知れない。 image = plt.imread("IMG_0107_320.png") arrayimage = np.asarray(image) scale = 256.0 / np.max(arrayimage) pilImg = Image.fromarray(np.uint8(arrayimage*scale))
最終的には、
"""
Simple demo of the pyplot + PIL.
"""
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
image = plt.imread("IMG_0107_320.png")
arrayimage = np.asarray(image)
scale = 255.0 / np.max(arrayimage)
pilImg = Image.fromarray(np.uint8(arrayimage*scale))
pilImg.show() # This displays the image on XWindow using ImageMagick
pilImg.save('output.png')
ipynbファイルをWebとしてアップして、ビューワ Jupyter Notebook Viewer で見ることができる。(nbviewerでスライド表示もできるようになった!【Jupyter】 - Qiita、 Jupyter (iPython) Notebookを使ってプレゼンテーション資料を作る方法)