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

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

ただいまの
回答率

90.50%

  • Python 2.7

    1267questions

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

  • NumPy

    448questions

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

【Python】フォルダ内の画像ファイルを全て読み込んで,合計して平均値を出す

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,836

py-python

score 7

前提・実現したいこと

Python初心者です。
フォルダ内のtifデータを全て読み込んで,合計したものを
平均値として1つのtifデータ(3000×3000)にまとめたいのですが,コードの書き方が分かりません。
フォルダ内のtifデータが1000近くあります。
よろしくお願い申し上げます。

発生している問題・エラーメッセージ

全ファイルを読み込もうとしているのですが,何も読み込んでくれません。

該当のソースコード

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"
path1 = "/media/student/data1/test/"

#test内のtif全読み込み(3000×3000pixcel)
datalist = glob.glob(path1 + ".tif")
for data in datalist:
    with open(data, 'r') as f:

        #合計値
        sum_v = sum(f)
    #平均値
        ave = sum_v / len(path1)
        pil_img = Image.fromarray(ave)
        print "ave...ok"
        #allディレクトリで保存(avetest.tif)
        outdata = path + "/all/" + "ave" + test + ".tif"
        pil_img.save(outdata)

ここにご自身が実行したソースコードを書いてください

試したこと

シェルで試そうとしていますが,わかりません。

補足情報(言語/FW/ツール等のバージョンなど)

Python2.7.1

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/11/02 18:16

    「ave = sum_v / len(path1)」の「len(path1)」はどんな値になると意図されていますか?

    キャンセル

  • py-python

    2017/11/02 18:37

    ファイル数だと認識しています。

    キャンセル

回答 1

0

全ファイルを読み込もうとしているのですが,何も読み込んでくれません。

glob.globに与えている引数がおかしいです。

path1 = "/media/student/data1/test/"
datalist = glob.glob(path1 + ".tif")

これだと、/media/student/data1/test/.tifというファイルを見つけようとします。
次のように書けば、ワイルドカード指定をすることが出来ます。

path1 = "/media/student/data1/test/"
datalist = glob.glob(path1 + "*.tif")

フォルダ内のtifデータを全て読み込んで,合計したものを
平均値として1つのtifデータ(3000×3000)にまとめたいのですが,コードの書き方が分かりません。

ご提示のコードを見ると、もう少し冷静に考えた方がよいのではないかと思ってしまいます。

for data in datalist:
    with open(data, 'r') as f:
        # 合計値
        sum_v = sum(f)
     # 平均値
        ave = sum_v / len(path1)
        pil_img = Image.fromarray(ave)
        print "ave...ok"
        # allディレクトリで保存(avetest.tif)
        outdata = path + "/all/" + "ave" + test + ".tif"
        pil_img.save(outdata)

このコードだと、毎周『平均画像』を計算してしまいますが、それで良いのでしょうか。

一段階一段階確かめながら書いた方がいいかと思います。
特に慣れないうちは、一気に書いたプログラムが思い通りに動くことはないです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/02 18:09

    回答ありがとうございます。毎周平均画像を出すのではなくて,
    ディレクトリ内にある1000近くのtifファイルを全て読み込み,
    全積算したものを最終的に平均値として算出したいです。

    キャンセル

  • 2017/11/02 18:16

    やりたいことはなんとなくわかりますよ。
    ただ、私がここでコードを渡しても、おそらく理解できないでしょう。
    簡単なことから少しずつ試すといいんじゃないですかね。
    1. ファイル一つ一つの名前を表示する
    2. 画像の数値データを一つ一つ表示する
    3. 画像の数値データをすべて合計し、合計した結果を表示する
    4. 平均画像を計算し、数値データのまま表示する
    5. 平均画像を保存する
    最後まで出来たらタスククリアです。

    キャンセル

  • 2017/11/02 18:17

    というか、そもそもPILの機能を用いて画像を開けばいいんじゃないかとも思います。

    キャンセル

  • 2017/11/02 18:58

    そうですね,手順としては1つのファイルを読み込んでいくのはわかるのですが,
    さらに新たなファイルを追加していく過程が分かりません。大量にデータがあるに加えて,
    調べても出ていないのが手止まりしている原因です。
    時間もないのでコードを提供していただけるとありがたいです。

    キャンセル

  • 2017/11/02 19:01

    合計を計算するためのNumPyインスタンスを用意(当然初期値はオールゼロですよ)して、それに毎周画像強度を足していけばよいです。
    気を付けないとハマる点は、オーバーフローくらいでしょうか。

    キャンセル

  • 2017/11/02 19:03

    質問者さんの理解の助けになると判断してコードを示すことはありますが、先ほども申し上げたように、おそらく理解できないと思います。
    今回デッドラインを私のコードで乗り越えたとしても、次にまた詰まります。
    コードを見ても、質問追記依頼のやり取りをみても、完全に勉強不足だと思います。

    キャンセル

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

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

関連した質問

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

  • Python 2.7

    1267questions

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

  • NumPy

    448questions

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