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

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

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

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

Python 2.7

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

Q&A

1回答

1515閲覧

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

py-python

総合スコア14

NumPy

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

Python 2.7

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

0グッド

0クリップ

投稿2017/11/02 06:26

###前提・実現したいこと
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

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

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

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

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

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

can110

2017/11/02 09:16

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

2017/11/02 09:37

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

回答1

0

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

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

Python

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

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

Python

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

フォルダ内のtifデータを全て読み込んで,合計したものを

平均値として1つのtifデータ(3000×3000)にまとめたいのですが,コードの書き方が分かりません。

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

Python

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 06:38

編集2017/11/02 06:41
LouiS0616

総合スコア35660

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

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

py-python

2017/11/02 09:09

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

2017/11/02 09:16

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

2017/11/02 09:17

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

2017/11/02 09:58

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

2017/11/02 10:01

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

2017/11/02 10:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問