質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

1回答

5725閲覧

【NumPy】tiffファイルからカラー付きの画像を出す

py-python

総合スコア14

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

0クリップ

投稿2018/05/21 08:51

tiffファイルから画像(.png)を保存するプログラムを作成しています。
【tiffファイル内容】
1500×3500で2次元配列となっており,0~6までの数字が
値として入っています。データ型はnp.float32です。

このファイルを画像化して,pngに画像を保存したいと考えており,
カラーはPairedで,最小値0,最大値6に色付けした画像を作成したいのです。

●コード●

import os import sys import numpy import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm import glob from PIL import Image import PIL path = "/media/student/data1" path2 = "/media/student/data1/ctype/" datalist = glob.glob(path2 + "*.tif") for data in datalist: name = data[len(path2)+2:-4] if name : print name + "..." + "OK" cloud = np.fromfile(data,dtype=np.float32) plt.imshow(cloud, cmap = 'Paired', vmin = 0, vmax = 6, extent=(130,180,0,30), interpolation='none') pil_img = Image.fromarray(np.float32(cloud)) print "cloud...ok" outdata = path + "/test/" +"ct-" +name + ".png" pil_img.save(outdata)

●エラー●

student@sh2:/media/student/data1$ python c_gazou.py 20160924-1800...OK /media/student/data1/ctype/c-20160924-1800.tif Traceback (most recent call last): File "c_gazou.py", line 27, in <module> plt.imshow(cloud, cmap = 'Paired', vmin = 0, vmax = 6, extent=(130,180,0,30), interpolation='none') File "/usr/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 3022, in imshow **kwargs) File "/usr/lib/python2.7/dist-packages/matplotlib/__init__.py", line 1814, in inner return func(ax, *args, **kwargs) File "/usr/lib/python2.7/dist-packages/matplotlib/axes/_axes.py", line 4947, in imshow im.set_data(X) File "/usr/lib/python2.7/dist-packages/matplotlib/image.py", line 453, in set_data raise TypeError("Invalid dimensions for image data") TypeError: Invalid dimensions for image data

plt.imshow(cloud, cmap = 'Paired', vmin = 0, vmax = 6, extent=(130,180,0,30), interpolation='none')
ここでエラーを起こしているみたいです。
エラーを解消するにはどのようにすればいいでしょうか?
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

np.fromfileでTIFFは直接読めないんじゃないですかね(わかりませんが)。一回PILで読み込んでから配列に変換してみてはどうでしょう?


難航するようであれば、一枚画像のサンプルを頂けると回答する側もデバッグできます。もしTIFFがteratailにそのままアップロードできなければ、アップローダか何かに上げていただければ。

追記

案の定np.fromfileは読めてませんでした(滅茶苦茶な次元数のnumpy配列になってた。逆によくエラーも吐かず読み込むものです)。

とりあえず、意図している(であろう)変換をするコードを書いてみたので、参考にしてください。

python

1import numpy as np 2import matplotlib.cm as cm 3from matplotlib.colors import Normalize 4from PIL import Image 5 6pil_img = Image.open("img.tif") # PIL.Imageで読む。ファイル名は変えました 7img_array = np.asarray(pil_img) # arrayに変換 8 9norm = Normalize(vmin=0, vmax=6) # matplotlibのnormは使う。参照:https://matplotlib.org/users/colormapnorms.html 10img_converted = cm.Paired(norm(img_array))*255 # matplotlibのcm.Pairedは使う。値のスケールが0~1なので0~255に変換 11out_img = Image.fromarray(np.uint8(img_converted)) # ここでplt.imshow使うのもなんなのでそのままPIL.Imageで処理することにした 12out_img.save("out_img.png") # 出力

結果

投稿2018/05/21 09:29

編集2018/05/21 10:34
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

py-python

2018/05/23 05:03

ありがとうございます。無事作成出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問