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

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

ただいまの
回答率

90.75%

  • Python 2.7

    1203questions

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

  • NumPy

    374questions

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

  • Matplotlib

    250questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 167

py-python

score 5

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')
ここでエラーを起こしているみたいです。
エラーを解消するにはどのようにすればいいでしょうか?
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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


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

 追記

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

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

import numpy as np
import matplotlib.cm as cm
from matplotlib.colors import Normalize
from PIL import Image

pil_img = Image.open("img.tif")  # PIL.Imageで読む。ファイル名は変えました
img_array = np.asarray(pil_img)  # arrayに変換

norm = Normalize(vmin=0, vmax=6)  # matplotlibのnormは使う。参照:https://matplotlib.org/users/colormapnorms.html
img_converted = cm.Paired(norm(img_array))*255  # matplotlibのcm.Pairedは使う。値のスケールが0~1なので0~255に変換
out_img = Image.fromarray(np.uint8(img_converted))  # ここでplt.imshow使うのもなんなのでそのままPIL.Imageで処理することにした
out_img.save("out_img.png")  # 出力

結果

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/21 19:00

    ありがとうございます。
    URL先に元データがありますので,よろしくお願いします。
    http://fast-uploader.com/file/7082452242141/

    キャンセル

  • 2018/05/21 19:34

    追記しました

    キャンセル

  • 2018/05/23 14:03

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 2.7

    1203questions

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

  • NumPy

    374questions

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

  • Matplotlib

    250questions

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