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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

2813閲覧

pythonのpandasでpngデータの画素配列を読み込みたい

kku6

総合スコア47

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/01/09 05:38

編集2018/01/09 06:10

###前提・実現したいこと
png画像を読み込んで画素値の配列を作成したいのですが、思うように出来ずご助力いただきたいです。png画像は全て228×228で、所定のフォルダに10枚入っています。現在は下記のように読み込もうとしています。

files = glob.glob("C:\images\*.png") dataset = [] for file in files: img = cv2.imread(file) img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) array = [] for height in range(228): for width in range(228): array.append(img_gray[height][width]) dataset.append(array) df = pd.Series(dataset)

理想としては10×51984の行列を作りたいのですが、これだとおかしな形になります。
(df.shapeで形を確認すると、(51984,)という形になっているようです。)
この後、

df.to_csv('xxx.txt', index=False, header=False, sep=" ")

でtxt形式で画素値の配列を保存したいと考えています。

202 195 184 ... 17 0 0 208 207 204 ... 12 4 0 ... ... ... 25 25 25 25 25... 100

のような、画素値だけが並んだtxtファイルにしたいです。
現時点では元の2次元配列が出来ていないので、保存も思うようにできていないです。

png画像を順次読み込んでいる部分はうまくいっていると考えています。append以降が良くないっぽい事は分かるのですが、どのように直したらいいかが分かりません。
flatten()関数も使ってみましたが、何故かtxtにしたら途中が短縮された、

"[202 195 184 ..., 17 0 0]" "[208 207 204 ..., 12 4 0]"

という形で出てきました。謎です。"[などの部品も消えてほしいのですが、出てきてしまいました。
解決策を教えていただけますと幸いです。
よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

こんな感じでどうでしょうか。

Python

1import glob 2import cv2 3import pandas as pd 4 5files = glob.glob("images/*.png") 6 7df = pd.DataFrame() 8for file in files: 9 img = cv2.imread(file) 10 img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 11 print(pd.Series(img_gray.flatten())) 12 df = df.append(pd.Series(img_gray.flatten()), ignore_index=True) 13print(df) 14 15df.to_csv('out.txt', header=False, index=False, sep=' ')

画像データの1次元化は flatten()が使えますので、最初に空のDataFrameを作成しておき、そこに 一次元化(flatten())してSeries型に変換したデータを順次append() していくことでDataFrameを生成できます。

最後に textデータ化に関してですが、headerindexFalseに設定して、to_csv() を行うと良いかと思います。

投稿2018/01/09 06:50

magichan

総合スコア15898

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

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

magichan

2018/01/09 06:51

あっ既に解決済みになってますね。スミマセン
guest

0

ベストアンサー

pd.Seriesではなくpd.DataFrameにより行列データにすることで目的のCSVができます。

Python

1# 略 2#df = pd.Series(dataset) 3df = pd.DataFrame(dataset) 4#print(df) 5df.to_csv('xxx.txt', index=False, header=False, sep=" ")

なお

Python

1 array = [] 2 for height in range(228): 3 for width in range(228): 4 array.append(img_gray[height][width]) 5 dataset.append(array)

の部分は

Python

1 dataset.append( img_gray.flatten().tolist())

のようにflattenしてlistにすることで同じ結果が得られます。

投稿2018/01/09 06:39

can110

総合スコア38233

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

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

kku6

2018/01/09 06:47

無事にできました!ありがとうございます! DataFrameについてはもう少しよく調べてみます。 また、縦と横を取り出している汚いプログラム部分も見ていただきありがとうございます。 自分でも汚いことは分かっていたのですが、愚直な方法以外が分からず、ひとまず保留しておりました。大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問